۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

۱۰ مفهوم جاوا اسکریپت که هر توسعه دهنده Node باید بر آن تسلط داشته باشد

آیا می خواهید برنامه های Node.js کارآمد و مقیاس پذیر بسازید؟ بیاموزید که چگونه جاوا اسکریپت را برای شما کار کند، نه علیه شما.

آیا می خواهید برنامه های Node.js کارآمد و مقیاس پذیر بسازید؟ بیاموزید که چگونه جاوا اسکریپت را برای شما کار کند، نه علیه شما.

Node.js در زمان بی سابقه ای از یک ایده خارج از جعبه به یک پایه اصلی تبدیل شد. امروزه، این یک استاندارد واقعی برای ایجاد برنامه های کاربردی وب، نرم افزارهای سیستمی و غیره است. فریم‌ورک‌های Node سمت سرور مانند Express، ابزارهای زنجیره‌ای مانند Webpack و مجموعه‌ای از ابزارهای کاربردی برای هر نیازی، Node را به روشی بسیار محبوب برای استفاده از قدرت و بیان جاوا اسکریپت در قسمت پشتی تبدیل کرده است.

اگرچه Node اکنون رقابتی با Deno و Bun دارد، اما همچنان پلتفرم پرچم‌دار جاوا اسکریپت در سرور است.

Node به دلیل محبوبیت بسیار زیادش مدیون جاوا اسکریپت است. جاوا اسکریپت یک زبان چندپارادایمی است که از سبک های مختلف برنامه نویسی، از جمله برنامه نویسی تابعی، برنامه نویسی واکنشی و برنامه نویسی شی گرا پشتیبانی می کند. این اجازه می دهد تا توسعه دهنده انعطاف پذیر باشد و از سبک های مختلف برنامه نویسی استفاده کند.

اما جاوا اسکریپت می تواند یک شمشیر دو لبه باشد. ماهیت چندپارادایمی جاوا اسکریپت به این معنی است که تقریباً همه چیز قابل تغییر است. بنابراین، هنگام نوشتن کد Node.js نمی‌توانید احتمال جهش شی و محدوده را کنار بگذارید. از آنجا که جاوا اسکریپت فاقد بهینه‌سازی tail-call است (که به توابع بازگشتی اجازه می‌دهد تا از فریم‌های پشته برای تماس‌های بازگشتی مجدد استفاده کنند)، استفاده از بازگشت برای تکرارهای بزرگ خطرناک است. علاوه بر مشکلاتی مانند این، Node تک رشته ای است، بنابراین برای توسعه دهندگان ضروری است که کد ناهمزمان بنویسند. Node همچنین از کف دست های صورت مشترک در همه زبان ها مانند خطاهای بلع رنج می برد.

جاوا اسکریپت اگر با احتیاط استفاده شود می‌تواند یک مزیت باشد – یا اگر بی‌احتیاط باشید، آزاردهنده باشد. پیروی از قوانین ساختاریافته، الگوهای طراحی، مفاهیم کلیدی و قوانین اساسی به شما کمک می کند تا رویکرد بهینه را برای یک مشکل انتخاب کنید. برنامه نویسان Node.js کدام مفاهیم کلیدی را باید درک کنند؟ در اینجا ۱۰ مفهوم جاوا اسکریپت وجود دارد که به اعتقاد من برای نوشتن کد Node.js کارآمد و مقیاس پذیر بسیار ضروری است.

بسته شدن جاوا اسکریپت

یک بستن در جاوا اسکریپت یک تابع درونی است که به محدوده عملکرد بیرونی خود دسترسی دارد، حتی پس از اینکه تابع خارجی کنترل را برگرداند. بسته شدن متغیرهای تابع داخلی را خصوصی می کند. برنامه نویسی کاربردی محبوبیت زیادی پیدا کرده است و بسته شدن را به بخشی ضروری از کیت توسعه دهنده Node تبدیل کرده است. در اینجا یک مثال ساده از بسته شدن در جاوا اسکریپت آمده است:


let count = (function () {
     var _counter = 0;
     return function () {return _counter += 1;}
})();

count();
count();
count();

>// the counter is now 3

به تعداد متغیر یک تابع بیرونی اختصاص داده شده است. تابع خارجی فقط یک بار اجرا می شود که شمارنده را صفر می کند و یک تابع داخلی را برمی گرداند. متغیر _counter فقط توسط تابع داخلی قابل دسترسی است، که باعث می‌شود مانند یک متغیر خصوصی رفتار کند.

مثال در اینجا یک تابع مرتبه بالاتر (یا متاتابع، تابعی است که تابع دیگری را می گیرد یا برمی گرداند). بسته شدن در بسیاری از برنامه های کاربردی دیگر یافت می شود. هر زمان که تابعی را در داخل تابع دیگری تعریف کنید، بسته شدن اتفاق می‌افتد و تابع درونی هم دامنه و هم به دامنه اصلی دسترسی پیدا می‌کند – یعنی تابع داخلی می‌تواند متغیرهای بیرونی را «دیده» کند، اما بالعکس نه.

این با روش‌های کاربردی مانند map(innerFunction) نیز مفید است، جایی که innerFunction می‌تواند از متغیرهای تعریف‌شده در محدوده بیرونی استفاده کند.

نمونه های اولیه جاوا اسکریپت

