آیا از #ESM ( Es Module ) میدونید چیه؟ استفاده میکنید؟
Anonymous Poll
62%
بله استفاده میکنم.
16%
فقط شنیدم. اما استفاده نمیکنم.
21%
نه اصلا نمیدونم چی هست و استفاده نمیکنم.
Node Master
یکی از دلایلی که خیلی #NodeJS بنظرم جذاب هست کتابخونه Buffer هست برام. console.log(Buffer.allocUnsafe(10000).toString("utf8")) این کد رو اجرا کنید متوجه حرفم میشید. نظرتون رو برام کامنت کنید. #Tip
دلیل این که این کد جذابه این موضوع هست که بعضی قسمت های #NodeJS دسترسی هایی خیلی نزدیک به زبانی مثل C بهت میده. و اون Api نزدیک به Api های low level داخل C هست.
نمونه دیگ از این موضوع میتونه وقتی باشه که یک فایل یا سوکت به صورت خام باز میکنید و یکدونه file denoscriptor دریافت میکنید.
نمونه چیزی که میگم.
نمونه دیگ از این موضوع میتونه وقتی باشه که یک فایل یا سوکت به صورت خام باز میکنید و یکدونه file denoscriptor دریافت میکنید.
نمونه چیزی که میگم.
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
// fd is our file denoscriptor
});
اینجا fd به معنی file denoscriptor هست که یک عدد integer هست که از سمت سیستم عامل مشخص میکنه مربوط به چه فایلی هست که قراره عملیات روش انجام بشه.👍4
در خیلی از زبان های برنامه نویسی وقتی با threading یا حتی asyncio در حال انجام عملیات concurrent هستید نیاز دارید به صورت تستی برنامه رو مثلا برای چند ثانیه بلاک ( یا همون sleep ) مثال های زیر توجه کنید.
نکته خیلی مهم : اگر در برنامه production مجبور شدید که به صورت دستی مثل مثال های بالا مثلا 2 ثانیه برنامه رو sleep کنید به این معنی هست که یکجای کار اشتباهی کردید و این عملیات به هیچ عنوان نباید در کد production مگر دلیل خیلی خیلی قانع کننده استفاده بشه. معمولا برای تست کردن mock request و شبیه سازی مثلا network latency استفاده میشه.
حالا اگر بخوایم این کار رو داخل #NodeJS انجام بدیم معادل sleep رو نداریم و یکجورایی دستی باید خودمون بسازیم. قدیما از این روش استفاده میشد.
این مدل کد تقریبا sleep های بالا رو شبیه سازی میکنه. البته این نکته رو بگم دوتا کد بالا sync هستن و برای سادگی concurncy رو وارد نکردم هرچند به عنوان مثال در python ما asyncio.sleep هم داریم که این تکه کد بیشتر معادل asyncio.sleep در پایتون هست.
حالا یک روش تمیز تر در #NodeJS برای این کار هست که میتونید استفاده کنید که کدش رو در پایین میبینید.
در کتاب خانه "timers/promises" برای timer func های nodejs معادل promise base async api هست که بدردتون میخوره یک موردش اینجاس.
یک استفاده خیلی خوب از این مدل تایمر ها این هست که اگر یک فانکشن بزرگ دارید که event loop رو بلاک میکنه میتونید تیکه تیکه انجامش بدید که event loop هم بلاک نشه.
البته این جمله بالا اگر دقت کنید خیلی کاربردش شبیهه به generator function ها هست. ( این موضوع که چه ربطی به generator function ها داره خارج از بحث امروز هست دوست داشتید خودتون برید مطالعه کنید. )
#Tip
import time
time.sleep(2)
print("hello")
package main
import (
"fmt"
"time"
)
func main() {
time.Sleep(time.Second * 2)
fmt.Println("Hello")
}
نکته خیلی مهم : اگر در برنامه production مجبور شدید که به صورت دستی مثل مثال های بالا مثلا 2 ثانیه برنامه رو sleep کنید به این معنی هست که یکجای کار اشتباهی کردید و این عملیات به هیچ عنوان نباید در کد production مگر دلیل خیلی خیلی قانع کننده استفاده بشه. معمولا برای تست کردن mock request و شبیه سازی مثلا network latency استفاده میشه.
حالا اگر بخوایم این کار رو داخل #NodeJS انجام بدیم معادل sleep رو نداریم و یکجورایی دستی باید خودمون بسازیم. قدیما از این روش استفاده میشد.
async function asynctask() {
await new Promise((reslove) => {
setTimeout(() => {
reslove();
}, 2000);
});
console.log("hello");
}
asynctask();این مدل کد تقریبا sleep های بالا رو شبیه سازی میکنه. البته این نکته رو بگم دوتا کد بالا sync هستن و برای سادگی concurncy رو وارد نکردم هرچند به عنوان مثال در python ما asyncio.sleep هم داریم که این تکه کد بیشتر معادل asyncio.sleep در پایتون هست.
حالا یک روش تمیز تر در #NodeJS برای این کار هست که میتونید استفاده کنید که کدش رو در پایین میبینید.
import { setTimeout } from "timers/promises";
async function asynctask() {
await setTimeout(2000);
console.log("hello");
}
asynctask();در کتاب خانه "timers/promises" برای timer func های nodejs معادل promise base async api هست که بدردتون میخوره یک موردش اینجاس.
یک استفاده خیلی خوب از این مدل تایمر ها این هست که اگر یک فانکشن بزرگ دارید که event loop رو بلاک میکنه میتونید تیکه تیکه انجامش بدید که event loop هم بلاک نشه.
البته این جمله بالا اگر دقت کنید خیلی کاربردش شبیهه به generator function ها هست. ( این موضوع که چه ربطی به generator function ها داره خارج از بحث امروز هست دوست داشتید خودتون برید مطالعه کنید. )
#Tip
👍6
واقعا باورم نمیشه که ۴۰۰ نفر شدیم. خیلی خوشحالم که مطالب براتون مفید هست❤️🎉
دوستان اگر انتقادی دارید یا ایده برای برسی و یادگیری اینجا بزارید.
از این فرصت استفاده کنم یک نکته هم بگم که دوستانی که یک سری موضوعات رو پیشنهاد دادن من همه رو یاداشت کردم و در ادامه صحبت خواهیم کرد. اگر تا حالا صحبتی نشده بخاطر این هست که مطالب عمیقی بودن و نمیشه در قالب پست تلگرامی عمیق شد.
باز هم از همه دوستان تشکر میکنم و واقعا خیلی خوشحالم که از مطالب استفاده میکنید.🎉❤️
یک گروه هم مدتی هست داریم که با بچه ها راجع به این نکات صحبت میکنیم و کلا رفع مشکلات دوست داشتید میتونید جوین بشید.
https://news.1rj.ru/str/NodeMasterGP
دوستان اگر انتقادی دارید یا ایده برای برسی و یادگیری اینجا بزارید.
از این فرصت استفاده کنم یک نکته هم بگم که دوستانی که یک سری موضوعات رو پیشنهاد دادن من همه رو یاداشت کردم و در ادامه صحبت خواهیم کرد. اگر تا حالا صحبتی نشده بخاطر این هست که مطالب عمیقی بودن و نمیشه در قالب پست تلگرامی عمیق شد.
باز هم از همه دوستان تشکر میکنم و واقعا خیلی خوشحالم که از مطالب استفاده میکنید.🎉❤️
یک گروه هم مدتی هست داریم که با بچه ها راجع به این نکات صحبت میکنیم و کلا رفع مشکلات دوست داشتید میتونید جوین بشید.
https://news.1rj.ru/str/NodeMasterGP
👍14
Node Master
در ادامه مبحث Cluster Module و IPC یکی از مرسوم ترین روش های IPC استفاده از Signal برای فرستادن یک سری پیام های خاص به یک Process هست. به عنوان مثال از معروف ترین Singal ها که همیشه استفاده میکنید و ممکن هست بهشون توجه نکرده باشید SIGINT و SIGKILL میباشد.…
یک کنجکاوی که مدتی هست یاداشت کردم تا بعد درموردش عمیق تر بشم این بخش از داکیومنت #NodeJS هست. که لینکش پایین هست.
https://nodejs.org/docs/latest/api/child_process.html#subprocesssendmessage-sendhandle-options-callback
نوشته : "When the child process is a Node.js instance, these messages can be received via the 'message' event."
این موضوع در سطح سیستم عامل خیلی برام جالبه که چطور دقیق متوجه میشه که این child process یک node process هست.
روش های مختلفی به ذهن من میاد مثل
- یک فرایند handshake صورت میگیره که بنظرم پیچیدس.
- شاید از روی command متوجه میشه.
کلا این موضوع که child process که Node app هست رو خاص در نظر میگیره و یک سری api اضافی بهت میده خیلی نکته جالب و جذابی هست. چون این که چطور این اتفاق میافته بنظرم چالش سخت و جذابیه.
https://nodejs.org/docs/latest/api/child_process.html#subprocesssendmessage-sendhandle-options-callback
نوشته : "When the child process is a Node.js instance, these messages can be received via the 'message' event."
این موضوع در سطح سیستم عامل خیلی برام جالبه که چطور دقیق متوجه میشه که این child process یک node process هست.
روش های مختلفی به ذهن من میاد مثل
- یک فرایند handshake صورت میگیره که بنظرم پیچیدس.
- شاید از روی command متوجه میشه.
کلا این موضوع که child process که Node app هست رو خاص در نظر میگیره و یک سری api اضافی بهت میده خیلی نکته جالب و جذابی هست. چون این که چطور این اتفاق میافته بنظرم چالش سخت و جذابیه.
👍7
دوستان.
برای نصب #NodeJS روی سیستم خودتون سعی کنید از nvm استفاده کنید.
فرایند آپدیت کردن و نگهداری همزمان ورژن های مختلف #NodeJS رو براتون خیلی راحت میکنه.
https://github.com/nvm-sh/nvm
برای نصب #NodeJS روی سیستم خودتون سعی کنید از nvm استفاده کنید.
فرایند آپدیت کردن و نگهداری همزمان ورژن های مختلف #NodeJS رو براتون خیلی راحت میکنه.
https://github.com/nvm-sh/nvm
GitHub
GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash noscript to manage multiple active node.js versions
Node Version Manager - POSIX-compliant bash noscript to manage multiple active node.js versions - nvm-sh/nvm
👍5
مدتی توییتر فعالیت ندارم ولی این تراژدی #اسنپ_فود خیلی ناراحتم کرد.
در این توییت درسی که به نظرم باید از این داستان بگیریم رو گفتم. لینکش آخره و ادامه یکم صحبت خودمونی هست :)
تمام موضوعاتی که اینجا صحبت میکنیم کنار این یک حرف کنار.
خواهش میکنم دوستان اگر Backend کد میزنید فقط Framework developer نباشید.
عمیق بشید تا برسید به assembly.
به واسطه framework ها بچه های backend خیلی سطحی شدن و علاقه ای به عمیق تر شدن در مسائل کمتر دارن.
بخاطر همین جامعه Backend از جامعه هکر ها از نظر فنی عقب افتاده. سعی کنید خودتون رو برسونید.
من خودم هم مثل بقیه هستم و خیلی عقب افتادم ولی همیشه در همین مسیر داشتم حرکت میکردم ولی الان خیلی ضرورتش بیشتر شد برام.
توییت هم خوشحال میشم اشتراک بزارید.
https://twitter.com/imanhpr_media/status/1741489206382211530?t=Q1vxgBK1DaomODK0ZkuKEg&s=19
در این توییت درسی که به نظرم باید از این داستان بگیریم رو گفتم. لینکش آخره و ادامه یکم صحبت خودمونی هست :)
تمام موضوعاتی که اینجا صحبت میکنیم کنار این یک حرف کنار.
خواهش میکنم دوستان اگر Backend کد میزنید فقط Framework developer نباشید.
عمیق بشید تا برسید به assembly.
به واسطه framework ها بچه های backend خیلی سطحی شدن و علاقه ای به عمیق تر شدن در مسائل کمتر دارن.
بخاطر همین جامعه Backend از جامعه هکر ها از نظر فنی عقب افتاده. سعی کنید خودتون رو برسونید.
من خودم هم مثل بقیه هستم و خیلی عقب افتادم ولی همیشه در همین مسیر داشتم حرکت میکردم ولی الان خیلی ضرورتش بیشتر شد برام.
توییت هم خوشحال میشم اشتراک بزارید.
https://twitter.com/imanhpr_media/status/1741489206382211530?t=Q1vxgBK1DaomODK0ZkuKEg&s=19
X (formerly Twitter)
ImanHpr (@imanhpr_media) on X
درسی که به نظرم باید از داستان هک #اسنپ_فود بگیریم.
اول این که بچه های Backend به لطف framework ها در بازی امنیت خیلی از هکر ها عقب افتادن. ( نمونه خود من )
دوم این که حس میکنم این نتیجه مستقیم فرهنگ سازمانی هست که من حس میکنم اکثر شرکت ها دارن.
/1
اول این که بچه های Backend به لطف framework ها در بازی امنیت خیلی از هکر ها عقب افتادن. ( نمونه خود من )
دوم این که حس میکنم این نتیجه مستقیم فرهنگ سازمانی هست که من حس میکنم اکثر شرکت ها دارن.
/1
👍13👎4
یکبار داشتم تست مینوشتم و داشتم type ها رو assert میکردم که به این موضوع خوردم که چند ساعتی داشتم دنبالش میگشتم که داستان چیه و در نهایت متوجه شدم که اگر string رو با String class مستقیم بسازید typeof مربوط بهش میشه object و نه string.
دقیق یادم نمیاد که کد چی بود ولی مشکلش این typeof بود که object میشد و من انتظار داشتم string بشه.
#Tip
const text1 = new String("NodeMaster");
const text2 = "NodeMaster";
console.log(typeof text1); // object
console.log(typeof text2); // stringدقیق یادم نمیاد که کد چی بود ولی مشکلش این typeof بود که object میشد و من انتظار داشتم string بشه.
#Tip
👍7
Node Master
دوستان. برای نصب #NodeJS روی سیستم خودتون سعی کنید از nvm استفاده کنید. فرایند آپدیت کردن و نگهداری همزمان ورژن های مختلف #NodeJS رو براتون خیلی راحت میکنه. https://github.com/nvm-sh/nvm
اگر میخواید #NodeJS رو روی سیستم خودتون نصب کنید یک سری ابزار ها هست که اینکار رو برای شما راحت تر میکنه و قابلیت های بیشتری به شما میده.
- آپدیت کردن راحت تر
- داشتن چند ورژن همزمان و سویچ کردن
و ... . ۳ تا از این ابزار ها پایین هست من خودم از nvm استفاد میکنم ولی بعضی دوستان volta رو معرفی کردن. ویژگی خوب volta این هست که روی ویندوز هم کار میکنه ولی nvm فقط لینوکس هست فک کنم.
https://volta.sh/
یکی دیگ هم هست به اسم fnm که با rust نوشتن میتونید چک کنید.
https://github.com/Schniz/fnm
درکل همشون یک کار میکنن هرکدوم رو چک کنید و دوست داشتید استفاده کنید.
مرسی از @dev_a_loper بابت معرفی volta
- آپدیت کردن راحت تر
- داشتن چند ورژن همزمان و سویچ کردن
و ... . ۳ تا از این ابزار ها پایین هست من خودم از nvm استفاد میکنم ولی بعضی دوستان volta رو معرفی کردن. ویژگی خوب volta این هست که روی ویندوز هم کار میکنه ولی nvm فقط لینوکس هست فک کنم.
https://volta.sh/
یکی دیگ هم هست به اسم fnm که با rust نوشتن میتونید چک کنید.
https://github.com/Schniz/fnm
درکل همشون یک کار میکنن هرکدوم رو چک کنید و دوست داشتید استفاده کنید.
مرسی از @dev_a_loper بابت معرفی volta
volta.sh
Volta - The Hassle-Free JavaScript Tool Manager
Volta: Start your engines.
👍14
Node Master
گاهی اوقات در زمان توسعه برنامه نیاز است که از یک Object یک کپی ایجاد کنیم و Object اصلی رو به هیچ عنوان mutate نکنیم. برای کپی کردن object معمولا دو حالت دارد. - deep copy - shallow copy بزارید با مثال براتون تفاوت این دو مدل رو توضیح بدم. const user = {…
قبلا درمورد identity check صحبت خیلی کوتاهی کردیم که با استفاده از "===" میتونیم reference ها رو چک کنیم. فرض کنید ما دوتا object رو میخوایم مقایسه کنیم نه بر اساس reference ها بلکه براساس attr ها. اینجا "node:util" به کمک ما میاد.
دو obj که داریم با این که دقیقا یک شکل هستن ولی داخل دو خونه حافظه جدا هستن یعنی reference های متفاوت دارن. حالا با isdeepStrictEqual میتونیم این دوتا رو با هم چک کنیم که اگر کد رو اجرا کنید کاملا متوجه میشید داستان چیه.
دقیقا یک نسخه از همین فانکشن رو داخل "node:assert" داریم که لاجیکی که داره همین هست ولی بجای bool type به ما AssertionError برمیگردونه.
حالا سوال پیش میاد بنظرتون چرا باید دو مدل api برای یک لاجیک و خروجی ها متفاوت داشته باشیم؟
#Tip
#NodeJS
import util from "node:util";
const obj1 = { name: "NodeMaster" };
const obj2 = { name: "NodeMaster" };
console.log(util.isDeepStrictEqual(obj1, obj2));
console.log(obj1 === obj2);
دو obj که داریم با این که دقیقا یک شکل هستن ولی داخل دو خونه حافظه جدا هستن یعنی reference های متفاوت دارن. حالا با isdeepStrictEqual میتونیم این دوتا رو با هم چک کنیم که اگر کد رو اجرا کنید کاملا متوجه میشید داستان چیه.
دقیقا یک نسخه از همین فانکشن رو داخل "node:assert" داریم که لاجیکی که داره همین هست ولی بجای bool type به ما AssertionError برمیگردونه.
assert.deepStrictEqual(obj1, obj2);
util.isDeepStrictEqual(obj1, obj2);
حالا سوال پیش میاد بنظرتون چرا باید دو مدل api برای یک لاجیک و خروجی ها متفاوت داشته باشیم؟
#Tip
#NodeJS
👍8
سلام و ارادت دوستان. خیلی وقت بود میخواستم ویدیو بسازم و راجع به یک سری موضوعات صحبت کنم. البته این ویدیو بیشتر معرفی خودم و یکسری نکات درمورد چنل هست.
به زودی ویدیو های تکنیکال درمورد موضوعاتی که تو کانال داریم به صورت عمیق تر خواهیم داشت.
جا داره از همتون تشکر کنم و خوشحالم اگر مطالب براتون مفید بوده❤️
ممنون میشم این ویدیو هم ببینید.
https://youtu.be/znWtGcqHWbQ?si=IJDCOcPqDDJ_SeAF
به زودی ویدیو های تکنیکال درمورد موضوعاتی که تو کانال داریم به صورت عمیق تر خواهیم داشت.
جا داره از همتون تشکر کنم و خوشحالم اگر مطالب براتون مفید بوده❤️
ممنون میشم این ویدیو هم ببینید.
https://youtu.be/znWtGcqHWbQ?si=IJDCOcPqDDJ_SeAF
YouTube
سلام یوتیوب و دنیا !
اولین ویدیو یوتیوب من هست که درباره چنل تلگرامی که مدتی روش کار میکنم صحبت کردم.
و درمورد برنامه آینده این موضوعات.
https://news.1rj.ru/str/nodemaster
و درمورد برنامه آینده این موضوعات.
https://news.1rj.ru/str/nodemaster
👍15
Node Master
یکی از مشکلاتی که Node داشت و Deno سعی بر حل آن بود امنیت اجرای پکیج های 3rd party بود که اگر پکیجی بخواهد کارهایی از قبیل دسترسی به network یا خواندن و نوشتن دیتا روی disk انجام دهد شما باید به عنوان developer تایید کنید و اجازه دسترسی بدهید. و حالا در Node…
یک خبری چند روز پیش درمورد امنیت پکیج های NPM اومده بود که کره شمالی قصد دزدی از کیف پول های cryptocurrency ها با استفاده از پکیج آلوده داشته که میتونید جزیاتش رو از لینک زیر مطالعه کنید.
https://www.nodejs-security.com/blog/north-korea-malware-on-npm-and-ledger-connect-kit-crypto-heist
این دقیقا همون دلیلی هست که #Deno برای امنیت permission رو اضافه کرد و #NodeJS هم این قابلیت رو در حال حاظر به صورت experimental برای جلوگیری از این دسته مشکلات اضافه کرد.
خلاصه بگم. اگر پکیج اضافه میکنید به پروژه که دارید. چندین بار درمورد اون پکیج فکر کنید که آیا اصلا لازم دارید یا خیر.
نکته best practice : هرچقدر از پکیج های کمتری استفاده کنید زندگی راحت تری در نگهداری پروژه در طولانی مدت خواهید داشت.
#NodeWeekly
https://www.nodejs-security.com/blog/north-korea-malware-on-npm-and-ledger-connect-kit-crypto-heist
این دقیقا همون دلیلی هست که #Deno برای امنیت permission رو اضافه کرد و #NodeJS هم این قابلیت رو در حال حاظر به صورت experimental برای جلوگیری از این دسته مشکلات اضافه کرد.
خلاصه بگم. اگر پکیج اضافه میکنید به پروژه که دارید. چندین بار درمورد اون پکیج فکر کنید که آیا اصلا لازم دارید یا خیر.
نکته best practice : هرچقدر از پکیج های کمتری استفاده کنید زندگی راحت تری در نگهداری پروژه در طولانی مدت خواهید داشت.
#NodeWeekly
NodeJS Security & NodeJS Secure Coding
North Korea malware on npm and Ledger connect-kit crypto heist
North Korean state hackers compromise npm supply chain with malicious packages; crypto thieves exploit Ledger Connect kit library published to npm, stealing $600k before detected; incident highlights risks of uncontrolled open source usage and need for better…
👍3
در خیلی از زبان های برنامه نویسی مثل #Python #javanoscript #Golang و ... میبینیم که میگن فانکشن ها first class citizen function هستن. این موضوع خیلی میتونه تاثیر در برنامه های نوشته شده در زبان مورد نظر داشته باشه.
اصلا چرا بهشون میگیم first class citizen ؟
چیکار ها میتونیم انجام بدیم باهاشون؟
یکم راجع به این موضوع فکر کنید فردا راجع بهش صحبت خواهیم کرد.
https://developer.mozilla.org/en-US/docs/Glossary/First-class_Function
اصلا چرا بهشون میگیم first class citizen ؟
چیکار ها میتونیم انجام بدیم باهاشون؟
یکم راجع به این موضوع فکر کنید فردا راجع بهش صحبت خواهیم کرد.
https://developer.mozilla.org/en-US/docs/Glossary/First-class_Function
MDN Web Docs
First-class function - Glossary | MDN
A programming language is said to have First-class functions when functions in that language are treated like any other variable. For example, in such a language, a function can be passed as an argument to other functions, can be returned by another function…
👍4
خب first class function یعنی چی؟
به این موضوع هست که شما میتونید با function ها مثل بقیه object ها رفتار کنید. یعنی در متغیر ذخیرشون کنید یک لیستی از function ها داشته باشید و یا حتی در runtime فانکشن جدید بسازید و return کنید.
این موضوع خیلی نکته قوی هست که کلا decorator pattern درمورد این موضوع هست. البته این موضوع فقط مربوط به فانکشن ها نیست و بلکه شما میتونید همین کار رو برای کلاس ها و attr ها هم انجام بدید.
یکم بخوایم به موضوع بهتر نگاه کنیم در اصل این کار یکی از تکنیک های پر استفاده در Metaprograming میباشد که در فریمورک ها خیلی پر استفاده هست. یکسری فریمورک ها مثل NestJS سنگین از این موضوع استفاده میکنند.
فرض کنید لیستی داریم از چهار فانکشن که ۴ عمل اصلی ریاضی رو انجام میدن.
همچین چیزی رو داخل کد هایی که روزمره استفاده میکنید ممکنه که نبینید. این موضوع منطقی هست استفاده از این تکنیکا ها کاربردهای خاصی دارند که کمتر در پروژه های saas بهشون نیاز میشه. ( به معنی صفر بودن استفاده نیست :) )
یک مثال یک خورده عملی تر در express میتونیم middleware بسازیم. فرض کنید میخوایم یک سری route رو محافظت کنیم که یک سری role خاص بتونن به اون دسترسی داشته باشن. در ساده ترین حالت ممکن این هست.
این مدل کد خیلی استفاده میشه. مزیتی که داره ساده و خوانا هست ولی عیب بزرگش scale نمیشه رفت. فرض کنید 100 تا role داریم. یعنی 100 فانکشن. نکته سخت داستان این هست که در route ها ما باید reference از فانکشن ها بدیم و نه call کنیم یکم دقیق تر بگم در اینجا express برای ما IOC (inversion of control) داره انجام میده و مجبورمون میکنه اینطور کد بزنیم.
دلیل این هم که نمیتونیم کاری کنیم این هست که ما در زمان compile time داریم adminUse و normalUse رو ایجاد میکنیم که باز دست ما رو میبنده. اگر بتونیم با code مثل بقیه data ها رفتار کنیم مشکل حل میشه یعنی در runtime فاکشن ایجاد کنیم نه compile time !
اگر بخوایم حرف بالا رو عملی کنیم این شکل میشه.
دقت کنید دوستان ما فانکشن رو invoke نمیکنیم و حالا در runtime داریم اون رو میسازیم. موضوع خیلی خیلی مهمی که باید برای پشت پرده این داستان بدونید Closure هست. فانکشن roleFactory در حقیقت وظیفه تولید function جدید در runtime دارد. حالا شما همین کار رو میتونید برای هرچیزی در #Javanoscript کنید.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
توجه داشته باشید این مثال production ready نیست و صرفا برای گرفتن دید درمورد این موضوع هست. این موضوع اینجا تموم نشده و در پست بعدی مثال دیگه ای میزنیم.
درمورد کاربرد های دیگه این موضوع فکر کنید و نظراتتون رو کامنت کنید.
#Tip
به این موضوع هست که شما میتونید با function ها مثل بقیه object ها رفتار کنید. یعنی در متغیر ذخیرشون کنید یک لیستی از function ها داشته باشید و یا حتی در runtime فانکشن جدید بسازید و return کنید.
این موضوع خیلی نکته قوی هست که کلا decorator pattern درمورد این موضوع هست. البته این موضوع فقط مربوط به فانکشن ها نیست و بلکه شما میتونید همین کار رو برای کلاس ها و attr ها هم انجام بدید.
یکم بخوایم به موضوع بهتر نگاه کنیم در اصل این کار یکی از تکنیک های پر استفاده در Metaprograming میباشد که در فریمورک ها خیلی پر استفاده هست. یکسری فریمورک ها مثل NestJS سنگین از این موضوع استفاده میکنند.
فرض کنید لیستی داریم از چهار فانکشن که ۴ عمل اصلی ریاضی رو انجام میدن.
const sum = (a, b) => a + b;
const division = (a, b) => a / b;
const multiply = (a, b) => a * b;
const minus = (a, b) => a - b;
const operators = [sum, division, multiply, minus];
operators.forEach((fn) => {
console.log(fn(6, 2));
});
همچین چیزی رو داخل کد هایی که روزمره استفاده میکنید ممکنه که نبینید. این موضوع منطقی هست استفاده از این تکنیکا ها کاربردهای خاصی دارند که کمتر در پروژه های saas بهشون نیاز میشه. ( به معنی صفر بودن استفاده نیست :) )
یک مثال یک خورده عملی تر در express میتونیم middleware بسازیم. فرض کنید میخوایم یک سری route رو محافظت کنیم که یک سری role خاص بتونن به اون دسترسی داشته باشن. در ساده ترین حالت ممکن این هست.
let app; // imagine it's an express instance. :)
// Dummy controller function.
const protectedLogic = () => {};
const ADMIN = "ADMIN";
const NORMAL = "NORMAL";
function adminUse(req, res, next) {
if (req.role === NORMAL) next();
}
function normalUse(req, res, next) {
if (req.role === ADMIN) next();
}
// Express routes.
app.get("/admin", adminUse, protectedLogic);
app.get("/user", normalUse, protectedLogic);
این مدل کد خیلی استفاده میشه. مزیتی که داره ساده و خوانا هست ولی عیب بزرگش scale نمیشه رفت. فرض کنید 100 تا role داریم. یعنی 100 فانکشن. نکته سخت داستان این هست که در route ها ما باید reference از فانکشن ها بدیم و نه call کنیم یکم دقیق تر بگم در اینجا express برای ما IOC (inversion of control) داره انجام میده و مجبورمون میکنه اینطور کد بزنیم.
دلیل این هم که نمیتونیم کاری کنیم این هست که ما در زمان compile time داریم adminUse و normalUse رو ایجاد میکنیم که باز دست ما رو میبنده. اگر بتونیم با code مثل بقیه data ها رفتار کنیم مشکل حل میشه یعنی در runtime فاکشن ایجاد کنیم نه compile time !
اگر بخوایم حرف بالا رو عملی کنیم این شکل میشه.
function roleFactroy(rank) {
return function (req, res, next) {
if (req.role === rank) next();
};
}
// Express routes.
app.get("/admin", roleFactroy(ADMIN), protectedLogic);
app.get("/user", roleFactroy(NORMAL), protectedLogic);
دقت کنید دوستان ما فانکشن رو invoke نمیکنیم و حالا در runtime داریم اون رو میسازیم. موضوع خیلی خیلی مهمی که باید برای پشت پرده این داستان بدونید Closure هست. فانکشن roleFactory در حقیقت وظیفه تولید function جدید در runtime دارد. حالا شما همین کار رو میتونید برای هرچیزی در #Javanoscript کنید.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
توجه داشته باشید این مثال production ready نیست و صرفا برای گرفتن دید درمورد این موضوع هست. این موضوع اینجا تموم نشده و در پست بعدی مثال دیگه ای میزنیم.
درمورد کاربرد های دیگه این موضوع فکر کنید و نظراتتون رو کامنت کنید.
#Tip
MDN Web Docs
Closures - JavaScript | MDN
A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). In other words, a closure gives a function access to its outer scope. In JavaScript, closures are created every time…
👍18
https://www.linkedin.com/posts/mohammad-esfandiari-ab069322a_%D8%A7%D8%B3%D8%AA%D8%A7%D8%B1%D8%AA%D8%A7%D9%BE-%D9%85%D9%81%DB%8C%D8%AF-backend-developer-%D8%AC%D8%B0%D8%A8-%D9%85%DB%8C%DA%A9%D9%86%D8%AF-activity-7145778735194009600-UVNL?utm_source=share&utm_medium=member_andro
#Work
#Work
Linkedin
Mohammad Esfandiari on LinkedIn: استارتاپ مفید Backend developer جذب میکند.
مهارت های فنی:
مسلط به:…
مهارت های فنی:
مسلط به:…
استارتاپ مفید Backend developer جذب میکند.
مهارت های فنی:
مسلط به: Express js
مسلط به: Node js
مسلط به: Nest js
مسلط به : Graph QL
مسلط به : Mongo DB
مسلط…
مهارت های فنی:
مسلط به: Express js
مسلط به: Node js
مسلط به: Nest js
مسلط به : Graph QL
مسلط به : Mongo DB
مسلط…
Node Master
خب first class function یعنی چی؟ به این موضوع هست که شما میتونید با function ها مثل بقیه object ها رفتار کنید. یعنی در متغیر ذخیرشون کنید یک لیستی از function ها داشته باشید و یا حتی در runtime فانکشن جدید بسازید و return کنید. این موضوع خیلی نکته قوی هست…
خب هنوز یک قدم میخوایم پا رو فراتر بزاریم و class رو در runtime بسازیم. اول این که در #Javanoscript کلاس ها در حقیقت همون فانکشن ها هستن و صرفا کلمه class یک syntactic sugar روی نسخه ES5 هست. کلمه class در آپدیت معروف ES6 به #Javanoscript اضافه شد.
یعنی این دوتا باهم برابر هستند.
قدیما وقتی میخواستن کلاس بسازن از syntax به شکل User2 استفاده میکردن. اسم این مدل ES5 function constructors ولی چون شکل قشنگی نداشت class syntax رو اضاف کردن. هردو اینا دقیق برابر هستن یعنی در اصل class syntax اون پشت تبدیل میشه به مدل User2 اینطور تصور کنید.
اونجا که کامنت کردم خیلی میتونست ساده تر باشه. دیدم فرصت خوبی هست که بحثش رو بیارم وسط. بحث خیلی مهمی هست و یکی از خاصیت های زبان های dynamic type هست. فکر کنید راجع بهش کامنت بزارید در ادامه درموردش صحبت خواهیم کرد.
میریم سر اصل مطلب. اگر دقت کنید قدیما وقتی میخواستن کلاس بسازن از function استفاده میکردن ( منطقی یا غیرمنطقی بودن این موضوع یک بحث دیگس که کاری نداریم) پست قبلی یاد گرفتیم که function ها در حقیقت first class هستن و میتونیم هرکاری باهاشون کنیم! آفرین دقیقه نکته داستان همینه. به این دلیل که کلاس ها تبدیل میشن به ES5 function constructors اون پشت پس تمامی کارایی که قبل میتونستیم کنیم مجازه. بریم برای مثال.
مثال یکم فرانتی هست. ما کلاس رو در runtime ایجاد کردیم و براش private attr ست کردیم و اگر این کد رو اجرا کنید میبینید هم getter به درستی کار میکنه و هم شما مستقیم دسترسی به color ندارید. نکته جالب اینه دوباره برا مثال خوردیم به pattern بالا که گفتم. بهش فکر کنید.
یک نکته ای که وجود داره اینه که این ها anonymous class هستن و اسم ندارند. کد زیر رو اجرا کنید
حالا اگر بخوایم name رو به صورت HardCode بزنیم داخل btnFactory قشنگ در نمیاد چون همه کلاس ها یک اسم خواهند داشت. اگر anonymous هم باشیم ساعت های سختی رو برای debug خواهیم داشت.
تا همینجا برای این پست کافیه پست بعدی یکم عمیق تر میشیم در metaprograming.
یعنی این دوتا باهم برابر هستند.
// Syntactic Sugar
class User {
constructor(name, last_name) {
this.name = name;
this.last_name = last_name;
}
printFullName() {
console.log(this.name + " " + this.last_name);
}
}
function User2(name, last_name) {
this.name = name;
this.last_name = last_name;
}
User2.prototype.printFullName = function () {
console.log(this.name + " " + this.last_name);
};
// Think about this part. 🤔
const users = [new User("iman", "hpr"), new User2("iman", "hpr")];
users.forEach((user) => console.log(user.printFullName()));
قدیما وقتی میخواستن کلاس بسازن از syntax به شکل User2 استفاده میکردن. اسم این مدل ES5 function constructors ولی چون شکل قشنگی نداشت class syntax رو اضاف کردن. هردو اینا دقیق برابر هستن یعنی در اصل class syntax اون پشت تبدیل میشه به مدل User2 اینطور تصور کنید.
اونجا که کامنت کردم خیلی میتونست ساده تر باشه. دیدم فرصت خوبی هست که بحثش رو بیارم وسط. بحث خیلی مهمی هست و یکی از خاصیت های زبان های dynamic type هست. فکر کنید راجع بهش کامنت بزارید در ادامه درموردش صحبت خواهیم کرد.
میریم سر اصل مطلب. اگر دقت کنید قدیما وقتی میخواستن کلاس بسازن از function استفاده میکردن ( منطقی یا غیرمنطقی بودن این موضوع یک بحث دیگس که کاری نداریم) پست قبلی یاد گرفتیم که function ها در حقیقت first class هستن و میتونیم هرکاری باهاشون کنیم! آفرین دقیقه نکته داستان همینه. به این دلیل که کلاس ها تبدیل میشن به ES5 function constructors اون پشت پس تمامی کارایی که قبل میتونستیم کنیم مجازه. بریم برای مثال.
function buttonFactory(color) {
return class {
#color = color;
get color() {
return this.#color;
}
show() {
console.log("Button is " + this.#color);
}
};
}
const BlueBtnCls = buttonFactory("blue");
const RedBtnCls = buttonFactory("red");
const blueBtn = new BlueBtnCls();
const redBtn = new RedBtnCls();
// Here we go agin 😉. Think about it one more 🤔
const btns = [blueBtn, redBtn].forEach((btn) => btn.show());مثال یکم فرانتی هست. ما کلاس رو در runtime ایجاد کردیم و براش private attr ست کردیم و اگر این کد رو اجرا کنید میبینید هم getter به درستی کار میکنه و هم شما مستقیم دسترسی به color ندارید. نکته جالب اینه دوباره برا مثال خوردیم به pattern بالا که گفتم. بهش فکر کنید.
یک نکته ای که وجود داره اینه که این ها anonymous class هستن و اسم ندارند. کد زیر رو اجرا کنید
const BlueBtnCls = buttonFactory("blue");
console.log(BlueBtnCls) // out : [class (anonymous)]
console.log(BlueBtnCls.name)حالا اگر بخوایم name رو به صورت HardCode بزنیم داخل btnFactory قشنگ در نمیاد چون همه کلاس ها یک اسم خواهند داشت. اگر anonymous هم باشیم ساعت های سختی رو برای debug خواهیم داشت.
تا همینجا برای این پست کافیه پست بعدی یکم عمیق تر میشیم در metaprograming.
👍13
Node Master
Hint for question :) 🦆
جواب این سوال Duck Typing بود که در آینده حتما راجع بهش صحبت میکنیم.
پست بعدی ادامه همین پست رو کامل میکنیم👍
پست بعدی ادامه همین پست رو کامل میکنیم👍
👍3
Node Master
خب هنوز یک قدم میخوایم پا رو فراتر بزاریم و class رو در runtime بسازیم. اول این که در #Javanoscript کلاس ها در حقیقت همون فانکشن ها هستن و صرفا کلمه class یک syntactic sugar روی نسخه ES5 هست. کلمه class در آپدیت معروف ES6 به #Javanoscript اضافه شد. یعنی این دوتا…
در پست قبل یاد گرفتیم که چطور یک کلاس در Runtime بسازیم. و موضوعی باز موند که چطور میتونیم اسم کلاس ها هم در Runtime تغییر بدیم. برای این کار نیاز به یک تکنیک دیگه که در #Metaprogramming خیلی پر استفاده هست باید استفاده کنیم. به اسم Reflection. این تکنیک در اکثر زبان ها به طریقی وجود داره. golang و java دقیقا lib های خیلی قوی مربوط به این تکنیک دارند. متاسفانه Reflection در #Javanoscript خیلی محدود هست و قدرت زبان های دیگ رو نداره ولی اینجا کاربرد داره.
- حالا Reflection چیست؟ در حقیقت Reflection به معنی توضیح دادن یک کد با استفاده از یک کد دیگه.
زبان Lisp یک زبان قدیمی هست و استفاده خاصی این روزا نداره ولی یک فلسفه خیلی معروف به دنیای برنامه نویسی معرفی کرد.
- "Code Is Data"
بخوایم توضیح بالا رو کامل تر و ساده تر کنیم یعنی با کد برنامه مثل دیتا معمولی رفتار کنیم! این هم بگم اگر یکم درکش سخت هست براتون کاملا منطقیه. این نوع تفکر نیاز به تمرین زیادی داره پس زیاد سخت نگیرید.
راجع به Lisp و این موضوع در آینده بیشتر صحبت میکنیم.
حالا کد بالا رو در نظر بگیرید. و به مثال زیر دقت کنید.
برای این که کد بالا رو توضیح بدم اول این نکته رو باید در نظر داشته باشید که هر function یک attr به اسم name داره که اسم فانکشن هست. اگر راهی پیدا کنیم که بتونیم این رو در runtime تغییر بدیم پس مشکلی نخواهیم داشت.
در #Javanoscript دو namespace برای کمک به ما در Reflection وجود دارد.
- Reflect
- Object
در این name space ها یک سری static method برای کمک هستن که در کد بالا نمونه ای میبینید که ما اومدیم یک cls رو ساختیم و reference اون رو نگهداری میکنیم. بعد با استفاده از اون ref و کمک reflection در runtime به راحتی name رو به چیزی که میخوایم تغییر میدیم. بعد ref رو return میکنیم.
نکته در مورد مثال:
- خیلی خلاصه گویی شده به دلیلی که مطلب طولانی نشه.
- اینجا هدف فقط اشاره و لمس این موضوع هست در آینده بیشتر صحبت خواهیم کرد.
- حالا Reflection چیست؟ در حقیقت Reflection به معنی توضیح دادن یک کد با استفاده از یک کد دیگه.
زبان Lisp یک زبان قدیمی هست و استفاده خاصی این روزا نداره ولی یک فلسفه خیلی معروف به دنیای برنامه نویسی معرفی کرد.
- "Code Is Data"
بخوایم توضیح بالا رو کامل تر و ساده تر کنیم یعنی با کد برنامه مثل دیتا معمولی رفتار کنیم! این هم بگم اگر یکم درکش سخت هست براتون کاملا منطقیه. این نوع تفکر نیاز به تمرین زیادی داره پس زیاد سخت نگیرید.
راجع به Lisp و این موضوع در آینده بیشتر صحبت میکنیم.
حالا کد بالا رو در نظر بگیرید. و به مثال زیر دقت کنید.
function buttonFactory(color) {
const cls = class {
#color = color;
get color() {
return this.#color;
}
show() {
console.log("Button is " + this.#color);
}
};
Reflect.defineProperty(cls, "name", {
writable: false,
value: color[0].toUpperCase() + color.slice(1) + "Btn",
});
return cls;
}برای این که کد بالا رو توضیح بدم اول این نکته رو باید در نظر داشته باشید که هر function یک attr به اسم name داره که اسم فانکشن هست. اگر راهی پیدا کنیم که بتونیم این رو در runtime تغییر بدیم پس مشکلی نخواهیم داشت.
function SayMyName() {}
console.log(SayMyName.name);در #Javanoscript دو namespace برای کمک به ما در Reflection وجود دارد.
- Reflect
- Object
در این name space ها یک سری static method برای کمک هستن که در کد بالا نمونه ای میبینید که ما اومدیم یک cls رو ساختیم و reference اون رو نگهداری میکنیم. بعد با استفاده از اون ref و کمک reflection در runtime به راحتی name رو به چیزی که میخوایم تغییر میدیم. بعد ref رو return میکنیم.
نکته در مورد مثال:
- خیلی خلاصه گویی شده به دلیلی که مطلب طولانی نشه.
- اینجا هدف فقط اشاره و لمس این موضوع هست در آینده بیشتر صحبت خواهیم کرد.
👍14
سلام و ارادت دوستان.
نکته امروز رو با یک سوال شروع میکنیم. بنظرتون چرا باید از Object.freeze بیشتر استفاده کنیم؟
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
نکته امروز رو با یک سوال شروع میکنیم. بنظرتون چرا باید از Object.freeze بیشتر استفاده کنیم؟
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
MDN Web Docs
Object.freeze() - JavaScript | MDN
The Object.freeze() static method freezes an object. Freezing an object prevents extensions and makes existing properties non-writable and non-configurable. A frozen object can no longer be changed: new properties cannot be added, existing properties cannot…