CommonJS:n ja AMD/RequireJS:n vertailu
Johdanto
Toisin kuin Apachen ja Microsoft IIS:n kaltaiset verkkopalvelimet, jotka molemmat ovat valmiiksi konfiguroituja, node.js on aivan erilainen. Node.js:n avulla kehittäjät rakentavat web-palvelimet tyhjästä. Kehittäjän koodaustaitojen odotetaan turvaavan web-palvelimen. Näin Node.js eroaa Apachesta ja muista.
Tässä artikkelissa keskitymme node.js:n kahteen tärkeimpään järjestelmämoduuliin – AMD ja Common.js. Ennen kuin vertailemme näitä kahta, meidän on keskusteltava näiden kahden järjestelmämoduulin eroista. Kaksi ohjaavaa kysymystä, jotka auttavat meitä vertailemaan näitä kahta ovat: kumpi on nopeampi ladattaessa moduuleja selaimessa tai selaimesta ja miten muuntaa yksi järjestelmämoduuli perimään joitakin ominaisuuksia toisesta järjestelmämoduulista.
Tässä artikkelissa ei keskitytä node.js:n ja javascriptin perusteisiin. Se ei käsittele sellaisia aiheita kuin ”miten node.js asennetaan”, ”miten npm:ää tai navea käytetään pakettien asentamiseen” tai ”node.js:n eri versiot eri projekteille”. Tarkoituksenamme on ratkaista AMD:n ja Common.js:n välinen sekaannus. Siksi painotamme kevyesti node.js:n ydinmoduuleja, paria funktiota ja muuttujaa ja lopulta suuntaamme huomiomme AMD:hen ja Common.js:ään ja siihen, miten voimme muuntaa yhden järjestelmämoduuleista niin, että moduulit latautuvat nopeammin selaimessa.
Ydin-, tiedosto- ja ulkoiset solmumoduulit
Node.js:ssä on kolme tärkeintä päämoduulia; Ydin-, tiedosto- ja ulkoiset solmumoduulit. Aloitetaan ensin tiedostomoduulista, koska se on helpompi ymmärtää.
- Tiedostomoduuli:
Kahdesta muusta mallista poiketen tiedostomalli on suhteelliseen polkuun perustuva malli. Miksi? Oletetaan, että haluaisit viedä moduulin seuraavalla syntaksilla:
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');};
Tapa, jolla moduulit ladataan tai tuodaan tiedostoihin, on aivan erilainen kuin core- ja external_node-moduuleissa; siksi kahta muuta kutsutaan myös ei-suhteelliseen polkuun perustuviksi moduuleiksi.
Huomautus: moduulien/tiedostojen viemiseen node.js:ssä on olemassa monenlaisia tapoja. Anonyymi funktio on toinen tapa viedä moduuli tiedostosta.
- Ydinmoduulit:
Seuraavat moduulit, jotka sisältävät node.js:n kolme päämoduulia, ovat ydinmoduulit. Ydinmoduulit ovat ei-relatiivipohjaisia moduuleja. Ne eroavat hyvin paljon tiedostomoduuleista, erityisesti silloin, kun moduuleja vaaditaan (tai tuodaan) tiedostoihin.
Jos esimerkiksi kuluttaisimme node.js:n path-moduulia, joka korjaa vinoviivat käyttöjärjestelmäkohtaisiksi, huolehtii . ja .. polussa ja poistaa myös päällekkäiset vinoviivat, emme sisällyttäisi suhteellista polkua:
var require = require('path') console.log (path.normalize ('/foo/bar/......'));
- external_node-moduulit:
Nämä moduulit sijoittuvat jonnekin ydin- ja tiedostopohjaisten moduulien väliin. external_node-moduulit ovat melko samanlaisia kuin tiedostopohjaiset, varsinkin kun olet viemässä moduulia.
module.exports = function () {console.log('called node modules!');}
Mutta kun lataat moduuleja, ne muuttuvat melko erilaisiksi.
var bar = require('bas');bas(); //
Lisäksi node.js tarjoaa joitakin tärkeitä globaaleja hyödyllisiä ominaisuuksia, joita emme käsittele yksityiskohtaisesti. timer
,console
, _filename
ja_dirname
sekä process ovat kaikki esimerkkejä tärkeistä globaaleista node.js:ssä. Esimerkiksi _filename
ja _dirname
ovat käytettävissä jokaisessa tiedostossa ja antavat pääsyn nykyisen moduulin täydelliseen polkuun ja hakemistoon.
Nyt kun meillä on lyhyt käsitys moduuleista node.js:ssä, siirrymme tärkeimpään näkökohtaan, jossa erotamme CommonJS:n ja AMD:n moduulit. Tartumme ongelmiin ”miksi Common.js on niin hidas ladattaessa moduuleja selaimesta” ja ”miten voimme muuntaa sen browserifyn avulla perimään tiettyjä AMD:n ja Require.js:n ominaisuuksia”. .
CommonJS:n ja AMD:n esittely
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.
Tarkastellaan esimerkiksi sitä, miten nämä kaksi moduulia ladataan palvelinpuolen ympäristössä:
var foo = require('./foo');var bar = require('./bar');// more code here
Katsottaessa yllä olevaa esimerkkiä, palvelinpuolella pidetään hyvänä käytäntönä sitä, että yksi moduuli ladataan samalla, kun toinen moduuli odottaa toisen moduulin jäsentämistä.
Muuten sanoen, kun foo-moduulia ladataan, bar-moduulia ei jäsennetä tai käsitellä ennen kuin foo-moduuli on ladattu kokonaan pois. Palvelin ei välttämättä edes tiedä bar-moduulista ennen kuin foo-moduuli on käsitelty loppuun.
Saman moduulijärjestelmän käyttämistä selaimessa ei pidetä hyvänä ideana, koska jokaisen moduulijärjestelmän pitäisi käynnistää HTTP-pyyntö palvelimelle. Tämä on paljon tehottomampaa ja epäluotettavampaa palvelinympäristössä. Se heikentää käyttäjäkokemusta asiakaspuolella. Tämä ongelma voitaisiin ratkaista moduulien asynkronisella lataamisella.
Tässä kohtaa AMD astuu kuvaan. AMD, joka tunnetaan myös nimellä asynkroninen moduulin määrittely, otettiin käyttöön tukemaan moduulien asynkronista lataamista selaimessa –
se lopulta ratkaisee moduulien hitaan latausnopeuden selaimessa. ”Asynkronisen” merkityksen mukaisesti moduulit käynnistyvät eri aikoina.
Voidaksemme viedä jotain tiedostossa AMD:ssä, meidän on yksinkertaisesti sisällytettävä kutsufunktio ja palautettava se määrittelyn kutsufunktiosta. Tässä on esimerkki:
define(, function () { var foo = function () { console.log ('foo was called');}; return foo; // function foo is exported});
Aivan kuten node.JS:n export-muuttujan syntaksi, myös define-funktio ottaa vastaan erikoisargumentin nimeltä exports, joka on melko samanlainen kuin node.JS:ssä.
define(, function (exports) {var bas = exports.log = function () {console.log ('bas.log was called'); };});
Tehdäksemme mahdolliseksi kahden moduulin lataamisen selaimessa, meidän on ladattava ja asennettava RequireJS. Muista, että tämä on vain vaihtoehto, joka estää kehittäjiä käyttämästä node.JS-koodia selaimessa.]
Miksi tarvitsemme RequireJS:ää voidaksemme ladata moduuleja asynkronisen moduulin määrittelyn kautta?
Tässä on syy: koska Define-funktio, joka on osa alla olevaa koodia (joka näyttää meille, miten voimme ladata selaimessa useamman kuin yhden moduulin selaimen kautta AMD:llä), ei ole selaimen natiivi. Siksi paras vaihtoehto on käyttää sitä kolmannen osapuolen kirjastosta. RequireJS on yksinkertaisesti javascript-tiedosto, jonka sisällytät projektiin.
define(, function(foo, bar){ //more code here// more code here });
Miten node.js muunnetaan selainkoodiksi:
Katsotaan nyt, miten voimme muuntaa CommonJS:n yhteensopivaksi AMD/RequireJS:n kanssa browserifyn avulla. CommonJS:n muuntaminen browserifyn kautta mahdollistaa sen, että node.js voi ladata moduuleja selaimessa AMD/RequireJS:n tapaan.
Asennetaan browserify seuraavan koodin kautta. Varmista, että olet yhteydessä internetiin whilse asennuksen aikana. Yhdysmerkki g tarkoittaa yksinkertaisesti globaalia.
npm install –g browserify
Voit luoda moduuleja, nimetä sen clientJS:ksi tai millä tahansa haluamallasi nimellä ja lopulta muuntaa sen AMD/RequireJS:ksi browserifyn avulla.
module.exports = function () {console.log('bas was called');}
exports.log = function () {console.log('bar.log was called');}
Nyt, jotta voimme muuntaa yllä olevan koodin AMD-yhteensopivaksi, toisin sanoen ladata moduulit asynkronisesti, meidän on tehtävä se seuraavien komentoriviargumenttien avulla:
browserify client.js -o amdmodule.js
Voit antaa minkä tahansa haluamasi nimen clientJS:lle. Sen ei tarvitse aina olla client.js, mutta myös client.js on suositeltava. Muista, että kyseessä on vain tiedosto. Lisäksi voit tarkistaa lisää konfiguraatiota browserify:stä osoitteessa http://browserify.org/.
Wrapping up:
Loppujen lopuksi kannattaa huomioida, että kaikkia node.JS-moduuleja ei voi muuntaa toimimaan tehokkaasti selaimessa. Ne, jotka ovat riippuvaisia palvelinpuolen ominaisuuksista, eivät toimi lainkaan selaimessa.
Olen juuri esitellyt AMD/RequireJS:n ratkaisuna, joka mahdollistaa moduulien asynkronisen lataamisen selaimessa, mitä pidetään hyvänä käytäntönä. Moduulien asynkroninen lataaminen on paljon nopeampaa ja luotettavampaa kuin CommonJS:n käyttö selaimessa.
Leave a Reply