Heim > Web-Frontend > js-Tutorial > Hauptteil

Eine kurze Analyse der AMD CMD CommonJS-Spezifikation – Zusammenfassung der Lernerfahrungen zum modularen Laden von Javascript_Javascript-Fähigkeiten

WBOY
Freigeben: 2016-05-16 15:10:32
Original
1008 Leute haben es durchsucht

Dies ist eine Zusammenfassung des Wissens über Javascript Modular AMD, CMD und CommonJS. Es dient als Dokumentation für diejenigen, die auch Fragen zu den drei Methoden haben, ich hoffe, Sie können sie darauf hinweisen . Ich wäre sehr dankbar.

Die Standardleser dieses Artikels kennen wahrscheinlich die Verwendung von require und seajs (AMD-, CMD-Verwendung), daher ist die Verwendungssyntax nicht enthalten.

1. Warum es geboren wurde:

Diese drei Spezifikationen wurden alle für das modulare Laden von JavaScript entwickelt. Sie laden bestimmte Module, wenn sie verwendet werden oder verwendet werden sollen, sodass eine große Anzahl von Systemen mit riesigen und komplexen Codes gut organisiert und verwaltet werden kann. Durch die Modularisierung wird die Verwendung und Verwaltung von Code weniger verwirrend und die Zusammenarbeit mehrerer Personen wird erleichtert.


2. Diese Normen:

(1) CommonJS ist eine Organisation, die am Aufbau eines JavaScript-Ökosystems interessiert ist. Es gibt eine ganze Community, die sich dafür einsetzt, JavaScript-Programme sowohl auf dem Server als auch im Browser portabler und austauschbarer zu machen.

Eine Gruppe mit dem Ziel, das JavaScript-Ökosystem für Webserver, Desktop- und Befehlszeilen-Apps sowie im Browser aufzubauen.

Ein speziell entwickelter Satz von Webservern des JavaScript-Ökosystems, in Browsern und Befehlszeilenanwendungen sowie auf dem Desktop. (Er sagte es in seinem eigenen Wiki)

