CommonJS և ES Modules համատեղում Node.js-ում
Node.js-ում սկզբնական տարբերակներում օգտագործվում էր միայն CommonJS մոդուլային համակարգը (require և module.exports)։ Սակայն ժամանակի ընթացքում Node.js սկսեց աջակցել նաև ES Modules-ին (import և export)՝ տալով ծրագրավորողներին ավելի մեծ ճկունություն։
Այսօր հնարավոր է օգտագործել երկու համակարգերն էլ, բայց դրանք համատեղելիս կան որոշ կարևոր նրբություններ։
Ինչպե՞ս օգտագործել ES Modules Node.js-ում
Որպեսզի Node.js-ը իմանա, որ քո ֆայլը ES Module է, պետք է անել հետևյալից մեկը՝
- Կոնկրետ ֆայլի վերջավորությունը դարձնել .mjs (օրինակ՝
index.mjs)։ - Կամ package.json ֆայլում ավելացնել
"type": "module"դաշտը․
{
"type": "module"
}
Այն ժամանակ բոլոր .js ֆայլերը կընկալվեն որպես ES Modules։
CommonJS-ից ES Module ներմուծում
Եթե ունես CommonJS մոդուլ և ուզում ես այն օգտագործել ES Modules-ից, պետք է օգտագործես import-ի հատուկ ձևաչափ։ Օրինակ՝
// greet.cjs ֆայլ (CommonJS)
module.exports = function(name) {
return `Բարև, ${name}!`;
};
// main.mjs ֆայլ (ES Module)
import greet from './greet.cjs';
console.log(greet('Անի')); // Բարև, Անի!
Node.js ավտոմատ կերպով կվերածի CommonJS մոդուլը default export-ի նման՝ որպեսզի հնարավոր լինի import անել։
ES Module-ից CommonJS ներմուծում
Եթե ուզում ես CommonJS կոդում օգտագործել ES Module, գործը մի փոքր ավելի բարդ է։ Հնարավոր չէ ուղղակիորեն require() անել ES Module։ Այս դեպքում պետք է օգտագործել դինամիկ import() ֆունկցիան, որը վերադարձնում է Promise։
// greet.mjs ֆայլ (ES Module)
export function greet(name) {
return `Բարև, ${name}!`;
}
// main.cjs ֆայլ (CommonJS)
async function loadGreet() {
const { greet } = await import('./greet.mjs');
console.log(greet('Անի')); // Բարև, Անի!
}
loadGreet();
Այս մոտեցումը պահանջում է async ֆունկցիաներ, քանի որ import() ֆունկցիան Promise է վերադարձնում։
Հիմնական տարբերություններ Node.js-ում
- CommonJS ներմուծումները սինխրոն են, իսկ ES Modules ներմուծումները՝ ասինխրոն։
- CommonJS-ում կարող ես դինամիկ որոշել, թե որ մոդուլ ներմուծել (runtime ժամանակ), իսկ ES Modules-ում import հայտարարությունները պետք է լինեն ֆայլի սկզբում։
- CommonJS մոդուլները պահվում են cache-ում անմիջապես require-ից հետո։
- ES Modules ավելի լավ են աշխատում նոր գործիքների և օպտիմիզացիաների (օրինակ՝ tree-shaking) հետ։
Եզրակացություն
Node.js-ում այժմ հնարավորություն կա օգտագործելու թե՛ CommonJS, թե՛ ES Modules, սակայն համատեղում անելիս կարևոր է հասկանալ սինթաքսիկ և տեխնիկական տարբերությունները։ Առաջարկվում է նոր նախագծերում հնարավորության դեպքում նախընտրել ES Modules, քանի որ դրանք համապատասխանում են JavaScript-ի նոր ստանդարտներին և ապահովում են ավելի լավ համատեղելիություն առաջադեմ գործիքների հետ։