Comparare între CommonJS și AMD/RequireJS

Introducere

Spre deosebire de serverele web cum ar fi Apache și Microsoft IIS, ambele pre-configurate, node.js este destul de diferit. Cu node.js, dezvoltatorii construiesc servere web de la zero. Se așteaptă ca abilitățile de codare ale unui dezvoltator să protejeze serverul web. Astfel, Node.js diferă de Apache și de restul.

În acest articol, ne vom concentra pe două module principale de sistem – AMD și Common.js – în node.js. Înainte de a le compara, trebuie să discutăm diferențele dintre cele două module de sistem. Două întrebări orientative care ne ajută să le comparăm pe cele două sunt: care dintre ele este mai rapid la încărcarea modulelor în sau din browser și cum să convertim un modul de sistem pentru a moșteni unele caracteristici ale altui modul de sistem.

Acest articol nu se va concentra pe elementele de bază ale node.js amd javascript. Nu va aborda subiecte precum „cum se instalează node.js”, „cum se utilizează npm sau nave pentru a instala pachete” sau „diferite versiuni de node.js pentru diferite proiecte”. Scopul nostru este de a rezolva confuzia dintre AMD și Common.js. Prin urmare, vom pune ușor accentul pe modulele de bază din node.js, pe câteva funcții și variabile și, în cele din urmă, ne vom îndrepta atenția către AMD și Common.js și pe modul în care putem converti unul dintre modulele de sistem pentru a încărca modulele mai rapid în browser.

Modulele Node de bază, de fișier și externe

În node.js, există trei module principale importante; modulele de bază, de fișier și modulele externe de nod. Să începem mai întâi cu modulul de fișier, deoarece este mai ușor de înțeles.

  • Modulul de fișier:
    În comparație cu celelalte două modele, modelul de fișier este un model bazat pe calea relativă. De ce? Să presupunem că ați dori să exportați un modul prin următoarea sintaxă:
 module.exports = foo { 'something' : 123 } ; 
 var foo = function () { console.log('foo called'); };
var b = function () { console.log('b called'); }; 
module.exports = { b : b };
module.exports.bar = function () {console.log('bar called');}; 
module.exports.bas = function () {console.log('bas called');};

Modul în care modulele sunt încărcate sau importate în fișiere este destul de diferit față de modulele core și external_node; de aceea celelalte două sunt cunoscute și ca module bazate pe nume nerelativ.

Note: există diverse moduri de a exporta module/fișiere în node.js. Funcția anonimă este o altă modalitate de a exporta un modul dintr-un fișier.

  • Modulele de bază:
    Următoarele module care includ cele trei module principale din node.js sunt modulele de bază. Modulele de bază sunt module care nu se bazează pe relații. Ele sunt foarte diferite de modulele de fișiere, în special atunci când solicitați (sau importați) module în fișiere.

De exemplu, dacă am consuma modulul path din node.js, care repară slash-urile pentru a fi specifice sistemului de operare, are grijă de . și .. în cale și, de asemenea, elimină slash-urile duplicate, nu am include calea relativă:

var require = require('path') console.log (path.normalize ('/foo/bar/......'));
  • modulele external_node:
    Aceste module se încadrează undeva între modulele de bază și modulele bazate pe fișiere. Modulele external_node sunt destul de asemănătoare cu cele bazate pe fișiere, în special atunci când exportați un modul.
module.exports = function () {console.log('called node modules!');} 

Cu toate acestea, atunci când încărcați modulele, ele devin destul de diferite.

var bar = require('bas');bas(); // 

În plus, node.js oferă câteva caracteristici globale importante cu funcții utile, pe care nu le vom discuta în detaliu. timer,console, _filename și_dirname, și process sunt toate exemple de globale importante în node.js. De exemplu, _filename și _dirname sunt disponibile în fiecare fișier și oferă acces la calea și directorul complet pentru modulul curent.

Acum că avem o scurtă înțelegere a modulelor în node.js, să trecem la aspectul principal, în care diferențiem modulele CommonJS și AMD. Vom aborda problemele legate de „de ce Common.js este atât de lent la încărcarea modulelor din browser” și „cum îl putem converti prin browserify pentru a moșteni anumite caracteristici ale AMD și Require.js”. .

Prezentarea CommonJS și AMD

 CommonJS is a great module for the server side environment, especially when you have immediate access to the filesystem. However, using the same module system in the browser may be less reliable and extremely slow. 

