901 Stimmen

Beziehung zwischen CommonJS, AMD und RequireJS?

Ich bin immer noch sehr verwirrt über CommonJS, AMD y RequireJS auch wenn ich viel gelesen habe.

Ich weiß, dass CommonJS (ehemals ServerJS ) ist eine Gruppe zur Definition einiger JavaScript Spezifikationen (d.h. Module), wenn die Sprache außerhalb des Browsers verwendet wird. CommonJS Die Modul-Spezifikation enthält einige Implementierungen wie Node.js o RingoJS richtig?

Was ist die Beziehung zwischen CommonJS , Definition asynchroner Module (AMD) und RequireJS ?

Ist RequireJS eine Implementierung des CommonJS Moduldefinition? Wenn ja, was ist AMD dann?

814voto

jakee Punkte 18408

RequireJS implementiert die AMD API (Quelle) .

CommonJS ist eine Methode zur Definition von Modulen mit Hilfe eines exports Objekt, das den Inhalt des Moduls definiert. Einfach ausgedrückt, könnte eine CommonJS-Implementierung so funktionieren:

// someModule.js
exports.doSomething = function() { return "foo"; };

//otherModule.js
var someModule = require('someModule'); // in the vein of node    
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };

Grundsätzlich schreibt CommonJS vor, dass Sie eine require() Funktion zum Abrufen von Abhängigkeiten, eine exports um den Inhalt des Moduls zu exportieren, und einen Modulbezeichner (der die Position des betreffenden Moduls im Verhältnis zu diesem Modul beschreibt), der verwendet wird, um die Abhängigkeiten ( Quelle ). CommonJS hat verschiedene Implementierungen, darunter Node.js die Sie erwähnt haben.

CommonJS wurde nicht speziell mit Blick auf Browser entwickelt, so dass es sich nicht sehr gut in die Browserumgebung einfügt (*Ich habe wirklich keine Quelle dafür--es steht einfach überall so, einschließlich die RequireJS-Site.* ) Offenbar hat das etwas mit asynchronem Laden usw. zu tun.

Auf der anderen Seite implementiert RequireJS AMD, das auf die Browserumgebung zugeschnitten ist ( Quelle ). Offensichtlich begann AMD als eine Abspaltung des CommonJS Transport-Formats und entwickelte sich zu einer eigenen Moduldefinitions-API. Daraus ergeben sich die Ähnlichkeiten zwischen den beiden. Die neue Funktion in AMD ist die define() Funktion, die es dem Modul ermöglicht, seine Abhängigkeiten zu deklarieren, bevor es geladen wird. Die Definition könnte zum Beispiel lauten:

define('module/id/string', ['module', 'dependency', 'array'], 
function(module, factory function) {
  return ModuleContents;  
});

Also, CommonJS und AMD sind JavaScript Moduldefinitions-APIs, die unterschiedlich implementiert sind, aber beide denselben Ursprung haben.

  • AMD ist besser für den Browser geeignet, da es das asynchrone Laden von Modulabhängigkeiten unterstützt.
  • RequireJS ist eine Implementierung von AMD und gleichzeitig versuchen, den Geist der CommonJS (hauptsächlich in den Modulbezeichnungen).

Um Sie noch mehr zu verwirren, bietet RequireJS, obwohl es eine AMD-Implementierung ist, einen CommonJS-Wrapper, so dass CommonJS-Module fast direkt zur Verwendung mit RequireJS importiert werden können.

define(function(require, exports, module) {
  var someModule = require('someModule'); // in the vein of node    
  exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});

212voto

Nate Punkte 16471

CommonJS ist mehr als das - es ist ein Projekt zur Definition einer gemeinsamen API und eines Ökosystems für JavaScript. Ein Teil von CommonJS ist die Modul Spezifikation. Node.js und RingoJS sind serverseitige JavaScript-Laufzeiten, und ja, beide implementieren Module auf der Grundlage der CommonJS Module-Spezifikation.

AMD (Asynchronous Module Definition) ist eine weitere Spezifikation für Module. RequireJS ist wahrscheinlich die beliebteste Implementierung von AMD. Ein wesentlicher Unterschied zu CommonJS ist, dass AMD festlegt, dass Module geladen werden asynchron - Das bedeutet, dass die Module parallel geladen werden, anstatt die Ausführung zu blockieren, indem auf das Ende eines Ladevorgangs gewartet wird.

Aus diesem Grund wird AMD im Allgemeinen eher für die clientseitige (browserinterne) JavaScript-Entwicklung verwendet, während CommonJS-Module im Allgemeinen serverseitig eingesetzt werden. Sie können jedoch beide Modulspezifikationen in beiden Umgebungen verwenden - RequireJS bietet zum Beispiel Anweisungen für die Ausführung in Node.js y browserify ist eine CommonJS-Modul-Implementierung, die im Browser ausgeführt werden kann.

201voto

mmutilva Punkte 18070

Die kurze Antwort lautet:

CommonJS y AMD sind Spezifikationen (oder Formate) dafür, wie Module und ihre Abhängigkeiten in Javascript-Anwendungen deklariert werden sollten.

RequireJS ist eine AMD-konforme Skript-Loader-Bibliothek, curljs ist ein weiteres Beispiel.

CommonJS-konform:

Entnommen aus Addy Osmani's Buch .

// package/lib is a dependency we require
var lib = require( "package/lib" );

// behavior for our module
function foo(){
    lib.log( "hello world!" );
}

// export (expose) foo to other modules as foobar
exports.foobar = foo;

AMD-konform:

// package/lib is a dependency we require
define(["package/lib"], function (lib) {

    // behavior for our module
    function foo() {
        lib.log( "hello world!" );
    }

    // export (expose) foo to other modules as foobar
    return {
        foobar: foo
    }
});

Irgendwo anders kann das Modul verwendet werden:

require(["package/myModule"], function(myModule) {
    myModule.foobar();
});

Einige Hintergrundinformationen:

Eigentlich, CommonJS ist viel mehr als eine API-Deklaration und nur ein Teil davon befasst sich damit. AMD begann als Entwurfsspezifikation für das Modulformat auf der CommonJS-Liste, aber es wurde kein vollständiger Konsens erreicht und die weitere Entwicklung des Formats wurde in die amdjs-Gruppe . Die Argumente dafür, welches Format besser ist, besagen, dass CommonJS versucht, eine breitere Palette von Anliegen abzudecken, und dass es aufgrund seiner synchronen Natur besser für die serverseitige Entwicklung geeignet ist, während AMD aufgrund seiner asynchronen Natur und der Tatsache, dass es seine Wurzeln in der Moduldeklarationsimplementierung von Dojo hat, besser für die clientseitige (Browser-) Entwicklung geeignet ist.

Quellen:

30voto

zangw Punkte 36978

Zitat

AMD :

  • Ein Browser-first-Ansatz
  • Entscheidung für asynchrones Verhalten und vereinfachte Abwärtskompatibilität
  • Es hat kein Konzept für File I/O.
  • Es unterstützt Objekte, Funktionen, Konstruktoren, Strings, JSON und viele andere Arten von Modulen.

CommonJS :

  • Ein Server-first-Ansatz
  • Angenommenes synchrones Verhalten
  • Abdeckung eines breiteren Spektrums von Themen wie E/A, Dateisystem, Promises und mehr.
  • Unterstützt nicht verpackte Module, kann es ein wenig näher an der Realität sein. ES.next/Harmonie Spezifikationen, so dass Sie den define()-Wrapper nicht mehr benötigen, der AMD erzwingt.
  • Nur Objekte als Module unterstützen.

19voto

prosti Punkte 34344

Es ist durchaus üblich, JavaScript-Programme modular in mehreren Dateien zu organisieren und die child-modules von der main js module .

Das Problem ist, dass JavaScript dies nicht bietet. Nicht einmal heute in den neuesten Browser-Versionen von Chrome und FF.

Aber gibt es ein Schlüsselwort in JavaScript, um ein anderes JavaScript-Modul aufzurufen?

Diese Frage mag für viele den totalen Zusammenbruch der Welt bedeuten, denn die Antwort lautet Nein .


In ES5 (veröffentlicht im Jahr 2009) hatte JavaScript keine Schlüsselwörter wie importieren , einschließen. ou erfordern .

ES6 rettet den Tag (veröffentlicht 2015) und schlägt die importieren Schlüsselwort ( https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/import ), und jetzt alle moderne Browser unterstützen dies.

Wenn Sie Babel 6.18.0 verwenden und nur mit der ES2015-Option transpilieren

import myDefault from "my-module";

erhalten Sie require wieder.

"use strict";
var _myModule = require("my-module");
var _myModule2 = _interopRequireDefault(_myModule);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

Der Grund dafür ist require bedeutet, dass das Modul von Node.js geladen wird. Node.js kümmert sich um alles, vom Lesen der Dateien auf Systemebene bis zum Einbinden von Funktionen in das Modul.

Denn in JavaScript sind Funktionen die einzigen Wrapper, die die Module darstellen.

Ich bin sehr verwirrt über CommonJS und AMD?

Sowohl CommonJS als auch AMD sind nur zwei verschiedene Techniken, um den JavaScript-"Defekt" zu überwinden und Module intelligent zu laden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X