Relation entre CommonJS, AMD et RequireJS?
Je suis encore très confus au sujet de CommonJS, AMD et RequireJS. Même après avoir lu beaucoup.
Je sais que CommonJS (anciennement ServerJS) est un groupe pour la définition de certains JavaScript cahier des charges (c'est à dire modules) lorsque la langue est utilisée en dehors du navigateur. CommonJS modules de spécification de l'implémentation comme Node.js ou RingoJS, droit?
Quelle est la relation entre CommonJS, Asynchrone de Définition de Module (AMD) et RequireJS? Est RequireJS de mise en œuvre de CommonJS de définition de module? Si oui, quelle est AMD alors?
- La lecture de requirejs.org/docs/whyamd.html permettrait de clarifier beaucoup de choses qu'il mentionne toutes. (poster un commentaire que je ne considère pas cette une réponse complète).
- Puis-je demander ou ajouter plus; Comment et où le ES2015 déclarations d'importation s'insérer dans tous les cas; par exemple, l'importation de Braise de "braise';
- Il y a aussi un systemjs qui charge toutes les versions supportées de JS module de formats tels que (CommonJS, UMD, AMD, ES6).
Vous devez vous connecter pour publier un commentaire.
RequireJS met en œuvre la AMD API (source).
CommonJS est une façon de définir des modules à l'aide d'un
exports
objet, qui définit le module de contenu. Il suffit de mettre, une CommonJS la mise en œuvre pourrait fonctionner comme ceci:Fondamentalement, CommonJS indique que vous devez avoir un
require()
fonction pour récupérer les dépendances, uneexports
variable de module d'exportation des matières et un identificateur de module (qui décrit l'emplacement du module en question par rapport à ce module qui est utilisé pour obliger les dépendances (source). CommonJS a implémentations différentes, y compris Node.js, que vous avez mentionné.CommonJS n'était pas particulièrement conçus avec les navigateurs dans l'esprit, de sorte qu'il ne rentre pas dans le navigateur de l'environnement très bien (je n'ai pas vraiment de source pour ce--c'est juste le dit partout, y compris le RequireJS site.) Apparemment, cela a quelque chose à voir avec le chargement asynchrone, etc.
D'autre part, RequireJS implémente AMD, qui est conçu pour s'adapter à l'environnement de navigateur (source). Apparemment, AMD a commencé comme un spin-off de la CommonJS format de Transport et évolué dans sa propre définition de module API. D'où les similitudes entre les deux. La nouvelle fonctionnalité de la DMLA est la
define()
fonction qui permet au module de déclarer ses dépendances avant d'être chargé. Par exemple, la définition pourrait être:Donc, CommonJS et AMD sont JavaScript de définition de module Api qui ont implémentations différentes, mais tous deux viennent de la même origine.
De vous embrouiller encore plus, RequireJS, tout en étant un AMD mise en œuvre, offre un CommonJS wrapper de sorte CommonJS modules peuvent presque être directement importés pour utilisation avec RequireJS.
J'espère que cela aide à clarifier les choses!
define(...)
wrapper dans le dernier exemple de cette réponse. Un serveur-côté JS préprocesseur pourrait ajouter ce wrapper (il serait juste textuelle JS avant et après l'CommonJS définition.)CommonJS est plus que cela - c'est un projet à définir une API commune et de l'écosystème pour le JavaScript. Une partie de CommonJS est le Module spécification. Node.js et RingoJS sont JavaScript côté serveur runtimes, et oui, à la fois de la mise en oeuvre de modules basés sur la CommonJS Module spec.
AMD (Asynchronous Module Definition) est un autre spécification pour les modules. RequireJS est probablement le plus populaire de la mise en œuvre de la DMLA. Une différence majeure de CommonJS, c'est que AMD indique que les modules sont chargés de manière asynchrone - cela signifie que les modules sont chargés, en parallèle, par opposition à un blocage de l'exécution par l'attente d'une charge à la fin.
AMD est généralement plus utilisé côté client (dans le navigateur) développement JavaScript pour cette raison, et CommonJS Modules sont généralement utilisé côté serveur. Toutefois, vous pouvez utiliser soit le module spec dans l'environnement - par exemple, RequireJS offre instructions pour l'exécution dans Node.js et browserify est un CommonJS Module de mise en œuvre qui peuvent s'exécuter dans le navigateur.
La réponse courte est:
CommonJS et AMD sont des spécifications (ou formats) sur la façon dont les modules et leurs dépendances doivent être déclarés dans les applications de javascript.
RequireJS est un chargeur de script de la bibliothèque qui est un AMD conforme, curljs est un autre exemple.
CommonJS conforme:
Prises de Addy Osmani du livre.
AMD compatible:
Ailleurs le module peut être utilisé avec:
Un peu de contexte:
En fait, CommonJS est beaucoup plus qu'une déclaration d'API et seule une partie de ce qui. AMD a commencé comme un projet de spécification pour le module de format sur le CommonJS liste, mais le consensus n'est pas atteint et le développement du format déplacé à la amdjs groupe. Les Arguments autour de qui format est meilleur état que CommonJS tente de couvrir un éventail plus large de préoccupations et qu'il est mieux adapté pour le côté serveur de développement compte tenu de son synchrone de la nature, et que AMD est mieux adapté pour le côté client (navigateur) de développement compte tenu de sa nature asynchrone et le fait qu'il a ses racines dans le Dojo du module de déclaration de mise en œuvre.
Sources:
AMD compliant
est en fait RequireJS, droit?Citant
AMD:
CommonJS:
AMD
applique.Il est tout à fait normal d'organiser JavaScript programme modulaire en plusieurs fichiers et de les appeler
child-modules
de lamain js module
.Le truc, c'est le JavaScript ne fournit pas cette. Pas encore aujourd'hui dans les dernières versions des navigateurs Chrome et FF.
Cette question peut-être un effondrement total du monde pour beaucoup parce que la réponse est Pas.
Dans l'ES5 ( sorti en 2009 ) JavaScript n'avait pas de mots clés tels que importation, inclure, ou besoin.
ES6 sauve la journée ( publié à 2015 ) proposant la importation mot-clé ( https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/import ), mais aucun navigateur n'implémente cette.
Si vous utilisez Babel 6.18.0 et transpile avec ES2015 option uniquement
vous obtiendrez
require
de nouveau.C'est parce que
require
signifie que le module sera chargé de Node.js. Node.js s'occuperont de tout de niveau du système de fichier en lecture à l'encapsulation des fonctions dans le module.Parce que dans les fonctions JavaScript sont les seuls emballages pour représenter les modules.
Les deux CommonJS et AMD sont juste deux techniques différentes, la façon de surmonter les JavaScript "défaut" pour charger des modules intelligents.