Heim  >  Artikel  >  Web-Frontend  >  Lernen Sie die Modulspezifikationen von Knoten (1) von 0 bis 1 kennen

Lernen Sie die Modulspezifikationen von Knoten (1) von 0 bis 1 kennen

大家讲道理
大家讲道理Original
2017-01-24 15:30:511137Durchsuche

Bevor wir die Konzepte von CommonJS, AMD und CMD erklären, verstehen wir zunächst die Modularität von js. Modularisierung besteht, wie der Name schon sagt, darin, das Projekt nach Funktionen oder anderer Logik zu zerlegen. Jeder Teil verarbeitet nur eine Funktion, um die Funktionen zu entkoppeln und die zukünftige Entwicklung und Wartung zu erleichtern. Dann muss die Modularisierung über die folgenden Funktionen zum Teilen und Zusammensetzen von Modulen verfügen:

  1. Definieren Sie gekapselte Module;

  2. Definieren Sie die Abhängigkeit des neuen Moduls auf anderen Modulen;

  3. kann die Einführung anderer Module unterstützen

Dann wird eine Reihe von Spezifikationen benötigt Um diese Fähigkeiten zu definieren, erschienen CommonJS, AMD, CMD usw.

1. CommonJS

CommonJS hieß ursprünglich ServerJS, was die Spezifikation von js auf der Serverseite ist. Gemäß der CommonJS-Spezifikation ist eine einzelne Datei ein Modul, require wird zum Laden eines Moduls verwendet und exports wird verwendet, um Methoden oder Eigenschaften im Modul nach außen zugänglich zu machen.

Zum Beispiel:

// hello.jsfunction say(username){    console.log( 'hello, '+username );
}

exports.say = say;

=============

// main.jsvar person = require('./hello');

person.say('wenzi'); // hello, wenziperson.say('师少兵'); // hello, 师少兵person.say('NUC'); // hello, NUC

Gleichzeitig kann die require-Anweisung an einer beliebigen Stelle in der Datei geschrieben werden, solange sie vor der Referenz verwendet wird, muss sie nicht am Anfang der Datei geschrieben werden. Um den Code jedoch leichter lesbar zu machen und intuitiv zu erkennen, auf welche Module derzeit verwiesen wird, platzieren Sie ihn am besten an den Anfang der Datei.

Der Unterschied zwischen Exporten und module.exports

Einige Leute haben möglicherweise gesehen, dass Exporte direkt verwendet werden, andere wiederum, dass sie module.exports verwenden. Hier ist eine kurze Erklärung des Unterschieds zwischen den beiden.

Nehmen wir ein einfaches Beispiel:

var a = {name:'wenzi'};var b = a;console.log(a); // {name: "wenzi"}console.log(b); // {name: "wenzi"}

Die Ausgabeergebnisse von a und b sind gleich. Jetzt ändere ich den Wert von name in b:

b.name = 'shaobing';console.log(a); // {name: "shaobing"}console.log(b); // {name: "shaobing"}

Die Ausgabeergebnisse von a und b haben sich geändert. Ich deklariere b neu:

var b = {name:'师少兵'};console.log(a); // {name: "shaobing"}console.log(b); // {name: "师少兵"}

Diese drei Beispiele geben drei Ergebnisse aus:

  1. deklariere ein Objekt und weise a zu b zu, und dann a und b geben das gleiche Ergebnis aus;

  2. ändert den Namen in b, dann ändert sich auch der Name in a

  3. Deklariert das b-Objekt neu , dann ändert sich der Name in a nicht mit b
Erklärung

: a ist ein Objekt, b ist Die Referenz auf a, also auf a und b in den gleichen Speicher, daher ist die Ausgabe in 1 gleich. Wenn b geändert wird, dh der Inhalt von a und b, die auf dieselbe Speicheradresse zeigen, geändert wurde, wird auch a widergespiegelt, sodass die Ausgabe des zweiten Beispiels dieselbe ist. Wenn b überschrieben wird, zeigt b auf einen neuen Speicher und a zeigt immer noch auf den ursprünglichen Speicher, sodass die endgültige Ausgabe anders ausfällt. Dann können Sie zu diesem Zeitpunkt

und

einführen: exportsmodule.exports

    Der Anfangswert von module.exports ist ein leeres Objekt {}
  1. exports ist ein Verweis auf module.exports
  2. require() gibt module.exports anstelle von exports zurück
  3. Wenn module.exports einen neuen Zeiger hat, sind die Exporte ungültig; wenn sich module.exports nicht geändert hat, exportieren Sie es einfach direkt.

2. AMD und RequireJS

Apropos AMD, ich muss sagen

Dass AMD sich von der CommonJS-Community unabhängig gemacht hat und die AMD-Community größtenteils darauf zurückzuführen ist Dazu setzt es auch auf die Förderung von RequireJS-Autoren.

RequireJSIn der AMD-Spezifikation lautet das standardmäßig empfohlene Modulformat:

// hello.js// 将需要引入的模块全部写入到数组中,然后传递参数进行调用define(['a', 'b'], function(a, ,b){    // do something    return{
        hello : function(username){            console.log( 'hello, '+username );
        }
    }
})
==========

// main.jsdefine(['./hello'], function(h){
    h.hello('wenzi');
})
Mit anderen Worten, in AMD müssen Module mit
definiert werden und Abhängigkeiten werden über Funktionsparameter übergeben. Ein Vorteil davon ist, dass alle Abhängigkeiten auf einen Blick ersichtlich sind.

define3. CMD und Seajs

Die CMD-Spezifikation wurde vom berühmten Yu Bo in China vorgeschlagen. Das Einzige, was zu tun ist, ist

an diesem Ort

. SeaJS verwendet die CMD-Spezifikation: 就近依赖require

Sie können den Unterschied zwischen AMD und CMD auch hier sehen:

AMD muss normalerweise alle Abhängigkeiten auf einmal einführen und sie dann über Parameter weitergeben, während CMD sie nur bei Bedarf einführt

AMD unterstützt jedoch auch Importformate wie CMD, die interne Ausführung basiert jedoch weiterhin auf der Logik von AMD.

4. Zusammenfassung

In diesem Artikel werden die relevanten Unterschiede und Zusammenhänge zwischen CommonJS-, AMD- und CMD-Spezifikationen vorgestellt:

  1. CommonJS: Jede Datei ist ein Modul und muss nicht definiert werden.

  2. AMD: Verwenden Sie define, um ein Modul zu definieren und darauf zu achten im Voraus;

  3. CMD: Verwenden Sie define, um Module zu definieren und von

    in der Nähe abhängig zu sein

Als nächstes werden wir wird beginnen Das Lernen des Knotens wird offiziell gestartet.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn