Srovnání CommonJS a AMD/RequireJS

Úvod

Na rozdíl od webových serverů, jako jsou Apache a Microsoft IIS, které jsou předkonfigurované, je node.js zcela odlišný. S node.js si vývojáři vytvářejí webové servery od základu. Od vývojáře se očekává, že jeho kódovací dovednosti webový server zabezpečí. Tím se Node.js liší od Apache a ostatních.

V tomto článku se zaměříme na dva hlavní systémové moduly – AMD a Common.js – v node.js. Než je porovnáme, musíme probrat rozdíly mezi oběma systémovými moduly. Dvě návodné otázky, které nám pomohou je porovnat, jsou: který z nich je rychlejší při načítání modulů v prohlížeči nebo z něj a jak převést jeden systémový modul tak, aby zdědil některé vlastnosti jiného systémového modulu.

Tento článek se nebude věnovat základům node.js amd javascript. Nebude se zabývat tématy jako „jak nainstalovat node.js“, „jak používat npm nebo nave k instalaci balíčků“ nebo „různé verze node.js pro různé projekty“. Naším cílem je vyřešit zmatek mezi AMD a Common.js. Proto budeme lehce klást důraz na základní moduly v node.js, pár funkcí a proměnných a nakonec zaměříme pozornost na AMD a Common.js a na to, jak můžeme převést jeden ze systémových modulů, aby se moduly v prohlížeči načítaly rychleji.

Základní, souborové a externí uzlové moduly

V node.js existují tři hlavní důležité moduly: základní, souborové a externí uzlové moduly. Začněme nejprve souborovým modulem, protože je snadněji uchopitelný.

  • Souborový modul:
    Na rozdíl od ostatních dvou modelů je souborový model založen na relativní cestě. Proč? Řekněme, že byste chtěli exportovat modul pomocí následující syntaxe:
 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');};

Způsob, jakým se moduly načítají nebo importují do souborů, je zcela odlišný od modulů core a external_node; proto se ostatním dvěma říká také moduly založené na nerelativní cestě.

Poznámka: v node.js existují rozmanité způsoby exportu modulů/souborů. Anonymní funkce je dalším ze způsobů exportu modulu ze souboru.

  • Jádrové moduly:
    Další moduly, které zahrnují tři hlavní moduly v node.js, jsou základní moduly. Jádrové moduly jsou moduly, které nejsou založeny na relacích. Velmi se liší od souborových modulů, zejména pokud vyžadujete (nebo importujete) moduly do souborů.

Příklad pokud bychom v node.js spotřebovali modul path, který opravuje lomítka tak, aby byla specifická pro operační systém, stará se o . a . v cestě a také odstraňuje duplicitní lomítka, nezahrnuli bychom relativní cestu:

var require = require('path') console.log (path.normalize ('/foo/bar/......'));
  • moduly external_node:
    Tyto moduly spadají někam mezi jádro a moduly založené na souborech. Moduly external_node se docela podobají modulům založeným na souborech, zejména když modul exportujete.
module.exports = function () {console.log('called node modules!');} 

Při načítání modulů se však dost liší.

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

Dále node.js poskytují některé důležité globální s užitečnými funkcemi, které nebudeme podrobně rozebírat. timer,console, _filename a_dirname a process jsou příklady důležitých globálů v node.js. Například _filename a _dirname jsou k dispozici v každém souboru a umožňují přístup k úplné cestě a adresáři pro aktuální modul.

Teď, když máme stručnou představu o modulech v node.js, přejděme k hlavnímu aspektu, kde rozlišujeme moduly CommonJS a AMD. Budeme řešit problémy „proč je Common.js tak pomalý při načítání modulů z prohlížeče“ a „jak jej můžeme převést pomocí browserify, aby zdědil některé vlastnosti AMD a Require.js“. .

Představujeme CommonJS a 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. 

Uvažujme například, jak se načítají dva moduly v prostředí na straně serveru:

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

