সোর্স কোড অধ্যয়ন নিঃসন্দেহে আপনার ডেভ কর্মজীবনের গতিপথ পরিবর্তন করতে পারে। এমনকি পৃষ্ঠের নীচের দিকে তাকানো মাত্র একটি স্তর আপনাকে বেশিরভাগ গড় বিকাশকারীদের থেকে আলাদা করতে পারে।
এটা আয়ত্তের প্রথম ধাপ!
এখানে একটি ব্যক্তিগত গল্প: একটি এআই/এমএল স্টার্টআপে আমার বর্তমান গিগে, দলটি ভিজ্যুয়ালাইজেশনের জন্য সার্ভার থেকে ফ্রন্টএন্ডে Neo4j ডেটা কীভাবে পেতে হয় তা বের করতে পারেনি এবং তাদের 12 ঘন্টার মধ্যে একটি উপস্থাপনা ছিল। আমাকে একজন ফ্রিল্যান্সার হিসাবে আনা হয়েছিল, এবং আপনি স্পষ্টতই আতঙ্ক দেখতে পাচ্ছেন। সমস্যাটি ছিল যে Neo4j দ্বারা প্রত্যাবর্তিত ডেটা ভিজ্যুয়ালাইজেশন টুল, neo4jd3 দ্বারা প্রত্যাশিত সঠিক বিন্যাসে ছিল না।
এটি কল্পনা করুন: Neo4jd3 একটি ত্রিভুজ আশা করে, এবং Neo4j একটি বর্গক্ষেত্র প্রদান করে। যে অধিকার সেখানে একটি বেমানান অমিল!
আমরা হয়তো জাভাস্ক্রিপ্ট এবং Neo4j-এর মাধ্যমে গ্রাফ ডেটা সায়েন্স করতে পারব শীঘ্রই মাস্টারড ! এই ছবিটি নস্টালজিক।
শুধুমাত্র দুটি পছন্দ ছিল: সম্পূর্ণ Neo4j ব্যাকএন্ড পুনরায় করুন বা Neo4jd3 এর সোর্স কোড অধ্যয়ন করুন, প্রত্যাশিত বিন্যাসটি বের করুন এবং তারপর একটি ত্রিভুজকে বর্গক্ষেত্রে রূপান্তর করার জন্য একটি অ্যাডাপ্টার তৈরি করুন৷
neo4jd3 <- adapter <- Neo4j
সোর্স কোড পড়ার জন্য আমার মস্তিষ্ক ডিফল্ট হয়েছে, এবং আমি একটি অ্যাডাপ্টার তৈরি করেছি: neo4jd3-ts ।
import createNeoChart, { NeoDatatoChartData } from "neo4jd3-ts";
অ্যাডাপ্টারটি হল NeoDatatoChartData
, এবং বাকি সবকিছুই ইতিহাস৷ আমি এই পাঠটি হৃদয়ে নিয়েছি, এবং আমি যতবার সুযোগ পাই, আমি ব্যবহার করা প্রতিটি সরঞ্জামে আমি একটি স্তর নীচে চলে যাই। এটা এতটাই প্রচলিত হয়ে গেছে যে মাঝে মাঝে আমি ডকুমেন্টেশনও পড়ি না।
এই পদ্ধতিটি আমার ক্যারিয়ারকে ব্যাপকভাবে পরিবর্তন করেছে। আমি যা করি সবকিছু জাদুর মত দেখায়. কয়েক মাসের মধ্যে, আমি গুরুত্বপূর্ণ সার্ভার স্থানান্তর এবং প্রকল্পগুলির নেতৃত্ব দিয়েছিলাম, কারণ আমি উত্সের দিকে একটি পদক্ষেপ নিয়েছিলাম৷
এই সিরিজটি এই সম্পর্কে: API এর জন্য স্থির করা নয়, তবে এর বাইরে গিয়ে এই সরঞ্জামগুলি পুনরায় তৈরি করতে শেখা৷ AI হাইপের এই জগতে গড়পড়তা থেকে বেরিয়ে আসাই একজন বিকাশকারীকে গড়ের চেয়ে মূল্যবান করে তোলে!
এই সিরিজের সাথে আমার পরিকল্পনা হল জনপ্রিয় জাভাস্ক্রিপ্ট লাইব্রেরি এবং সরঞ্জামগুলি অধ্যয়ন করা, তারা কীভাবে কাজ করে এবং আমরা সেগুলি থেকে কী কী প্যাটার্ন শিখতে পারি তা একসাথে খুঁজে বের করা, এক সময়ে একটি টুল।
যেহেতু আমি বেশিরভাগই একজন ব্যাকএন্ড ইঞ্জিনিয়ার (সম্পূর্ণ স্ট্যাক, হ্যাঁ, কিন্তু ব্যাকএন্ড 90% সময় পরিচালনা করি), Express.js এর থেকে শুরু করার জন্য আর কোন ভাল টুল নেই।
আমার অনুমান হল আপনার প্রোগ্রামিং অভিজ্ঞতা আছে এবং প্রোগ্রামিং এর মৌলিক বিষয়গুলো ভালোভাবে বুঝতে পারছেন! আপনি একটি উন্নত শিক্ষানবিস হিসাবে শ্রেণীবদ্ধ করা হতে পারে.
মৌলিক বিষয়গুলি শেখানোর সময় সোর্স কোড শেখা এবং শেখার চেষ্টা করা সত্যিই কঠিন এবং ক্লান্তিকর হবে। আপনি সিরিজে যোগ দিতে পারেন, তবে আশা করা কঠিন হবে। আমি সবকিছু কভার করতে পারি না, তবে আমি যতটা পারি চেষ্টা করব।
এই নিবন্ধটি একটি কারণে প্রাক-এক্সপ্রেস: আমি একটি খুব ছোট লাইব্রেরি কভার করার সিদ্ধান্ত নিয়েছি এক্সপ্রেস নির্ভর করে, মার্জ-ডেসক্রিপ্টর , যা আমি লিখতে গিয়ে 27,181,495টি ডাউনলোড এবং কোডের একটি মাত্র 26 লাইন রয়েছে৷
এটি আমাদেরকে একটি কাঠামো প্রতিষ্ঠা করার সুযোগ দেবে এবং আমাকে অবজেক্টের মৌলিক বিষয়গুলি প্রবর্তন করার অনুমতি দেবে যা জাভাস্ক্রিপ্ট মডিউল তৈরিতে গুরুত্বপূর্ণ।
আমরা এগিয়ে যাওয়ার আগে, নিশ্চিত করুন যে আপনার সিস্টেমে এক্সপ্রেস সোর্স কোড এবং মার্জ-ডেসক্রিপ্টর আছে। এইভাবে, আপনি এটি একটি IDE-তে খুলতে পারেন এবং আমরা কোথায় খুঁজছি তার লাইন নম্বর দিয়ে আমি আপনাকে গাইড করতে পারি।
এক্সপ্রেস একটি গরুর লাইব্রেরি. আমরা অন্য টুলে যাওয়ার আগে আমরা কয়েকটি নিবন্ধে যতটা পারি কভার করব।
আপনার IDE-তে আপনার এক্সপ্রেস উৎস খুলুন, বিশেষত লাইন নম্বর দিয়ে, lib
ফোল্ডারে নেভিগেট করুন এবং express.js
ফাইলটি খুলুন, এন্ট্রি ফাইল।
17 লাইনে, এখানে আমাদের প্রথম লাইব্রেরি রয়েছে:
var mixin = require('merge-descriptors');
ব্যবহার 42 এবং 43 লাইনে রয়েছে:
mixin(app, EventEmitter.prototype, false); mixin(app, proto, false);
আমরা এখানে কি ঘটছে তা অন্বেষণ করার আগে, আমাদের একধাপ পিছিয়ে যেতে হবে এবং ডাটা স্ট্রাকচারের বাইরে জাভাস্ক্রিপ্টের অবজেক্ট সম্পর্কে কথা বলতে হবে। আমরা রচনা, উত্তরাধিকার, প্রোটোটাইপ এবং মিশ্রণ নিয়ে আলোচনা করব—এই নিবন্ধের শিরোনাম।
এক্সপ্রেস সোর্স কোড বন্ধ করুন, এবং আমরা এই গুরুত্বপূর্ণ বস্তুর মৌলিক বিষয়গুলি শিখতে গেলে অনুসরণ করার জন্য কোথাও একটি নতুন ফোল্ডার তৈরি করুন।
অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর মূলে একটি অবজেক্ট হল ডেটা এবং আচরণের একটি এনক্যাপসুলেশন। মজার ঘটনা: জাভাস্ক্রিপ্টের প্রায় সবকিছুই একটি বস্তু।
const person = { // data name: "Jane", age: 0, // behavior grow(){ this.age += 1; } };
person
বস্তুর খোলা এবং বন্ধ বন্ধনীর মধ্যে সবকিছুকে বস্তুর নিজস্ব বৈশিষ্ট্য বলে। এটা গুরুত্বপূর্ণ।
নিজস্ব বৈশিষ্ট্য সরাসরি বস্তুর উপর হয়. name
, age
এবং grow
person
নিজস্ব বৈশিষ্ট্য।
এটি গুরুত্বপূর্ণ কারণ প্রতিটি জাভাস্ক্রিপ্ট অবজেক্টের একটি prototype
বৈশিষ্ট্য রয়েছে। চলুন উপরের বস্তুটিকে একটি ফাংশন ব্লুপ্রিন্টে এনকোড করি যাতে আমরা গতিশীলভাবে person
বস্তু তৈরি করতে পারি।
function createNewPerson(name, age){ this.name = name; this.age = age; } createNewPerson.prototype.print = function(){ console.log(`${this.name} is ${this.age}`); }; const john = new createNewPerson("John", 32);
প্রোটোটাইপ হল কিভাবে জাভাস্ক্রিপ্ট অবজেক্ট অন্যান্য বস্তু থেকে বৈশিষ্ট্য এবং পদ্ধতির উত্তরাধিকারী হয়। Own Properties
এবং Prototype
মধ্যে পার্থক্য হল যখন একটি বস্তুতে একটি সম্পত্তি অ্যাক্সেস করা হয়:
john.name; // access
জাভাস্ক্রিপ্ট প্রথমে Own Properties
দেখবে, কারণ তারা উচ্চ অগ্রাধিকার নেয়। যদি এটি সম্পত্তি খুঁজে না পায়, তবে এটি নাল খুঁজে না পাওয়া পর্যন্ত এবং একটি ত্রুটি ছুঁড়ে না যাওয়া পর্যন্ত এটি বস্তুর নিজস্ব prototype
অবজেক্টে পুনরাবৃত্তিমূলকভাবে দেখায়।
একটি প্রোটোটাইপ বস্তু তার নিজস্ব প্রোটোটাইপের মাধ্যমে অন্য বস্তু থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে। একে বলা হয় প্রোটোটাইপ চেইন।
console.log(john.hasOwnProperty('name')); // true console.log(john.hasOwnProperty('print')); // false, it's in the prototype
যাইহোক, john
print
কাজ করে:
john.print(); // "John is 32"
এই কারণেই জাভাস্ক্রিপ্ট একটি প্রোটোটাইপ-ভিত্তিক ভাষা হিসাবে সংজ্ঞায়িত করা হয়। আমরা প্রোটোটাইপগুলির সাথে কেবলমাত্র বৈশিষ্ট্য এবং পদ্ধতিগুলি যোগ করার চেয়ে আরও বেশি কিছু করতে পারি, যেমন উত্তরাধিকার৷
উত্তরাধিকারের "হ্যালো ওয়ার্ল্ড" হল স্তন্যপায়ী বস্তু। এর জাভাস্ক্রিপ্ট দিয়ে এটি পুনরায় তৈরি করা যাক।
// our Mammal blueprint function Mammal(name) { this.name = name; } Mammal.prototype.breathe = function() { console.log(`${this.name} is breathing.`); };
জাভাস্ক্রিপ্টে, Object
অবজেক্টের ভিতরে একটি স্ট্যাটিক ফাংশন আছে:
Object.create();
এটি {}
এবং new functionBlueprint
অনুরূপভাবে একটি বস্তু তৈরি করে, কিন্তু পার্থক্যটি create
একটি প্রোটোটাইপকে উত্তরাধিকার সূত্রে একটি প্যারামিটার হিসেবে নিতে পারে।
// we use a cat blueprint function here (implemented below) Cat.prototype = Object.create(Mammal.prototype); // correction after we inherited all the properties Cat.prototype.constructor = Cat;
এখন Cat
Mammal
মধ্যে breathe
পদ্ধতি পাওয়া যাবে, তবে জানার গুরুত্বপূর্ণ বিষয় হল Cat
তার প্রোটোটাইপ হিসাবে Mammal
নির্দেশ করছে।
স্তন্যপায়ী ব্লুপ্রিন্ট : আমরা প্রথমে Mammal
ফাংশন সংজ্ঞায়িত করি এবং এর প্রোটোটাইপে একটি breathe
পদ্ধতি যোগ করি।
Cat Inheritance : আমরা Cat
ফাংশন তৈরি করি এবং Cat.prototype
কে Object.create(Mammal.prototype)
এ সেট করি। এটি Cat
প্রোটোটাইপকে Mammal
থেকে উত্তরাধিকারী করে তোলে, তবে এটি constructor
পয়েন্টারকে Mammal
এ পরিবর্তন করে।
কনস্ট্রাক্টর সংশোধন করা : আমরা Cat.prototype.constructor
কে ঠিক করে Cat
এর দিকে নির্দেশ করি, নিশ্চিত করি যে Mammal
থেকে উত্তরাধিকারসূত্রে পাওয়া পদ্ধতিতে Cat
বস্তুটি তার পরিচয় বজায় রাখে। অবশেষে, আমরা Cat
এ একটি meow
পদ্ধতি যোগ করি।
এই পদ্ধতির সাহায্যে Cat
বস্তুকে Mammal
(যেমন breathe
) এবং তার নিজস্ব প্রোটোটাইপ (যেমন meow
) উভয় থেকে পদ্ধতি অ্যাক্সেস করতে দেয়।
আমাদের সেটা সংশোধন করতে হবে। আসুন সম্পূর্ণ উদাহরণ তৈরি করা যাক:
function Cat(name, breed) { this.name = name; this.breed = breed; } Cat.prototype = Object.create(Mammal.prototype); // cat prototype pointing to mammal // correction after we inherited all the properties Cat.prototype.constructor = Cat; // we are re-pointing a pointer, the inherited properties are still there Cat.prototype.meow = function() { console.log(`${this.name} is meowing.`); };
Cat.prototype.constructor = Cat
বোঝার জন্য, আপনাকে পয়েন্টার সম্পর্কে জানতে হবে। যখন আমরা Object.create
দিয়ে Mammal
থেকে উত্তরাধিকার পাই, তখন এটি আমাদের Cat
প্রোটোটাইপের পয়েন্টারকে Mammal
এ পরিবর্তন করে, যা ভুল। আমরা এখনও চাই যে আমাদের Cat
তার নিজস্ব ব্যক্তি হোক, পিতামাতা Mammal
থাকা সত্ত্বেও।
এজন্য আমাদের এটি সংশোধন করতে হবে।
এই উদাহরণে, প্রোটোটাইপ চেইন ব্যবহার করে Cat
Mammal
থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। Cat
বস্তুটি breathe
এবং meow
পদ্ধতি উভয়ই অ্যাক্সেস করতে পারে।
const myCat = new Cat("Misty", "Ragdoll"); myCat.breathe(); // Misty is breathing. myCat.meow(); // Misty is meowing.
আমরা স্তন্যপায়ী প্রাণী থেকে উত্তরাধিকারসূত্রে একটি কুকুর তৈরি করতে পারি:
function Dog(name, breed) { this.name = name; this.breed = breed; } Dog.prototype = Object.create(Mammal.prototype); Dog.prototype.constructor = Dog; Dog.prototype.bark = function() { console.log(`${this.name} is barking.`); }; const myDog = new Dog('Buddy', 'Golden Retriever'); myDog.breathe(); // Buddy is breathing. myDog.bark(); // Buddy is barking.
আমরা মৌলিক শাস্ত্রীয় উত্তরাধিকার তৈরি করেছি, কিন্তু কেন এটি গুরুত্বপূর্ণ? আমি ভেবেছিলাম আমরা সোর্স কোড কভার করছি!
হ্যাঁ, সত্য, কিন্তু প্রোটোটাইপগুলি উত্তরাধিকারের বাইরে দক্ষ এবং নমনীয় মডিউল তৈরির মূল। এমনকি সাধারণ, ভাল-লিখিত মডিউলগুলি প্রোটোটাইপ বস্তুর সাথে চড়ে যায়। আমরা শুধু বেসিক পাড়া হয়.
উত্তরাধিকারের বিকল্প হল অবজেক্ট কম্পোজিশন, যা ঢিলেঢালাভাবে দুই বা ততোধিক অবজেক্ট নেয় এবং সেগুলোকে একত্রিত করে একটি "সুপার" অবজেক্ট তৈরি করে।
মিক্সিনগুলি উত্তরাধিকার ব্যবহার না করেই বস্তুকে অন্যান্য বস্তু থেকে পদ্ধতি ধার করার অনুমতি দেয়। তারা সম্পর্কহীন বস্তুর মধ্যে আচরণ ভাগ করার জন্য সহজ।
আমাদের প্রথম অন্বেষণ যা করে: merge-descriptors
লাইব্রেরি আমরা প্রথমে কভার করার প্রতিশ্রুতি দিয়েছিলাম।
আমরা ইতিমধ্যেই দেখেছি কোথায় এবং কিভাবে এটি এক্সপ্রেসে ব্যবহার করা হয়। এখন আমরা অবজেক্ট কম্পোজিশনের জন্য এটি জানি।
17 লাইনে, এখানে আমাদের প্রথম লাইব্রেরি রয়েছে:
var mixin = require('merge-descriptors');
ব্যবহার 42 এবং 43 লাইনে রয়েছে:
mixin(app, EventEmitter.prototype, false); mixin(app, proto, false);
আমরা যা জানি তা দিয়ে আমরা ইতিমধ্যে অনুমান করতে পারি যে mixin
app
নামক একটি বস্তুতে EventEmitter.prototype
এবং proto
রচনা করছে।
আমরা যখন এক্সপ্রেস সম্পর্কে কথা বলতে শুরু করব তখন আমরা app
উঠব।
এটি merge-descriptors
জন্য সম্পূর্ণ সোর্স কোড:
'use strict'; function mergeDescriptors(destination, source, overwrite = true) { if (!destination) { throw new TypeError('The `destination` argument is required.'); } if (!source) { throw new TypeError('The `source` argument is required.'); } for (const name of Object.getOwnPropertyNames(source)) { if (!overwrite && Object.hasOwn(destination, name)) { // Skip descriptor continue; } // Copy descriptor const descriptor = Object.getOwnPropertyDescriptor(source, name); Object.defineProperty(destination, name, descriptor); } return destination; } module.exports = mergeDescriptors;
শুরু থেকে, সর্বদা ফাংশনটি কীভাবে ব্যবহার করা হয় এবং এর জন্য কী প্যারামিটার লাগে তা দেখুন:
// definition mergeDescriptors(destination, source, overwrite = true) // usage var mixin = require('merge-descriptors'); mixin(app, EventEmitter.prototype, false); mixin(app, proto, false);
App
আমাদের গন্তব্য। আমরা জানি mixin
মানে বস্তুর গঠন। মোটামুটিভাবে, এই প্যাকেজটি যা করছে তা হল গন্তব্য অবজেক্টে সোর্স অবজেক্ট রচনা করা, ওভাররাইট করার একটি বিকল্প সহ।
ওভাররাইট, অনুমান অনুসারে, যদি app
(গন্তব্য) একটি সঠিক সম্পত্তি থাকে, true
ওভাররাইট করার সময়, অন্যথায় সেই সম্পত্তিটিকে স্পর্শ না করে রেখে যান এবং এড়িয়ে যান।
আমরা জানি বস্তুর একই সম্পত্তি দুইবার থাকতে পারে না। কী-মান জোড়ায় (বস্তু), কী অনন্য হওয়া উচিত।
এক্সপ্রেসের সাথে, ওভাররাইট false
।
নিম্নোক্ত মৌলিক গৃহস্থালি, সর্বদা প্রত্যাশিত ত্রুটিগুলি পরিচালনা করুন:
if (!destination) { throw new TypeError('The `destination` argument is required.'); } if (!source) { throw new TypeError('The `source` argument is required.'); }
এখানেই এটি আকর্ষণীয় হয়ে ওঠে: লাইন 12।
for (const name of Object.getOwnPropertyNames(source)) {
উপরে থেকে, আমরা জানি OwnProperty
বলতে কী বোঝায়, তাই getOwnPropertyNames
স্পষ্ট অর্থ হল নিজস্ব বৈশিষ্ট্যের কী পাওয়া।
const person = { // data name: "Jane", age: 0, // behavior grow() { this.age += 1; } }; Object.getOwnPropertyNames(person); // [ 'name', 'age', 'grow' ]
এটি একটি অ্যারে হিসাবে কীগুলি ফেরত দেয় এবং আমরা নিম্নলিখিত উদাহরণে সেই কীগুলির উপর লুপ করছি:
for (const name of Object.getOwnPropertyNames(source)) {
নিম্নলিখিতটি পরীক্ষা করছে যে গন্তব্য এবং উত্সের একই কী আছে কিনা আমরা বর্তমানে লুপ করছি:
if (!overwrite && Object.hasOwn(destination, name)) { // Skip descriptor continue; }
যদি ওভাররাইট মিথ্যা হয়, সেই সম্পত্তিটি এড়িয়ে যান; ওভাররাইট করবেন না। এটিই continue
যায়-এটি লুপটিকে পরবর্তী পুনরাবৃত্তিতে চালিত করে এবং নীচে কোডটি চালায় না, যা নিম্নলিখিত কোড:
// Copy descriptor const descriptor = Object.getOwnPropertyDescriptor(source, name); Object.defineProperty(destination, name, descriptor);
getOwnProperty
মানে আমরা ইতিমধ্যেই জানি। নতুন শব্দটি descriptor
। আসুন আমাদের নিজস্ব person
বস্তুতে এই ফাংশনটি পরীক্ষা করি:
const person = { // data name: "Jane", age: 0, // behavior grow() { this.age += 1; } }; Object.getOwnPropertyDescriptor(person, "grow"); // { // value: [Function: grow], // writable: true, // enumerable: true, // configurable: true // }
এটি মান হিসাবে আমাদের grow
ফাংশন প্রদান করে এবং পরবর্তী লাইনটি স্ব-ব্যাখ্যামূলক:
Object.defineProperty(destination, name, descriptor);
এটি উৎস থেকে আমাদের বর্ণনাকারীকে নিয়ে যাচ্ছে এবং গন্তব্যে লিখছে। এটি উৎসের নিজস্ব বৈশিষ্ট্যগুলিকে আমাদের গন্তব্য বস্তুর নিজস্ব বৈশিষ্ট্য হিসাবে অনুলিপি করছে।
আমাদের person
বস্তুর একটি উদাহরণ করা যাক:
const val = { value: function isAlien() { return false; }, enumerable: true, writable: true, configurable: true, }; Object.defineProperty(person, "isAlien", val);
এখন person
isAlien
সম্পত্তি সংজ্ঞায়িত করা উচিত.
সংক্ষেপে, এই অত্যন্ত ডাউনলোড করা মডিউলটি ওভাররাইট করার বিকল্প সহ একটি উৎস অবজেক্ট থেকে একটি গন্তব্যে নিজস্ব বৈশিষ্ট্য কপি করে।
আমরা সফলভাবে এই সোর্স কোড টিয়ারে আমাদের প্রথম মডিউলটি কভার করেছি, আরও উত্তেজনাপূর্ণ জিনিস সামনে আসবে।
এটি একটি ভূমিকা ছিল. আমরা মডিউলটি বোঝার জন্য প্রয়োজনীয় মৌলিক বিষয়গুলি কভার করে শুরু করেছি এবং একটি উপজাত হিসাবে, বেশিরভাগ মডিউলের নিদর্শনগুলি বুঝতে পারি, যা বস্তুর গঠন এবং উত্তরাধিকার। অবশেষে, আমরা merge-descriptors
মডিউল নেভিগেট করেছি।
এই প্যাটার্ন বেশিরভাগ নিবন্ধে প্রচলিত হবে। যদি আমি মনে করি কভার করার জন্য প্রয়োজনীয় মৌলিক বিষয়গুলি আছে, আমরা প্রথম বিভাগে সেগুলির মধ্য দিয়ে যাব এবং তারপরে উত্স কোডটি কভার করব৷
সৌভাগ্যবশত, এক্সপ্রেস-এ merge-descriptors
ব্যবহার করা হয়, যা আমাদের স্টার্ট সোর্স কোড স্টাডি হিসাবে আমাদের ফোকাস। তাই আরও Express.js সোর্স কোড নিবন্ধের আশা করুন যতক্ষণ না আমরা অনুভব করি যে আমরা এক্সপ্রেসের যথেষ্ট ভাল রান করেছি, তারপরে Node.js এর মতো অন্য মডিউল বা টুলে স্যুইচ করুন।
আপনি চ্যালেঞ্জ হিসাবে ইতিমধ্যে যা করতে পারেন তা হল মার্জ ডিসক্রিপ্টরগুলিতে পরীক্ষা ফাইলে নেভিগেট করুন, পুরো ফাইলটি পড়ুন। আপনার নিজের থেকে উত্স পড়া গুরুত্বপূর্ণ, চেষ্টা করুন এবং এটি কি করে এবং পরীক্ষা করছে তা খুঁজে বের করুন তারপর এটি ভেঙে ফেলুন, হ্যাঁ এবং এটি আবার ঠিক করুন বা আরও পরীক্ষা যোগ করুন!
আপনি যদি আপনার প্রোগ্রামিং দক্ষতা বাড়ানোর জন্য আরও একচেটিয়া ব্যবহারিক এবং দীর্ঘ সামগ্রীতে আগ্রহী হন, আপনি Ko-fi এ আরও জানতে পারেন।