هر تابع جاوا اسکریپت دارای یک ویژگی prototype است که برای پیوست کردن ویژگی‌ها و متدها استفاده می‌شود. این خاصیت قابل شمارش نیست. این به توسعه دهنده اجازه می دهد تا متدها یا توابع عضو را به اشیاء خود متصل کند. جاوا اسکریپت از وراثت فقط از طریق ویژگی نمونه اولیه پشتیبانی می کند. در مورد یک شی ارثی، ویژگی نمونه اولیه به والد شی اشاره می کند. یک رویکرد رایج برای پیوست کردن متدها به یک تابع، استفاده از نمونه‌های اولیه است که در اینجا نشان داده شده است:


function Rectangle(x, y) {
     this.length = x;
     this.breadth = y;
}

Rectangle.prototype.getDimensions = function () {
     return { length : this._length, breadth : this._breadth };
};

Rectangle.prototype.setDimensions = function (len, bred) {
     this.length = len;
     this.breadth = bred;
};

اگرچه جاوا اسکریپت مدرن از پشتیبانی کلاسی بسیار پیچیده ای برخوردار است، اما همچنان از سیستم نمونه اولیه زیر کاپوت استفاده می کند. این منبع بسیاری از انعطاف‌پذیری زبان است.

تعریف ویژگی های خصوصی با استفاده از نام های هش

در زمان های قدیم، قرارداد پیشوند متغیرها با خط زیر برای نشان دادن اینکه یک متغیر قرار بود خصوصی باشد استفاده می شد. با این حال، این فقط یک پیشنهاد بود و نه یک محدودیت اعمال شده توسط پلت فرم. جاوا اسکریپت مدرن هشتگ اعضا و روش های خصوصی را ارائه می دهد برای کلاس ها:


class ClassWithPrivate {
  #privateField;
  #privateMethod() { }
}

نام‌های هش خصوصی یک ویژگی جدیدتر و بسیار خوش‌آمد در جاوا اسکریپت است! نسخه‌های اخیر Node و مرورگرها از آن پشتیبانی می‌کنند و ابزارهای توسعه کروم به شما امکان می‌دهند مستقیماً به متغیرهای خصوصی دسترسی داشته باشید.

تعریف ویژگی های خصوصی با استفاده از بسته ها

رویکرد دیگری که گاهی برای دور زدن کمبود ویژگی‌های خصوصی در سیستم نمونه اولیه جاوا اسکریپت مشاهده می‌کنید، استفاده از بسته شدن است. جاوا اسکریپت مدرن به شما امکان می دهد تا با استفاده از پیشوند هشتگ، مانند مثال بالا، ویژگی های خصوصی را تعریف کنید. با این حال، این برای سیستم نمونه اولیه جاوا اسکریپت کار نمی کند. همچنین، این ترفندی است که اغلب در کد پیدا می‌کنید و مهم است که بفهمید چه کاری انجام می‌دهد.

تعریف خصوصیات خصوصی با استفاده از بسته‌ها به شما امکان می‌دهد یک متغیر خصوصی را شبیه‌سازی کنید. توابع عضوی که نیاز به دسترسی به خصوصیات خصوصی دارند باید روی خود شی تعریف شوند. در اینجا نحو ایجاد ویژگی های خصوصی با استفاده از بسته ها آمده است:


function Rectangle(_length, _breadth) {
     this.getDimensions = function () {
     return { length : _length, breadth : _breadth };
     };

     this.setDimension = function (len,bred) {
     _length = len;
     _breadth = bred
     };
}

ماژول های جاوا اسکریپت

روزی روزگاری جاوا اسکریپت هیچ سیستم ماژولی نداشت و توسعه دهندگان یک ترفند هوشمندانه (به نام الگوی ماژول) را ابداع کردند تا چیزی را درست کنند که کار کند. همانطور که جاوا اسکریپت تکامل یافت، نه یک بلکه دو سیستم ماژول ایجاد کرد: نحو CommonJS include و نحو require ES6.

Node به طور سنتی از CommonJS استفاده می کند، در حالی که مرورگرها از ES6 استفاده می کنند. با این حال، نسخه های اخیر Node (در چند سال اخیر) از ES6 نیز پشتیبانی می کنند. در حال حاضر روند استفاده از ماژول های ES6 است و روزی ما فقط یک نحو ماژول برای استفاده در جاوا اسکریپت خواهیم داشت. ES6 به نظر می رسد (که در آن یک ماژول پیش فرض را صادر می کنیم و سپس آن را وارد می کنیم):


// Module exported in file1.js…
export default function main() { }
// …module imported in file2.js
import main from "./file1";

هنوز CommonJS را خواهید دید، و گاهی اوقات لازم است از آن برای وارد کردن یک ماژول استفاده کنید. در اینجا نحوه صادرات و سپس وارد کردن یک ماژول پیش فرض با استفاده از CommonJS به نظر می رسد:


// module exported in file1.js…
function main = () { }
module.exports = main;
// …module imported in file2.js

بررسی خطا

مهم نیست در چه زبان یا محیطی هستید، رسیدگی به خطا ضروری و اجتناب ناپذیر است. Node نیز از این قاعده مستثنی نیست. سه روش اساسی برای مقابله با خطاها وجود دارد: بلوک‌های try/catch، پرتاب خطاهای جدید، و کنترل‌کننده‌های on().