درباره ماژول های Deno بیاموزید – بزرگترین تغییر گردش کار که در صورت ورود از Node.js با آن روبرو خواهید شد. نحوه کارکرد آنها و نحوه استفاده بهینه از آنها ، نحوه استفاده از ماژول های Node.js و بسته های npm در Deno و موارد دیگر را بیاموزید.

Node.js یک زمان اجرا در JavaScript بر اساس موتور V8 کروم است که توسط Ryan Dahl ساخته شده و در سال 2009 منتشر شده است.

دنو یک زمان اجرا در JavaScript بر اساس موتور V8 کروم است که توسط رایان دال توسعه داده شده و در سال 2020 منتشر شده است. این لزوماً آن را دنباله دار یا برتر از Node.js نمی کند ، اما از آن مسیر منحرف می شود.

همچنین مشاهده کنید:

تفاوت های عنوان: Deno بطور محلی از TypeScript ، امنیت ، تست و API مرورگر پشتیبانی می کند. مدیریت ماژول کمتر مورد توجه قرار می گیرد ، اما احتمالاً بزرگترین تغییر در نحوه ایجاد برنامه های JavaScript است. قبل از بحث در مورد Deno ، بگذارید شما را به زمان ساده تری برگردانم …

Node.js ماژول ها

جاوا اسکریپت در سال 2009 سیستم ماژول استانداردی نداشته است. این امر تا حدودی به دلیل میراث مرورگر آن بود و ES6 / ES2015 چندین سال با آن فاصله داشت.

برای Node.js غیرقابل تصور است که ماژول ارائه ندهد ، بنابراین CommonJS را از بین گزینه های راه حل جامعه پذیرفته است. این امر منجر به توسعه Node Package Manager یا بالاتر از سطح دریا، که به توسعه دهندگان اجازه می دهد ماژول های JavaScript خود را به راحتی جستجو ، استفاده و منتشر کنند.

استفاده از npm به طور چشمگیری رشد کرد. این محبوب ترین مدیر بسته طراحی شده است و تا اواسط سال 2020 ، تقریباً 1.5 میلیون ماژول با بیش از 800 واحد جدید هر روز میزبانی می کند (منبع: modulecounts.com)

ماژول های Deno

Deno ماژول های ES2015 را که شما انتخاب می کنید انتخاب می کند import از یک URL مطلق یا نسبی:

import { something } from 'https://somewhere.com/somehow.js';

اسکریپت موجود در آن URL باید باشد export توابع یا مقادیر دیگر بر این اساس ، به عنوان مثال

export function something() {
  console.log('something was executed');
}

Deno از یک سیستم ماژول مشابه با آن استفاده می کند که در مرورگرهای وب مدرن پیاده سازی شده است.

Node.js همچنین از ماژول های ES2015 پشتیبانی می کند … اما پیچیده است و به صورت آزمایشی باقی می ماند. ماژول های CommonJS و ES2015 شبیه به هم هستند ، اما به روش های مختلف کار می کنند:

  • هنگام اجرای کد ، CommonJS وابستگی ها را از سیستم فایل بارگیری می کند.
  • ماژول های ES از طریق URL ها تجزیه می شوند تا واردات بیشتر قبل از اجرای کد حل شود.

Node.js باید به پشتیبانی از CommonJS و همچنین مدیریت ماژولهای ES مخلوط شده ادامه دهد. بنابراین فرض می کند:

  1. پرونده ها به پایان می رسند .cjs از CommonJS استفاده کنید
  2. پرونده ها به پایان می رسند .mjs از ماژول های ES استفاده کنید
  3. پرونده ها به پایان می رسند .js CommonJS هستند مگر اینکه نزدیک ترین package.json مجموعه ها "type": "module" یا node با اجرا می شود --input-type=module گزینه.

قابل درک است که چرا Deno سیستم واحد ماژول استاندارد را انتخاب کرده است. با این حال ، npm در موفقیت Node مهم بود ، بنابراین جای تعجب است که کشف کنیم Deno آن را از بین می برد.

مدیر بسته وجود ندارد.