De exemplu, să luăm în considerare modul în care cele două module sunt încărcate în mediul server side:

var foo = require('./foo');var bar = require('./bar');// more code here 

Cu privire la exemplul de mai sus, este considerată o bună practică pe partea de server atunci când un modul este încărcat în timp ce celălalt modul așteaptă ca un alt modul să fie analizat.

Cu alte cuvinte, atunci când modulul foo este încărcat, barul nu va fi analizat sau procesat până când foo nu este încărcat complet. Chiar și serverul ar putea să nu fie conștient de modulul bar până când nu termină cu modulul foo.

Utilizarea aceluiași sistem de module în browser nu este considerată o idee bună, deoarece fiecare sistem de module ar trebui să declanșeze o cerere HTTP către server. Acest lucru este mult mai puțin eficient și mai puțin fiabil în mediul server. Degradează experiența utilizatorului pe partea de client. Această problemă ar putea fi rezolvată prin încărcarea asincronă a modulelor.

Aici intervine AMD. AMD, cunoscut și sub numele de definiție asincronă a modulelor, a fost introdus pentru a sprijini încărcarea asincronă a modulelor în browser –
în cele din urmă rezolvă rata lentă de încărcare a modulelor în browser. În conformitate cu semnificația cuvântului „asincron”, modulele sunt declanșate la momente diferite.

Pentru a exporta ceva într-un fișier în AMD, trebuie pur și simplu să includem o funcție de apelare și să o returnăm dintr-o funcție de apelare definită. Iată un exemplu:

 define(, function () { var foo = function () { console.log ('foo was called');}; return foo; // function foo is exported});

La fel ca și sintaxa variabilei de export din node.JS, funcția define ia, de asemenea, un argument special numit exports, care este destul de asemănător cu cel din node.JS.

define(, function (exports) {var bas = exports.log = function () {console.log ('bas.log was called'); };});

Pentru a face posibilă încărcarea a două module în browser, trebuie să descărcăm și să instalăm RequireJS. Rețineți că aceasta este doar o opțiune care împiedică dezvoltatorii să folosească codul node.JS în browser]

De ce avem nevoie de RequireJS pentru a putea încărca modulele prin intermediul definiției asincrone a modulelor?
Iată care este motivul: pentru că funcția Define, care face parte din codul de mai jos (care ne arată cum putem încărca mai multe module în browser prin AMD), nu este nativă browserului. Prin urmare, cea mai bună opțiune este să o accesăm dintr-o bibliotecă terță parte. RequireJS este pur și simplu un fișier javascript pe care îl includeți în proiectul dumneavoastră.

define(, function(foo, bar){ //more code here// more code here }); 

Cum să convertiți node.js în cod de browser:

Acum, să vedem cum putem converti CommonJS pentru a deveni compatibil cu AMD/RequireJS prin intermediul browserify. Conversia CommonJS prin browserify permite lui node.js să încarce modulele în browser similar cu AMD/RequireJS.

Să instalăm browserify prin următorul cod. Vă rugăm să vă asigurați că sunteți conectat la internet whilse instalare. G-ul cu cratimă înseamnă pur și simplu global.

npm install –g browserify

Puteți să creați module, să le numiți clientJS sau orice nume preferați și, în cele din urmă, să le convertiți în AMD/RequireJS folosind browserify.

module.exports = function () {console.log('bas was called');}
exports.log = function () {console.log('bar.log was called');}

Acum, pentru a converti codul de mai sus pentru a fi compatibil AMD, cu alte cuvinte, pentru a încărca modulele în mod asincron, trebuie să facem acest lucru prin intermediul următoarelor argumente din linia de comandă:

browserify client.js -o amdmodule.js

Puteți atribui orice nume pe care îl preferați pentru a fi client. Nu trebuie să fie întotdeauna client.js, dar și client.js este de preferat. Nu uitați că este doar un fișier. În plus, puteți verifica mai multe configurații despre browserify la .

Încheiere:

În final, trebuie să rețineți că nu toate modulele node.JS pot fi convertite pentru a funcționa eficient în browser. Cele care depind de caracteristici care sunt disponibile pe partea serverului nu vor funcționa deloc în browser.

Tocmai am introdus AMD/RequireJS ca o soluție care permite încărcarea asincronă a modulelor în browser, ceea ce este considerat o bună practică. Încărcarea asincronă a modulelor este mult mai rapidă și mai fiabilă decât utilizarea CommonJS în browser.

.

Leave a Reply