Diese Organisation hat einige Spezifikationen formuliert (Sie können ihre Website http://www.commonjs.org/ besuchen), einschließlich der CommonJS Modules/1.0-Spezifikation. Dies ist, was wir normalerweise die commonjs-Spezifikation nennen.

„Die CommonJS-API wird diese Lücke füllen, indem sie APIs definiert, die viele gängige Anwendungsanforderungen erfüllen und letztendlich eine Standardbibliothek bereitstellen, die so umfangreich ist wie die von Python, Ruby und Java“ – (von http://www.commonjs. org/)

Commonjs ist also eine eher serverseitige Spezifikation. Node.js übernimmt diese Spezifikation. Gemäß der CommonJS-Spezifikation ist eine einzelne Datei ein Modul. Beim Laden des Moduls wird die Methode require verwendet, die eine Datei liest und ausführt und schließlich das Exportobjekt in der Datei zurückgibt.

Er sagte auch, dass es in den folgenden Szenarien verwendet werden kann, sodass er offensichtlicher auf die Serverseite ausgerichtet ist. Natürlich können Sie es auch im Browser verwenden (man sagt, Sie können es).

•Serverseitige JavaScript-Anwendungen
•Befehlszeilentools
•Desktop-GUI-basierte Anwendungen
•Hybridanwendungen (Titanium, Adobe AIR)

(2), AMD-Spezifikationen

Commonjs löst das Problem der Modularisierung und kann in Browsern verwendet werden. Wenn das Modul verwendet wird, verursacht es Probleme mit der Ladegeschwindigkeit usw. (Das synchrone Laden von Modulen durch den Browser führt zu Problemen wie Leistung, Verfügbarkeit, Debugging und domänenübergreifendem Zugriff).

Angesichts der besonderen Situation von Browsern ist eine weitere Spezifikation entstanden, die abhängige Module asynchron laden kann. Das ist die AMD-Spezifikation. AMD kann als Drop-in-Version von CommonJS-Modulen verwendet werden, solange CommonJS nicht für synchrone Require-Aufrufe verwendet wird. CommonJS-Code, der synchrone Anforderungsaufrufe verwendet, kann so konvertiert werden, dass er den AMD-Modullader im Callback-Stil verwendet (https://github.com/amdjs/amdjs-api/wiki/AMD-(%E4%B8%AD%E6%96%). 87%E7%89%88) (steht darin).

Hier ist eine Moduldefinition unter Verwendung einer einfachen CommonJS-Transformation (es ist eine Verwendung der AMD-Spezifikation):

Code kopieren Der Code lautet wie folgt:
define(function (require, exports, module) {
var a = require('a'),
           b = require('b');
exports.action = function () {};

});


Daher sind AMD und CommonJS kompatibel, solange die Aufrufmethode leicht geändert wird, kann ein synchrones Laden erreicht werden (ich vermute sehr, dass AMD auch eine auf CommonJS basierende Shell hinzugefügt hat, und dann habe ich keine anderen Shenma-Anweisungen und Supporttexte gefunden . Ich habe festgestellt, dass es hier hinzugefügt werden muss).

Wenn Sie sich die AMD-Spezifikationen ansehen, werden Sie feststellen, dass AMD die abhängigen Module grundsätzlich im Voraus angibt und diese Module dann vorab lädt. Tatsächlich erfordert dies, dass Sie sich im Voraus über diese Abhängigkeiten Gedanken machen und sie im Voraus schreiben, andernfalls Sie müssen mit dem Schreiben von Code fortfahren und am Anfang weitere Abhängigkeiten hinzufügen.


(3), CMD

Ich weiß nicht, ob Yubo Daniel von Taobao Seajs erstellt und behauptet hat, dass diese Spezifikation der CMD-Spezifikation folgt, und dann einen Link zu dieser Spezifikation angegeben hat (Sie finden das Wort Entwurf, wenn Sie es öffnen). ). Zu diesem Standard sagte Onkel Yu dies auf Zhihu

" AMD ist die standardisierte Ausgabe von Moduldefinitionen während des Promotion-Prozesses von RequireJS.

CMD ist die standardisierte Ausgabe der Moduldefinition während des Promotion-Prozesses von SeaJS.
Ähnlich wie bei der CommonJS Modules/2.0-Spezifikation handelt es sich um die standardisierte Ausgabe von Moduldefinitionen während des Promotion-Prozesses von BravoJS.
Es gibt noch viel mehr⋯⋯

Diese Spezifikation wurde also tatsächlich zur Förderung von Seajs entwickelt. Schauen wir uns also an, was mit SeaJS los ist. Im Grunde kennen Sie diese Spezifikation.

In ähnlicher Weise lädt Seajs auch Abhängigkeiten vor. Die JS- und AMD-Spezifikationen sind hinsichtlich des Vorladens gleich. Der offensichtliche Unterschied liegt im Aufruf und der Deklaration von Abhängigkeiten. Sowohl AMD als auch CMD verwenden „define“ und „require“, aber der CMD-Standard tendiert dazu, während der Verwendung Abhängigkeiten vorzuschlagen. Das heißt, egal, wo der Code geschrieben wird, stellen Sie plötzlich fest, dass Sie auf ein anderes Modul angewiesen sind, und verwenden Sie dann einfach „require“, um es einzuführen Im aktuellen Code helfen wir Ihnen beim Vorladen, und Sie können einfach schreiben, was Sie wollen. Der AMD-Standard erfordert jedoch, dass Sie die Abhängigkeitsparameter im Voraus in den Header schreiben (nicht gut geschrieben? Gehen Sie zurück und schreiben Sie sie richtig). Dies ist der offensichtlichste Unterschied.


3. Symbiose

Da es sich bei CommonJS um eine serverseitige Spezifikation handelt, stehen die beiden anderen Standards eigentlich nicht im Widerspruch.

AMD wird im Ausland häufiger verwendet, und natürlich wurden in China viele Versionen von jQuery 1 und 7 verwendet, und Dojo wurde in Version 1.6 verwendet, was bewiesen hat, dass es großartig genug ist.

Natürlich verwenden viele Leute CMD, aber sie konzentrieren sich im Wesentlichen auf China. Die offizielle Website von Seajs zeigt, dass viele großartige Unternehmen es verwenden (einschließlich iQiyi, Tencent Weibo, Alipay, Taobao usw.). Hier und schauen Sie sich http://seajs.org/docs/ an. Es gibt wahrscheinlich unzählige kleine und unbekannte Unternehmen. Schließlich benötigen viele Unternehmen Seajs-Fähigkeiten bei der Personalbeschaffung.

Die drei Spezifikationen sind derzeit also sehr gut (tatsächlich liegt das hauptsächlich daran, dass js über einen eigenen Modullademechanismus verfügt. Ich weiß nicht, was nach der Veröffentlichung von es6 passieren wird).

Was sollen wir tun, wenn wir eine Datei schreiben, die mit verschiedenen Ladespezifikationen kompatibel sein muss?

(function (root, factory) { 
 
  if (typeof define === 'function' && define.amd) { 
 
    // AMD 
 
    define(['jquery', 'underscore'], factory); 
 
  } else if (typeof exports === 'object') { 
 
    // Node, CommonJS之类的 
 
    module.exports = factory(require('jquery'), require('underscore')); 
 
  } else { 
 
    // 浏览器全局变量(root 即 window) 
 
    root.returnExports = factory(root.jQuery, root._); 
 
  } 
 
}(this, function ($, _) { 
 
  // 方法 
 
  function a(){}; // 私有方法,因为它没被返回 (见下面) 
 
  function b(){}; // 公共方法,因为被返回了 
 
  function c(){}; // 公共方法,因为被返回了 
 
    
 
  // 暴露公共方法 
 
  return { 
 
    b: b, 
 
    c: c 
 
  } 
 
}));
Nach dem Login kopieren

Dieser Code ist mit verschiedenen Ladespezifikationen kompatibel.


4. Der Unterschied zwischen AMD und CMD

Die folgenden Punkte hat Onkel Yu zu Zhihu gesagt.

1. Bei abhängigen Modulen wird AMD im Voraus und CMD verzögert ausgeführt. Ab RequireJS 2.0 wurde es jedoch auch geändert, um die Ausführung verzögern zu können (die Verarbeitungsmethode ist je nach Schreibmethode unterschiedlich). CMD empfiehlt so faul wie möglich.
2. CMD fördert die Abhängigkeit vom nächstgelegenen Standort, während AMD die Abhängigkeit von der Front fördert.

3. Die API von AMD verwendet standardmäßig eine für mehrere Zwecke, während die API von CMD streng differenziert ist und eine einzige Verantwortung befürwortet. In AMD ist „require“ beispielsweise in globales „require“ und lokales „require“ unterteilt, die beide „require“ genannt werden. In CMD gibt es keine globale Anforderung. Stattdessen wird seajs.use bereitgestellt, um das Modulsystem basierend auf der Vollständigkeit des Modulsystems zu laden und zu starten. In CMD ist jede API einfach und klar.

4. Es gibt immer noch einige detaillierte Unterschiede. Schauen Sie sich einfach die Definition dieser Spezifikation an, daher werde ich nicht auf Details eingehen.
(Okay~ Zum vierten Punkt werde ich nicht mehr sagen...)


5. Einige Ähnlichkeiten zwischen AMD und CMD

Beide verfügen über define und require, und die aufrufende Methode kann tatsächlich Abhängigkeitsparameter hinzufügen. Dies bedeutet, dass das Vorladen abhängiger Module durch Bereitstellen von Abhängigkeitsparametern implementiert werden kann (dies wird jedoch nicht empfohlen, da Hinweis: Definieren mit ID- und Deps-Parametern. Verwendung nicht gehören zur CMD-Spezifikation, aber zur Modules/Transport-Spezifikation ---Von: https://github.com/seajs/seajs/issues/242).

AMD kann im Werk auch „require“ verwenden, um das verwendete Modul jetzt zu laden, dieses Modul wird jedoch nicht im Voraus geladen, und es handelt sich um einen synchronen Ladevorgang, der nur geladen wird, wenn es verwendet wird.

var a = require('a'); // Modul a laden

Wenn etwas nicht stimmt, korrigieren Sie mich bitte.

Der obige Artikel analysiert kurz die AMD CMD CommonJS-Spezifikation – eine Zusammenfassung der Lernerfahrung beim modularen Laden von Javascript. Ich hoffe, dass er Ihnen eine Referenz geben kann, und ich hoffe, dass Sie Script Home unterstützen .

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!