یکی از انتقادات به npm اندازه بزرگ هر پروژه است node_modules فهرست راهنما. این ماژول می تواند به صدها مگابایت برسد زیرا ماژول ها به نسخه های خاصی از ماژول های دیگر نیاز دارند.

جرم ماژول های گره

Deno برای اولین بار که URL آن در یک اسکریپت روبرو می شود ، یک ماژول را در یک فهرست جهانی بارگیری و ذخیره می کند. بنابراین ، صرفنظر از اینکه بسیاری از پروژه ها به آن مراجعه کنند ، فقط به یک نسخه واحد از نسخه ماژول خاص نیاز است.

من می دانم که شما فکر می کنید: “آه ، اما اگر …”

… اما Deno گزینه هایی برای حل مشکلات مطرح شده توسط URL های ماژول دارد.

URL های غیر قابل اعتماد

URL ها می توانند به طور موقت خراب شوند ، تغییر کنند یا برای همیشه از بین بروند. این یک مشکل برای هر مدیر بسته است و npm در گذشته با مشکلاتی روبرو بوده است (همچنین اجازه می دهد نصب از یک URL)

برای برنامه های Node.js که مهمترین ماموریت هستند ، توصیه می شود که برنامه های خود را اضافه کنید node_modules فهرست به مخزن Git / other پروژه شما.

Deno از گزینه مشابهی پشتیبانی می کند. می توانید تنظیم کنید DENO_DIR متغیر محیطی به مسیر دایرکتوری در پروژه فعلی شما ، به عنوان مثال

DENO_DIR=~/myproject/deno_modules`

در ویندوز cmd استفاده کنید:

> set DENO_DIR="C:myprojectdeno_modules"

یا Windows Powershell:

> $env:DENO_DIR="C:myprojectdeno_modules"

وقتی برنامه شما اجرا می شود ، Deno ماژول ها را به آن فهرست ذخیره می کند تا بتوان آنها را به مخزن کنترل منبع پروژه اضافه کرد.

همچنین می توانید وابستگی های خود را در یک فایل JavaScript یا TypeScript بسته بندی کنید. دنو دستور bundle می تواند این کار را در یک مرحله انجام دهد:

deno bundle myscript.js myscript.bundle.js

جایی که myscript.js اسکریپت ورودی شما به طور معمول با اجرا می شود deno run. نتیجه خود مختار myscript.bundle.js پرونده می تواند در یک سرور زنده مستقر شود.

بسته همراه با سطح بالا در انتظار است

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

سرانجام: مراقب ماژول های تصادفی Deno در URL های غیرمعمول باشید! URL Deno ، Github یا Bitbucket با اسناد و مدارک مناسب و ورودی جامعه به طور کلی ایمن تر خواهد بود.

نسخه سازی ماژول

در حالت ایده آل ، URL های ماژول باید نسخه شوند تا شما به یک انتشار کد خاص مراجعه کنید. به عنوان مثال کتابخانه استاندارد Deno به شما امکان می دهد a نسخه خاص ماژول سرور HTTP:

import { serve } from 'https://deno.land/std@0.61.0/http/server.ts';

امکان ارجاع به شاخه اصلی بجای:

import { serve } from 'https://deno.land/std/http/server.ts';

اما این آخرین نسخه را بارگیری می کند و نسخه بعدی می تواند با برنامه شما ناسازگار باشد.

با استفاده از کنوانسیون نسخه مشابه می توان ماژول های Deno را بر روی سرور خود آزاد کرد ، اما با محبوب شدن سایت شما می تواند بازدید زیادی داشته باشد. روش قوی تر استفاده از مخزن در سرویسی مانند GitHub و به هر نسخه برچسب git اختصاص دهید. خدماتی مانند denopkg.com و unpkg.com می تواند برای ارائه یک URL ماژول با نسخه عمومی استفاده شود.

چندین ماژول ذکر شده است

ممکن است لازم باشد در بسیاری از پرونده ها در کل کد برنامه خود ، URL ماژول مشابه را ارجاع دهید. وقتی می خواهید آن ماژول را به روز کنید ، URL باید در چندین مکان تغییر کند. جستجو و جایگزینی کارساز است ، اما بسیار ناپایدار ، مستعد خطا است و احتمال ادغام درگیری را افزایش می دهد.

متناوباً ، می توانید از یک پرونده وابستگی استفاده کنید که هر ماژولی را که در پروژه استفاده می کنید وارد می کند. به طور معمول نامگذاری می شود deps.js یا deps.ts:




export * as path from 'https://deno.land/std@0.61.0/path/mod.ts';


export { parseDate, currentDayOfYear } from 'https://deno.land/std@0.61.0/datetime/mod.ts';

سپس می توانید به ماژول های Deno از مراجعه کنید deps.js در هر پرونده پروژه دیگر:

import { path, currentDayOfYear } from './deps.js';

console.log( path.sep );
console.log( currentDayOfYear() );

شما فقط باید یک مرجع URL تنها در تغییر دهید deps.js هنگامی که یک ماژول به روز می شود.

یک گزینه جایگزین ، نقشه واردات است. این یک فایل کوچک JSON است که به طور معمول نامگذاری می شود import_map.json، که یک نام را به یک URL کامل یا جزئی اختصاص می دهد:

{
  "imports": {
    "path/": "https://deno.land/std@0.61.0/path/",
    "datetime/": "https://deno.land/std@0.61.0/datetime/"
  }
}

شما می توانید نام نقشه واردات را در هر اسکریپت ارجاع دهید:

import * as path from 'path/mod.ts';
import { currentDayOfYear } from 'datetime/mod.ts';

console.log( path.sep );
console.log(currentDayOfYear());

پرونده JSON هنگام اجرای برنامه با استفاده از آن وارد می شود deno run:

deno run 
  --importmap=import_map.json 
  --unstable 
  myscript.js

وارد کردن نقشه ها در حال حاضر یک ویژگی ناپایدار است بنابراین --unstable پرچم لازم است این ویژگی ممکن است در نسخه های بعدی Deno تغییر کند.

بررسی یکپارچگی

کد ارجاع شده از یک URL بدون اطلاع شما قابل تغییر یا هک است. سایت های دارای مشخصات بالا به خطر افتاده اند زیرا آنها مستقیماً به کد سمت مشتری خاص شخص ثالث مرتبط می شوند. تصور کنید اگر اسکریپت به منابع سرور دسترسی داشته باشد ، می تواند چه خسارتی وارد کند.

Deno امنیت داخلی دارد بنابراین اسکریپت ها باید با پرچم هایی مانند اجرا شوند --allow-read و --allow-net برای محدود کردن سیستم فایل و دسترسی به شبکه. این به جلوگیری از برخی مسائل کمک می کند ، اما جایگزینی برای تأیید صحت ماژول نیست!

Deno یک فراهم می کند گزینه بررسی صداقت. آسان تر است اگر از یک پرونده وابستگی استفاده می کنید (همانطور که در بالا توضیح داده شده است):




export * as path from 'https://deno.land/std@0.61.0/path/mod.ts';


export { parseDate, currentDayOfYear } from 'https://deno.land/std@0.61.0/datetime/mod.ts';

به شرح زیر deno دستور تولید a lock.json پرونده حاوی یک مجموعه چک از تمام ماژولهای Deno وارد شده:

deno cache --lock=lock.json --lock-write deps.js

وقتی توسعه دهنده دیگری پروژه شما را شبیه سازی می کند ، می تواند هر ماژول را بارگیری مجدد کرده و یکپارچگی هر یک را تأیید کند تا تضمین کند با یکسان است:

deno cache --reload --lock=lock.json deps.js

بررسی صداقت توسط Deno اعمال نمی شود. بهترین کار این است که این فرایندها را به صورت قلاب های Git خودکار یا موارد مشابه انجام دهید.

با استفاده از ماژول های Node.js

بسیاری از API های Node.js برای Deno تکثیر شده اند – مراجعه کنید deno.land/std/node. این یک لیست کامل نیست ، اما ماژول های مشترک پرونده ، رویداد ، بافر و برنامه های کاربردی را پیدا خواهید کرد.

مجموعه ای از تقریبا 800 ماژول Deno شخص ثالث در دسترس است deno.land/x. چارچوب های Express.js مانند ، درایورهای پایگاه داده ، توابع رمزگذاری ، ابزارهای خط فرمان و موارد دیگر وجود دارد.

همچنین لیست های سرپرستی شده ای از ماژول های معروف مانند دنو عالی.

با این حال ، شما ممکن است قادر به وارد کردن هر یک از 1.5 میلیون ماژول Node.js باشید. چندین CDN می توانند بسته های npm / CommonJS را به URL های ماژول ES2015 تبدیل کنند ، از جمله:

اینکه آیا ماژول مورد نیاز شما بدون مشکل در Deno کار می کند یا خیر موضوع دیگری است.

خوشبختانه ، ماژول های چند پلتفرمی که روی Node.js و Deno بدون درمان خاصی کار می کنند ، احتمالاً با تکامل اکوسیستم زمان اجرا JavaScript وارد می شوند.

بیشتر موارد ماژول

URL های ماژول ارجاع بحث برانگیز است و ممکن است برای کسانی که از npm بسیار محبوب هستند ، ناراحت کننده باشد. همانطور که گفته شد ، Deno استفاده از ماژول JavaScript را ساده کرده است. این چندین انتقاد npm را برطرف می کند در حالی که بسیاری از عوارض جانبی ماژول های ES2015 را کاهش می دهد.

اما خیلی کامل نیست.

انتشار ماژول های npm بدون درد و جستجو است npmjs.com ساده است. ممکن است عبارت جستجوی شما 500 نتیجه داشته باشد ، اما با رتبه بندی بسته ها توسط فلج انتخاب به حداقل می رسد محبوبیت ، کیفیت و نگهداری عوامل.

ارسال کد به Deno’s لیست ماژول های شخص ثالث دشوارتر است ماژول ها باید تست های خودکار را بگذرانند ، اما هیچ تضمینی برای کیفیت وجود ندارد و نتایج جستجو به ترتیب حروف الفبا مرتب می شوند. اگر سیستم موجود به چند هزار ماژول برخورد کند ، بعید به نظر می رسد پایدار باشد.

به روزرسانی بسته ها در npm نیز آسان است. می توانید بدوید npm outdated برای مشاهده لیستی از به روزرسانی ها یا فقط npm install چه زمانی شماره نسخه های شل تر در مراجعه می شود package.json.

در Deno گزینه معادل بررسی به روزرسانی وجود ندارد. پروژه هایی مانند مدیر بسته از جمله در دسترس هستند تی رکس، وابستگی های Deno را به روز کنید، و به روز رسانی deno-check-check اما اینها اغلب به نقشه های واردات بستگی دارند و همیشه به URL های نسخه معنایی اعتماد می کنند.

آیا باید به Deno بروید؟

Node.js نمرده است این محصول بالغ است و دارای ماژول ها ، تکنیک ها ، اسناد و مدارک و تجربه یک دهه پشت زمان اجرا است.

Deno از بسیاری از این دانش استفاده می کند ، اما این بسیار جدید است و طی سالهای آینده به سرعت تکامل می یابد. احتمالاً خیلی زود است که برای یک برنامه مهم در Deno شرط بندی کنیم ، اما برای پروژه های کوچکتر خطر کمتری وجود دارد. کسانی که قبلاً از TypeScript استفاده کرده اند یا از زبانهای دیگر آمده اند ممکن است تجربه ساده تری داشته باشند ، اما توسعه دهندگان Node.js برای انتقال به Deno و بازگشت دوباره مشکلی نخواهند داشت.

با این حال ، Deno یک مزیت جالب دارد:

  • سیستم ماژول آن با JavaScript سمت مشتری یکسان است
  • این بسیاری از API های مرورگر را پیاده سازی می کند: می توانید به a مراجعه کنید window شی ، تنظیم شنوندگان رویداد ، راه اندازی Web Workers ، درخواست درخواست سرور از راه دور با Fetch () API و موارد دیگر.

رویای کتابخانه های جاوا اسکریپت غیر شکل که روی هر دو سرویس گیرنده یا سرور کار می کنند ، گام مهمی به جلو برداشته است.

بنیادهای Deno

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

➤ بنیادهای Deno