NODE JS! ওয়েব ডেভলাপমেন্ট এর জগতে কে না শুনেছে এই নাম! এই NODE কে যদি আপনি Ascending Order-এ Sort করেন তাহলেই পেয়ে যাবেন DENO! টেকনোলজি জগতের প্রায় সবার কাছেই এখন আলোচনার শীর্ষ বিষয় এই নতুন প্রযুক্তিটি। কেও কেও তো মনে করছে ব্যাক-এন্ড ডেভলপমেন্টে সবাইকে পিছে ফেলে দিতেই এর আবির্ভাব! তবে একথা একদম নিশ্চিত যে ডিনো ডেভলপমেন্ট জগতে একটা গেইম চেঞ্জার হতে যাচ্ছে। তো কী এই ডিনো, কেনই বা এর আবির্ভাব,ডিনোর সাথে নোডের পার্থক্যটাই বা কী, এবং এর ভবিষ্যত সম্পর্কেই আজকের আলোচনা।
এটা তৈরী করেছেন সেই NodeJS এর ক্রিয়েটর রায়ান ডেল! উনি নোড তৈরী করেছিলেন ২০০৯ সালে, ১০ বছর পর উনি আবার ডিনো নিয়ে আসলেন.. বুঝতেই পারছেন তার ১০ বছর আগের যে নোড এখন দুনিয়া কাপাচ্ছে, তাহলে এই ডিনো কি করবে!
অফিসিয়াল সাইটে বলা হয়েছে ‘Deno is a secure runtime for Javascript and Typescript' মানে ডিনো জাভাস্ক্রিপটের সাথে সাথে টাইপস্ক্রিপ্ট এরও একটা রানটাইম। সহজ বাংলায় বলতে গেলে, ব্রাউজারের বাইরে জাভাস্ক্রিপ্ট ও টাইপ্সক্রিপ্ট রান করার একটা এনভায়রনমেন্ট হচ্ছে ডিনো। প্রাথমিকভাবে ডিনো Go language দিয়ে ডেভেলপ করা শুরু করলেও পরবর্তীতে প্রায় পুরো প্রোজেক্টই Rust এ শিফট করা হয়। ডিনো-ও জাভাস্ক্রিপ্ট এর মতো ক্রোমের V8 ইঞ্জিনের উপর বেস করেই বানানো।
Why Deno?
এখন কথা হলো Ryan Dahl নোডের মত এমন পাওয়ারফুল জিনিস বানানোর পরও কেন ডিনোর মত প্রোজেক্ট তৈরী করলেন? কারণ নোড এমন এমন কাজ করতে পারে যা জাভাস্ক্রিপ্ট দিয়ে আগে কেও কল্পনাও করতে পারত না। এমনকি ডেটা ইন্টেন্সিভ কাজের জন্য নোড এখনও arguably বেস্ট টেকনোলজি। তাহলে Ryan Dahl ডিনোর প্রয়োজনই বা বোধ করলেন কেন? কারণ নোড বানানোর সময় Ryan Dahl এমন অনেক কিছু করেননি বা এমন অনেক কিছু করেছেন যেসব কাজ করা বা না করার জন্য সে পরবর্তীতে আফসোস করেছেন। আর তাছাড়াও রায়ান নোড তৈরী করেন ২০০৯ এ; এরপরে জাভাস্ক্রিপ্ট ল্যাংগুয়েজে অনেক নতুন এবং প্রয়োজনীয় ফিচার আসে, বিশেষ করে ES2015 ভার্শনে। রায়ান মনে করেন এসব ফিচার তখন এভেইলেবল থাকলে নোড আরো বেটার হত। ডেভলপমেন্ট এর দুনিয়ায় একটা টেকনোলজি জনপ্রিয় হয়ে গেলে সেটার অনেক ডিপেডেন্সি তৈরী হয়ে যায়, ঠিক তেমনি জাভাস্ক্রিপ্ট এর ভার কীওয়ার্ড ফিক্স না করে লেট আর কন্সট নিয়ে আসছিল একমাস্কিপ্ট! কারণ, যতদিনে তারা বুঝতে পারছিল ভার এর প্রব্লেম, ততদিনে কোটি কোটি ওয়েবসাইট তৈরী হয়ে গেছিল এই ভার কীওয়ার্ড এর লজিকে!
তাই Ryan Dahl নতুন টেকনোলজি ডিনো শুরু করলেন। নোড বানানোর সময় তার মতে যেসব কাজ অসম্পূর্ণ রেখেছিলেন সেসব জিনিস ইঙ্কলুড করে যে নতুন টেকনোলজি তৈরী করার চেস্টা করেন সেটাই ডিনো। Ryan Dahl এর মতে নোড তৈরী করতে যেসব ভুল ছিল তার কয়েকটি উল্লেখ করা হলোঃ
নোডে ২০০৯ সালে Promise অন্তর্ভুক্ত করা হয়। তবে রায়ান ২০১০ এর ফেব্রুয়ারিতে তার এই সিদ্ধান্ত থেকে সরে এসে Promise নোড থেকে বাদ দিয়ে দেন। এই সরে আসার সিদ্ধান্ত নিয়ে রায়ান নিজেই এখন আফসোস করেন।
নোডের সবচেয়ে বড় ল্যাকিং ছিল সিকিউরিটি ইস্যু। V8 ইঞ্জিন বাই ডিফল্ট অনেক সিকিউরড। তারপরেও নোডের সিকিউরিটি ইস্যুতে রায়ান অনেক ল্যাক রেখেছিলেন। যেমনঃ Eslint যখন আমরা নোডে ইউস করি তখন তা বাই ডিফল্ট আমাদের মেশিনের অনেক কিছুতে এক্সেস নিতে পারে। যেটা একচুয়েলি ডেভেলপমেন্ট প্রোসেসে অনেক রকম সিকিউরিটি ইস্যু এবং হুমকির সম্ভাবনা তৈরী করে।
নোডের বিল্ড সিস্টেম হিসেবে GYP ব্যবহার করা হয়েছিলো। যেমনঃ নোডে আপনি যদি এমন একটি মডিউল ইউস করেন বা কোড করেন যেটা ধরা যাক সি ল্যাংগুয়েজের কোনো লাইব্রেরির সাথে কানেক্টেড; তাহলে GYP বিল্ড সিস্টেমের কাজ হচ্ছে সেই সি লাইব্রেরিকে কম্পাইল করে নোডের স্আথে লিংক করা। নোডে GYP ব্যবহার করার কারণ ছিল ক্রোম (V8) ও তখন GYP ব্যবহার করত। কিন্তু দুঃখজনকভাবে ক্রোম পরবর্তীতে GYP বাদ দিয়ে GN নামক একটা সিস্টেমে শিফট করে। ফলে নোড এবং V8 এর উপর বেস করে তৈরী করা বলে অনেক রকম সমস্যার তৈরী হয়। GYP মূলত একটা জেসন ফরম্যাটের মত ফাইল; কিন্তু এটা পাইথনে লিখা! বোঝাই যাচ্ছে সিস্টেমটা নোডের জন্য কতটা কমপ্লেক্স। নোড GYP ব্যবহারে কমপ্লেক্সিটি কমানোর জন্য এই সিস্টেমকে Node.gyp এর মত টুল দিয়ে র্যাপ করে। মানে একটা সিস্টেমকে ব্যবহারের জন্য সহজ করতে GYP কে অনেক ইউটিলিটি টুল দ্বারা র্যাপ করা হয়। যেটা পুরা সিস্টেম আর প্রসিডিউরটাকে অহেতুক ও অপ্রয়োজনীয় অনেক জটিলতার সম্মুখীন করে। অন্যদিকে V8 নিজেই আর GYP ইউস করে না। যদিও নোডে যাতে GYP সাপোর্ট করে এজন্য GYP এর একটা Wrapper ইউস করে। কিন্তু এই পুরো প্রোসেস্টাই খুব বেশি জটিল হয়ে গেছে প্রয়োজনের তুলনায়। এবং রায়ান নোডের ক্ষেত্রে এই বিষয়টাকে তার অন্যতম প্রধান ভুল হিসেবে স্বীকার করেন।
নোড যখন বাজারে আসে তখন জাভাস্ক্রিপ্ট এর ডিফল্ট মডিউলিং এর স্ট্যান্ডার্ড ছিল CommonJS. এজন্যই নোডে কোনো মডিউল ইম্পোর্ট করতে হলে require(“module name”) এভাবে ইউস করতে হয়। es মডিউল সিস্টেম ইউস করার জন্য আমাদের babel এর মত টুল ইউস করতে হয়। যা অহেতুক প্রোজেক্টে একটা ডিপেন্ডেন্সি যোগ করে। নোডে টাইপ্সক্রিপ্ট ব্যবহারের জন্য বিল্ট-ইন কোনো সিস্টেম ছিল না।
নোডের আরেকটা ডিপেন্ডেসি হচ্ছে npm. Npm থেকে কোনো প্যাকেজ/মডিউল নোডে ইউস করলে প্রথমে সেটা ইন্সটল করলে তা নোড মডিউলস ডিরেক্টরিতে সেভ হয়। আবার pakage.json এও রেফারেন্স আকারে সেভ হয়। আবার নোড প্রোগ্রামে রিকোয়ারও করা লাগে। অর্থাৎ একটা প্যাকেজ ইউস করার জন্য অনেক অহেতুক কাজ করা লাগে। এখানেই ডিনো সুন্দর একটা সমাধান দেয় যা আমরা একটু পরেই জানব।
নোডের মডিউলিং এ কোনো প্যাকেজ বা মডিউল require করলে শেষে ফাইল এক্সটেনশন দিতে হয় না। ফলে অনেক সমস্যার তৈরী হতে পারে। মডিউল লোডারকে ফাইল সিস্টেমের বিভিন্ন জায়াগায় কুয়েরী করে নিজে থেকে বুঝে নিতে হয় যে ইউসার আসলে কী চাচ্ছে। কারণ .ts বা .js কখনোই একরকম বিহেভ করবে না।
এছাড়াও নোডের এমন আরো অনেক জিনিসই আছে যা রায়ানের মতে আরো বেটার করা যেত। মূলত নোডের ভুলগুলো শুধরে আরো ভাল কিছু নিয়ে আসতেইডিনোর আবির্ভাব।
Differences between Node and Deno:
যেহেতু নোডের কিছু কমতি দেখেই রায়ান ডিনোর মত প্রোজেক্ট বানাতে উদ্বুদ্ধ হন; তাই এই দুই টেকনোলজির মধ্যে কিছু পার্থক্য থাকাটাই স্বাভাবিক। Like:
প্রথমেই বলতে হয় ডিনো হচ্ছে বাই ডিফল্ট সিকিউর প্রোগ্রাম! সে আপনার থেকে যেকোনো রিসোর্স ব্যবহার করার আগে পারমিশন নিবে! যেমন ফাইলসিস্টেম একসেস, নেটওয়ার্ক একসেস! সেটা নোডজেস এ ছিল না! এর ফলে থার্ডপার্টি কোনো প্যাকেজ আপনার কম্পিউটারে আপনার পারমিশন ছাড়া একসেস নিতে পারবে না! রান করার সময় নিজে থেকে বলে এমনভাবে ফ্লাগ লিখে এরপর ফাইলটা রান করতে হবে। হবেঃ deno –allow-net ‘your file name’ . অর্থাৎ নোডে যেমন npm এর কোনো প্যাকেজ ইউস করার সময় আমাদের হাতে কোনো কন্ট্রোল নাই;ডিনো এই সমস্যাটার পুরোপুরি সলুশন নিয়ে এসেছে।
ব্রাউজার এর ডিফল্ট ফাংশনগুলো ডিনোতে এভেইলেবল করা হয়েছে, লাইক ইভেন্ট লিসেনারস, সেট্টাইম আউট, ফেচ, ইন্টারভাল ইত্যাদি.. এর ফলে জেস ফ্রন্ট এর সাথে ব্যাক এর সম্পর্ক আরও পাকাপোক্ত হল! তাছাড়া ডিনোতে Top level await সাপোর্ট করে ! যেমনঃ
const URL = “someurl.com”; const data = await fetch(URL); অর্থাৎ async ফাংশন না বানিয়েই await করতে পারবেন এবং বয়লারপ্লেট টাইপের কোড অনেক কমে যাবে ডিনোতে।
নোড c++ এ লেখা জাভাস্ক্রিপ্ট এর একটি রানটাইম। অপরপক্ষে ডিনো Rust এবং Typescript এ লিখা জাভাস্ক্রিপ্ট এবং টাইপ্সক্রিপ্ট এর একটি রানটাইম।
নোড এসিংক্রোনাস টাস্ক হ্যান্ডেল করার জন্য libuv নামক একটি এসিংক্রোনাস রানটাইম ব্যবহার করে। অপরপক্ষে ডিনো এসিংক্রোনাস টাস্ক হ্যান্ডেল করার জন্য Tokio নামক একটি এসিংক্রোনাস রানটাইম ব্যবহার করে।
নোডে বাই ডিফল্ট টাইপ্সক্রিপ্টের কম্পাইলার বিল্ট ইন না। ফলে টাইপ্সক্রিপ্টে কোড করতে হলে এক্সট্রা কনফিগারেশনের প্রয়োজন পড়ে। ডিনোতে বাই ডিফল্ট বিল্ট-ইন টাইপ্সক্রিপ্টের কম্পাইলার রয়েছে।
নোড ES Module System সাপোর্ট করে না। অর্থাৎ কোনো কিছু import করতে হলে require() করতে হয় যা CommonJs মডিউলিং সিস্টেম। ES Module System ব্যবহার করতে হলে Babel এর মত থার্ড পার্টি টুল ব্যবহার করতে হয়। ডিনোতে বাই ডিফল্ট ES Module System ব্যবহার করা যায়। কোনো থার্ড পার্টি টুলের দরকার নাই।
নোডের সব মডিউল npm থেকে হোস্ট করা হয়। অর্থাৎ সব প্যাকেজ/মডিউল একটা সেন্ট্রালাইজড জায়গা থেকে হোস্ট করা হয়। অর্থাৎ নোডের npm এর উপরে একটা ডিপেন্ডেন্সি আছে। অপরপক্ষে ডিনোর মডিউল যেকোনো জায়গা থেকে হোস্ট করা সম্ভব। নোডের npm এর মত এখানে কোনো ডিপেডেন্সি নেই।
ডিনোতে ফাইল, মডিউল, URL সব একই কথা। অর্থাৎ ইম্পোর্ট করার প্রোসেস একই। মানে URL == File == Module. যেমনঃ
import {Box, Grid} from "https://unpkg.com/@material-ui/core@latest/umd/material-ui.development.js"
import {something} from "./app.ts"
import React from "https://unpkg.com/react@16/umd/react.development.js"
নোডে কিন্তু প্রোসেসটা মোটেই এমন না। যেমনঃ
import {Box, Grid} from "@material-ui/core";|
import {something} from "./app.ts"
import React from 'react';
- ডেনোতে ফাইল বা মডিউল সব URL এর মাধ্যমে import করতে হয়। যদি এই প্রোজেক্টে আগে এই মডিউল ইম্পোর্ট করা না থাকে তাহলে ইম্পোর্ট করার সাথে সাথে ডিনো তা ডাওনলোড করে এবং লোকাল মেশিনে ক্যাশ (cache) করে রাখে। ফলে আপনি নিজে থেকে আপডেট না চাইলে এই প্যাকেজ/মডিউলের ভার্শন কখনোই আপডেট নিবে না। তবে আপনি চাইলে –reload এই ফ্ল্যাগ ইউস করে আপডেট করতে পারেন। এই সিস্টেমের ফলে pakage.json এর আর কোনো প্রয়োজনয়ীতাই থাকছে না। কারণ ভার্শন কন্ট্রোল ডিনো বাই ডিফল্ট করছে। নোডে এমন কোনো সিস্টেম নেই। নোডে npm এর মাধ্যমে সব মডিউল ইম্পোর্ট করতে হয়। এবং এই মডিউলগুলোর ভার্শন pakage.json ম্যানেজ করে। যেহেতু ডিনোতে সবকিছুই URL এর মাধ্যমে import করতে হয় তাই ডিনোতে node_modules এর কোনো দরকারই নেই। অপরপক্ষে নোডে মডিউল সিস্টেম node_module ই হ্যান্ডেল করে।
Future Of Deno
আসলে টেক ওয়ার্ল্ডে একদিন পরের ভবিষ্যতও প্রেডিক্ট করা অসম্ভব। কারণ এই জগতটা সদা পরিবর্তনশীল। তবে ডিনোর প্রতি রায়ান ডেলের ডেডিকেশন আর প্রোজেক্টেটির জন্য ডেভেলপার কমিউনিটির এক্সাইটমেন্ট দেখে এতটুকুতো কমপক্ষে সেইফলি বলা যায় যে, ডিনো ডেভেলপমেন্ট জগতে একটা শক্ত অবস্থান তৈরী করতে যাচ্ছে। কারণ নোড এত এত জনপ্রিয়তা অর্জনের পরও রায়ান ডেল নোডের কিছু জিনিস নিয়ে নিজের প্রতি হতাশ; এবং এইসব বিষয় ফিক্স করে ডিনো তৈরী করা! অর্থাৎ বোঝাই যাচ্ছে ডিনো কতটা চমৎকার একটা টেকনোলজি হতে যাচ্ছে আমাদের জন্য। এর ভার্শন ১.০০ আজই (বুধাবার) রিলিজ হচ্ছে। ডিনোর জন্য রইলো শুভকামনা। আশা করি ডেভেলপমেন্ট জগতে ডিনো নতুন মাত্রা যোগ করতে যাচ্ছে।
References:
- Deno, a secure runtime for JavaScript and TypeScript
- What is Deno.js and why should you care?
- A Guide to Deno Core - A Guide to Deno Core
Deno is a New Way to JavaScript - Ryan Dahl & Kitson Kelly - https://www.youtube.com/watch?v=PnRUiS1B_a8&feature=youtu.be&fbclid=IwAR29dr5X_eOc_deaN_7qnzPg0AJq0BeVPh41XwDvGZQFp8nD5RYQWjcFwn4