Podíváme-li se na výše uvedený příklad, je na straně serveru považováno za dobrou praxi, když se jeden modul načítá, zatímco druhý modul čeká na parsování jiného modulu.

Jinými slovy, když se načítá modul foo, modul bar se nebude parsovat ani zpracovávat, dokud nebude modul foo zcela načten. Dokonce ani server se nemusí dozvědět o modulu bar, dokud neskončí s modulem foo.

Použití stejného systému modulů v prohlížeči není považováno za dobrý nápad, protože každý systém modulů by musel vyvolat požadavek HTTP na server. To je v prostředí serveru mnohem méně efektivní a méně spolehlivé. Zhoršuje to uživatelský zážitek na straně klienta. Tento problém by se dal vyřešit pomocí asynchronního načítání modulů.

Tady přichází na řadu společnost AMD. AMD, známé také jako asynchronní definice modulů, bylo zavedeno pro podporu asynchronního načítání modulů v prohlížeči –
v konečném důsledku řeší pomalou rychlost načítání modulů v prohlížeči. V souladu s významem slova „asynchronní“ se moduly spouštějí v různých časech.

Chceme-li v AMD něco exportovat do souboru, musíme jednoduše zahrnout funkci zpětného volání a vrátit ji z funkce zpětného volání define. Zde je příklad:

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

Stejně jako syntaxe proměnné export v node.JS, i funkce define přijímá speciální argument nazvaný exports, který je docela podobný tomu v node.JS.

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

Aby bylo možné v prohlížeči načíst dva moduly, musíme stáhnout a nainstalovat RequireJS. Mějte na paměti, že se jedná pouze o možnost, která brání vývojářům používat kód node.JS v prohlížeči]

Proč potřebujeme RequireJS, abychom mohli načítat moduly prostřednictvím asynchronní definice modulu?
Tady je důvod: protože funkce Define, která je součástí kódu níže (ukazuje nám, jak můžeme v prohlížeči načíst více než jeden modul prostřednictvím AMD), není nativní pro prohlížeč. Proto je nejlepší možností přistupovat k ní z knihovny třetí strany. RequireJS je jednoduše javascriptový soubor, který zahrnete do svého projektu.

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

Jak převést node.js do kódu prohlížeče:

Nyní se podíváme, jak můžeme převést CommonJS, aby se stal kompatibilním s AMD/RequireJS pomocí browserify. Převedení CommonJS přes browserify umožňuje, aby node.js načítal moduly v prohlížeči podobně jako AMD/RequireJS.

Nainstalujme browserify pomocí následujícího kódu. Při instalaci se ujistěte, že jste připojeni k internetu. Spojovník g jednoduše znamená globální.

npm install –g browserify

Můžete vytvářet moduly, pojmenovat je jako clientJS nebo jakýmkoli jiným názvem a nakonec je pomocí browserify převést na AMD/RequireJS.

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

Nyní, abychom výše uvedený kód převedli tak, aby byl kompatibilní s AMD, jinými slovy, aby načítal moduly asynchronně, musíme tak učinit prostřednictvím následujících argumentů příkazového řádku:

browserify client.js -o amdmodule.js

Klientovi můžete přiřadit libovolné jméno, které preferujete. Nemělo by to být vždy client.js, ale i client.js je vhodnější. Nezapomeňte, že se jedná pouze o soubor. Kromě toho se můžete podívat na další konfiguraci o browserify na adrese http://browserify.org/.

Závěr:

Nakonec byste si měli uvědomit, že ne všechny moduly node.JS lze převést tak, aby efektivně fungovaly v prohlížeči. Ty, které jsou závislé na funkcích dostupných na straně serveru, nebudou v prohlížeči fungovat vůbec.

Právě jsem představil AMD/RequireJS jako řešení, které umožňuje asynchronní načítání modulů v prohlížeči, což je považováno za dobrou praxi. Asynchronní načítání modulů je mnohem rychlejší a spolehlivější než používání CommonJS v prohlížeči.

Leave a Reply