tgindex

Node Master

описание

Group Chat: @nodemastergp Admin: @napoleon_n1

1 022
подписчиков
Охват к подписчикам
144,8%
ERR
Реакции к просмотрам
0,86%
323 на 25 постов
Пересылки к просмотрам
0,73%
272
Постов в день
0,0
всего 25

Где отзываются чаще

доля реакций к просмотрам
  • 2 авг.درود به همگی. براتون آرزو شادی دارم. همینطور که میدونید مدت زیادی هست این چنل تبدیل شده به چنل ارواح و فعالیت خاصی ندارم. یکی از دلایل وضعیت AI و تغییراتی که به صورت نهادین با این اکوسیستم انجام داده هست و سردرگمی که خیلی از ما ممکنه داشته باشیم. پیشنهاد میکنم این پست رو بخونید و نظرتون بگین. این حاصل مشاهده و فکر کردن و حرف زدن با تعداد زیادی از دوستان برنامه نویسی هست که همه از قبل از دوران AI کار میکردن و حرفه ای بودن و البته نظر شخصی خودم. https://telegra.ph/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D9%85%D9%86-%D8%A7%D8%B2-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-AI-%D9%88-%D9%86%DA%AF%D8%A7%D9%87%DB%8C-%D8%A8%D9%87-%D8%A2%DB%8C%D9%86%D8%AF%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-08-022,34%
  • 7 апр.گر چرخ گردون گر دو روزی بر مراد ما نرفت دائما یکسان نباشد حال دوران غم مخور1,67%
  • 7 июл.Mikro-Orm❤️1,58%
  • 28 июн.درود به همگی دوستان. امیدوارم حالتون خوب باشه. باتوجه به این که خیلی وقت هست چیزی ننوشتم واقعا نمیدونم باید از کجا شروع کرد. حدود یک سال پیش با یکی از دوستانم داشتیم بحث های تکنیکال میکردیم و اشتراک تجربه که بهم کنفرانس JavaOne رو معرفی کرد. چندین ویدیو از مجموعه ای که از سال 2025 اومد رو دیدم و واقعا جذاب بود. یه نکته ای که درمورد این کنفرانس نظرم رو جلب کرد این هست که همیشه از تمامی hype هایی که اتفاق میافته فاصله خیلی زیادی داره. معمولا آدم هایی که در این کنفرانس صحبت میکنن آدم های بسیار با تجربه ای هستن و کلا همه هم با میانگین سنی بالا و تجربه کار روی code base های خیلی بزرگ. نکته جالبی که در کنفرانس 2026 دارم میبینیم این هست که با توجه به این که همه در حال حاظر درمورد AI و تغییراتش حرف میزنن. تا الان حرف خیلی خاصی درمورد AI زده نشده و بیشتر روند مثل قدیم روی نکات برنامه نویسی و تکنیک های خاص هست. باتوجه به 1 سال اخیر و سرعت پیشرفت AI خیلی برام جالب هست که در JavaOne خیلی حرفی از AI زده نمیشه. البته این موضوع که اکوسیستم Java کلا نسبت به تغییرات خیلی مقاومت میکنه هم بدون تاثیر نیست. زاویه دید من معمولا به talk های که به محوریت Java بوده همیشه به این شکل بوده که نمایی از بازار کار واقعی به دور از هر هایپی رو نشون میداد. حالا که آیا هنوز هم این شکل باشه یا نباشه رو نمیدونم. موضوع بعدی که دوست دارم بگم این که شخصا همیشه و همیشه هروقت وارد بحث مهندسی نرم افزار و دیزاین شدم آخرش رسیدم به Java. فارغ از stack که کار میکنید همیشه یک چیزی داره که براتون ارزشمند باشه واقعا پیشنهاد میکنم ببینید https://www.youtube.com/playlist?list=PLX8CzqL3ArzUMVSzm-z_-if8BIB55EGl4 https://www.youtube.com/watch?v=eLSkvNHgrRI&list=PLX8CzqL3ArzVV1xRJkRbcM2tOgVwytJAi&index=32&pp=iAQB1,57%
  • 7 июн. 2025 г.без подписи1,51%
  • 7 сент. 2025 г.سلام و درود دوستان امیدوارم حالتون خوب باشه. یک نکته ای که همیشه در پروژه ها میبینم چه در پروژه های Front و چه در پروژه های Backend وقتی با یک HTTP Request کار میکنیم اکثرا URL ها رو به صورت Hardcode میبینیم و اگر پارامتری هم نیاز داشته باشه در نهایت با استفاده از #JavaScript Template Literal کارمون رو پیش میبریم. به صورت کلی استفاده کردن از Template Literal هیچ مشکلی نداره و کارمون راه میندازه ولی گاهی اوقات ممکنه کمی برامون دردسر ایجاد کنه. برای درک این موضوع به مثال زیر توجه کنید. import process from "node:process"; const BASE_URL = process.env.BASE_URL; const url = `${BASE_URL}/posts/1`; fetch(url); در اینجا همه چی اوکی کار میکنه مشکلی نیست ولی یک نکته که باید توجه کنیم این هست که حتما BASE_URL ما "/" اضافه نداشته باشد. https://jsonplaceholder.typicode.com/ ❌ https://jsonplaceholder.typicode.com ✅ به صورت کلی مسئله خیلی بزرگی نیست ولی همین نکته کوچیک داخل code base که بهش آشنایی ندارید ممکنه ساعت ها ازتون زمان بگیره تا پیداش کنیم. خب حالا سوال پیش میاد که راه حل برای این موضوع چی هست؟ برای حل این موضوع میتونید از URL Web API استفاده کنید. به عنوان مثال اگر کد بالا را بخواهیم Refactor کنیم به این صورت خیلی کارمون تمیز تر و راحت تر میشه و دیگه همچین چیزی رو نمیبینیم. import process from "node:process"; import { URL } from "node:url"; const url = new URL(process.env.BASE_URL); const path = "/posts/1"; url.pathname = path; fetch(url.href); باتوجه به این که داریم از Web API استفاده میکنیم داخل تمامی Runtime ها به راحتی میتونیم از این API استفاده کنیم و همشون هم به همین شکل کار میکنن. حالا گاهی اوقات میخوایم querystring مثل زیر داشته باشیم /post?userId=1&tag=nodejs دوباره استفاده از Template literal هیچ ایرادی نداره کارمون راه میندازه ولی اگر بخواهیم این رو هم تمیز تر کنیم که در آینده کارمون راحت تر باشه و کد تمیز تری داشته باشیم چطور؟ برای این کار هم میتونیم از سه روش کارمون رو پیش ببریم 1. استفاده از node:querystring که این module فقط استاندارد #NodeJS هست. 2. استفاده از URLSearchParams Web API که باتوجه به این که Web API هست قطعا همه جا پشتیبانی میشه. 3. استفاده از راه حل دوم به صورت غیر مستقیم با استفاده از searchParams property مربوط به URL. حالا اگر بخواهیم مثال بالا رو Refactor کنیم و همچین چیزی رو اضاف کنیم به این صورت عمل میکنیم. import process from "node:process"; import { URL } from "node:url"; import querystring from "node:querystring"; const url = new URL(process.env.BASE_URL); const query = { userId: 1, tag: "NodeMaster" }; // #1 Using querystring module from NodeJS const path = "/posts"; url.pathname = path; url.search = querystring.stringify(query); // #2 Using URLSearchParams url.pathname = "/posts"; url.search = new URLSearchParams(query).toString(); // #3 Using searchParams property of URL instance url.pathname = "/posts"; url.searchParams.append("userId", "1"); url.searchParams.append("tag", "NodeMaster"); // fetch(url.href); در نگاه اول ممکنه خیلی نکته بزرگی به نظر نیاد ولی داخل code base های بزرگ که با کلی API 3rd party کار میکنید میتونه فرشته نجات باشه.1,47%
  • 3 окт. 2024 г.без подписи1,43%
  • 20 сент. 2025 г.درود رفقا امیدوارم حالتون خوب باشه. بلاخره تلسم رو شکوندم بعد از چند ماه این ویدیو رو گرفتم. در این ویدیو باهم یاد میگیرم که چطور از AsyncLocalStorage استفاده کنیم در #NodeJS البته قبل از هرچیزی میریم نگاهی به react context در #React میکنیم که از بچه های #FrontEnd یاد بگیرم چطور همچین مسائلی رو که AsyncLocalStorage به ما کمک میکنه حل کنیم رو با react context حل میکنن. https://youtu.be/B_s401HuZAU1,35%
  • 28 июн.درود به همگی دوستان. امیدوارم حالتون خوب باشه. باتوجه به این که خیلی وقت هست چیزی ننوشتم واقعا نمیدونم باید از کجا شروع کرد. حدود یک سال پیش با یکی از دوستانم داشتیم بحث های تکنیکال میکردیم و اشتراک تجربه که بهم کنفرانس JavaOne رو معرفی کرد. چندین ویدیو از…1,25%
  • 11 сент. 2025 г.درود دوستان امیدوارم حالتون خوب باشه. یک ویژگی خیلی کوچیک #Python داشت که من همیشه دلم میخواد داخل #NodeJS ببینم. این ویژگی خیلی وقته روی #Deno هست ( فکر کنم #BunJS هم داره ). واقعا جای خالیش رو من حس میکردم. و بلاخره این ویژگی رو به صورت Experimental در آپدیت 22.18 دیدیم که اضافه شد. برا این که وارد بحث بشیم دوست دارم با این کد پایتون شروع کنم. def main(): print("Hello From Main Function") if __name__ == "__main__": main() توضیح کد خیلی ساده هست که با استفاده از این پترن میشه تشخیص داد آیا این بخش از code که داره اجرا میشه آیا import شده توسط یک ماژول دیگه یا ماژول اصلی هست که باهاش برنامه رو اجرا کردن؟ اگر ماژول اصلی باشه که برنامه رو run کردن فانکشن main رو اجرا میکنه برنامه وارد main routine خودش میشه. شاید فکر کنید داخل زبانی مثل #Python و #JavaScript اینکار احمقانه باشه باتوجه به این که هر expressionـی رو میتونیم داخل top level خودمون اجرا کنیم. پس مزیت این کار چیه؟ جواب این هست که باتوجه به این که ما برنامه رو مینویسیم خب ما میدونیم کجا main routine رو اجرا کنیم ولی تصور کنید روی یک code base بزرگ رفتین و دنبال entrypoint میگردید. در این سناریو میتونه به عنوان داکیومنتیشن مناسب باشه. یا زمانی بخواید کدی رو اجرا کنید که فقط و فقط اگر کسی اون ماژول رو import کرده باشه و ... . همین الان هم وقتی پروژه #NestJS دارید bootstrap function دقیقا داره نقش main routine رو بازی میکنه و شما حتما باید اون رو اجرا کنید که برنامتون اجرا بشه. معمولا داخل #NestJS همچین چیزی میبینیم function bootstrap() { // init app } bootstrap(); سناریویی رو در نظر بگیرد به هر دلیلی میخواید از این main.js یک چیزی رو import کنید( هرچند اگر همچین چیزی نیاز داشتید بهتره سعی کنید راه دیگه ای پیدا کنید ) و اگر شما این فایل رو import کنید داخل یک ماژول دیگه خب bootstrap اجرا میشه و ما این رو نمیخوایم. پس چیکار میتونیم کنیم؟ function bootstrap() { console.log("hello"); } if (import.meta.main) { bootstrap(); } else { console.log("imported"); } اینجا هست import.meta.main به کمک ما میاد حالا اگر شما مستقیما node main.js بزنید فانکشن bootstrap اجرا میشه ولی اگر از یک فایل دیگ مثل server.js داشته باشید و این فایل رو import کنید بخش else اجرا میشه و bootstrap هیچ وقت call نمیشه.1,23%
  • 15 сент. 2025 г.همیشه ما همه تلاش داریم کد با Performance خوب توسعه بدیم بدون این که این موضوع رو تصور کنیم که داخل کدبیس های #JavaScript معمولا Performance شوخیه. ولی امروز قراره درمورد یک ویژگی جدید که در آپدیت ES2025 به #JavaScript اضافه شده صحبت کنیم که بهمون کمک میکنه که Performance بهتری داشته باشیم. سمت #NodeJS در بیزینس لاجیک های پیچیده میتونه معجزه کنه. برای #FrontEnd هم کاربردی هست ولی باتوجه به این که مرورگر های قدیمی ساپورت نمیکنن خب قطعا به این زودی استفاده ازش رو نمیبینیم. ویژگی جدید ما اضاف شدن یک static method جدید به Iterator هست. Iterator.from() حالا سوال پیش میاد که چطور این به ما کمک میکنه. فرض کنید یک array بزرگ دارید و میخواید data رو map کنید به یک شکل دیگه و برای این کار یک pipeline از map ها رو ایجاد کردید: const data = [1, 2, 3, 4, 5]; const final = data .map((item) => item.toString()) .map((item) => `- ${item} -`) .map((item) => `${item} ${new Date()}`); در نگاه اول مشکلی نداره ولی اگر با عینک Performance ببینیم دوتا مشکل میبینیم. 1. برای هر map مجبوریم یکبار کامل loop بزنیم خب 3 بار loop میزنیم پس داریم O(3n) 2. هربار که یک loop کامل میزنیم هربار داریم یک Array جدید بعد از map ایجاد میکنیم. به صورت خلاصه هر .map برابر هست با یک Array allocation جدید. خب اینجا یک array اورجینال داریم و 3 تا map پس 4 تا array allocation داریم. ممکنه برای تازه کارترها سوال های زیر پیش بیاد: 1. خب چرا اصلا این استایل کد میزنیم؟ 2. چرا همه رو داخل یک map انجام نمیدیم؟ پاسخ سوال اول: - میتونیم با for ... of کار رو بهتر با یک loop در بیاریم ولی مسئله این هست که معمولا برنامه نویس های #JavaScript در اینجور مواقع حتی بدون این که خودشون بدونن دیدگاه Functional Programming دارن و خب از اونجایی که به صورت فلسفی FP ذات Declarative داره و به صورت فلسفی کار کردن با API ها Declarative خیلی راحت تر و لذت بخش تر از Imperative هست همچین چیزی رو میبینیم. - اگر هم خیلی کنجکاوید بیشتر بدونید وقتش هست نگاهی به #Elixir #Scala یا حتی Lambda ها در #Java اونجا قشنگ متوجه میشید. یا اصلا مسیر رو برعکس برید و نگاهی به رویکرد #Golang کنید و فرق زمین تا آسمونی رو ببینید. پاسخ سوال دوم: - در بزینس لاجیک های پیچیده برای خوانایی کد داشتن map های بیشتر خیلی بهتر از این هست که یک map بزرگ داشته باشیم. منطقی هم هست چون خیلی بهمون God Object ها رو یادآوری میکنه. خب حالا سوال پیش میاد چیکار کنیم؟ خیلی ساده هست کافیه فقط خط اول رو به این شکل عوض کنیم و array رو تبدیل کنیم به Iterator. const data = [1, 2, 3, 4, 5, 6]; ❌ const data = Iterator.from([1, 2, 3, 4, 5, 6]); ✅ خب دوباره الان سوال پیش میاد که WTF الان چی شد؟ سادس. ما دیتا رو تبدیل کردیم به یک Iterator که ذات Iterator ها به صورت Lazy هست یعنی تا وقتی که نیاز به consume شدن data نباشه هیچ پردازشی انجام نمیشه و اگر هم نیاز به map کردن باشه دقیقا در runtime به صورت on-demand برای هر index تبدیل انجام میشه و ما نیازی به alloc کردن حافظه اضافه برای Array نداریم و هیچ loop اضافه ای هم درکار نیست. حالا به این نکات توجه کنید: - هر iterator رو فقط یکبار میشه consume کرد و اگر نیاز باشه باید دوباره ازش بسازی. در حقیقت با .toArray داریم consume کردن رو شبیه سازی میکنیم و دومی مقدار خالی به ما میده به خاطر iterator بودن. const data = Iterator.from([1, 2, 3, 4, 5, 6]); data.toArray() data.toArray() - در این قسمت به map ها باید توجه کرد که با هر بار call شدن یک Array جدید نمیسازن بلکه یک Iterator جدید که روی Iterator قبلی سوار هست رو به ما میده! پس در نتیجه با توجه به تعریف Iterator که بالاتر گفتم نه loop اضافه ای داریم و نه alloc اضافه. const data = Iterator.from([1, 2, 3, 4, 5, 6]); const final = data .map((item) => item.toString()) .map((item) => `- ${item} -`) .map((item) => `${item} ${new Date()}`); حالا اگر یکم بیشتر دقت کنی میبینیم خیلی شبیه به stream ها هست. اصلا این دوتا api به شدت باهم سازگار هستن. در این حد که استریم ها رو میشه تبدیل کرد به iterator و برعکس. بقیه کد هم دقیقا به صورت مشابهه کار میکنه. import { Readable } from "node:stream"; const data = Iterator.from([1, 2, 3, 4, 5, 6]); const streamData = Readable.from(data); دل نوشته: حقیقتا دیگ نمیشه تفاوت بین stream, iterator, generator, rxjs, web stream, رو تشخیص داد😂. همشون رو میتونی جایگزین هم استفاده کنی. ( دلایل مختلفی برای وجود این همه api برای یک کار هست )1,06%
  • 30 июн. 2025 г.درود و وقت همگی بخیر امیدوارم حالتون خوب باشه. بچه هایی که تازه کار هستن و #Backend رو مدت کمی هست کار میکنن ممکنه یکم براشون سوال باشه که به صورت کلی یک سیستم چه چیزهایی رو دارد و چطور این ها باهم کار میکنند. به جواب رسیدن برای هرکدوم از این سوال ها زمان زیادی ممکنه از ادم بگیره اگر راهنما خوبی هم وجود نداشته باشه. پیشنهاد میکنم این دوره رو حتما ببینید. https://downloadly.ir/elearning/video-tutorials/system-design-for-beginners/ بهتون دید خیلی خوبی میده که چه چیزایی رو حداقل باید بدونید و میتونه به عنوان یک Roadmap هم بهش نگاه کنید که در آینده در هرکدوم از بخش های مختلف این آموزش عمیق تر بشید. اگر باتجربه تر هم هستید و سیستم دیزاین نیاز به refresher دارید یا کلا تا حالا کار نکردین شروع خوبی میتونه باشه.0,90%