Pregunta Relación entre CommonJS, AMD y RequireJS?


Todavía estoy muy confundido acerca de CommonJS, AMD y RequireJS. Incluso después de leer mucho.

Sé que CommonJS (anteriormente ServerJS) es un grupo para definir algunas especificaciones de JavaScript (es decir, módulos) cuando el idioma se usa fuera del navegador. La especificación de los módulos CommonJS tiene alguna implementación como Node.js o RingoJS, ¿verdad?

¿Cuál es la relación entre CommonJS, Definición de módulo asíncrono (AMD) y RequireJS? ¿Es RequireJS una implementación de la definición del módulo CommonJS? Si es así, ¿qué es AMD entonces?


724
2018-05-13 11:56


origen


Respuestas:


RequireJS implementa el AMD API (fuente).

CommonJS es una forma de definir módulos con la ayuda de un exports objeto, que define el contenido del módulo. En pocas palabras, una implementación de CommonJS podría funcionar así:

// 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"; };

Básicamente, CommonJS especifica que necesita tener un require() función para recuperar dependencias, una exports variable para exportar el contenido del módulo y un identificador de módulo (que describe la ubicación del módulo en cuestión en relación con este módulo) que se utiliza para requerir las dependencias (fuente) CommonJS tiene varias implementaciones, incluyendo Node.jsque has mencionado

CommonJS no fue especialmente diseñado con los navegadores en mente, por lo que no encaja muy bien en el entorno del navegador (Realmente no tengo una fuente para esto, simplemente lo dice en todas partes, incluso el sitio RequireJS.


688
2018-05-13 13:14



CommonJS es más que eso: es un proyecto para definir una API común y un ecosistema para JavaScript. Una parte de CommonJS es la Módulo especificación. Node.js y RingoJS son tiempos de ejecución de JavaScript del lado del servidor, y sí, ambos implementan módulos basados ​​en las especificaciones del Módulo CommonJS.

AMD (Definición de módulo asíncrono) es otra especificación para módulos. RequireJS es probablemente la implementación más popular de AMD. Una gran diferencia con CommonJS es que AMD especifica que los módulos están cargados asincrónicamente - eso significa que los módulos se cargan en paralelo, en lugar de bloquear la ejecución esperando a que termine una carga.

Generalmente, AMD se usa más en el desarrollo de JavaScript del lado del cliente (en el navegador) debido a esto, y los módulos CommonJS generalmente se usan en el lado del servidor. Sin embargo, puede usar cualquier especificación de módulo en cualquier entorno, por ejemplo, RequireJS offers Instrucciones para correr en Node.js y Navegar es una implementación de CommonJS Module que se puede ejecutar en el navegador.


189
2018-05-13 13:06



La respuesta corta sería:

CommonJS y AMD son especificaciones (o formatos) sobre cómo deben declararse los módulos y sus dependencias en las aplicaciones de JavaScript.

RequireJS es una biblioteca de cargador de scripts que cumple con AMD, curljs siendo otro ejemplo.

CommonJS obediente:

Tomado de El libro de Addy Osmani.

// 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 obediente:

// 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
    }
});

En otro lugar, el módulo se puede usar con:

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

Algunos antecedentes:

Actualmente, CommonJS es mucho más que una declaración API y solo una parte de eso trata de eso. AMD comenzó como un borrador de especificación para el formato del módulo en la lista CommonJS, pero no se alcanzó el consenso total y el desarrollo posterior del formato se trasladó al grupo amdjs. Argumentos sobre qué formato es mejor afirmar que CommonJS intenta cubrir un conjunto más amplio de inquietudes y que es más adecuado para el desarrollo del lado del servidor dada su naturaleza síncrona, y que AMD es más adecuado para el desarrollo del lado del cliente (navegador) dada su naturaleza asincrónica y el hecho de que tiene sus raíces en la implementación de la declaración del módulo de Dojo.

Fuentes:


173
2017-12-29 23:05



Citando

AMD:

  • Un enfoque de navegador primero
  • Optando por el comportamiento asincrónico y la compatibilidad hacia atrás simplificada
  • No tiene ningún concepto de File I / O.
  • Admite objetos, funciones, constructores, cadenas, JSON y muchos otros tipos de módulos.

CommonJS:

  • Un enfoque de primer servidor
  • Asumiendo un comportamiento sincrónico
  • Cubre un conjunto más amplio de inquietudes, como E / S, sistema de archivos, promesas y más.
  • Admite módulos no envueltos, se puede sentir un poco más cerca del ES.next/Harmony especificaciones, liberándolo del contenedor define () que AMD hace cumplir.
  • Solo admite objetos como módulos.

21
2017-07-29 10:36



Es bastante normal organizar el programa JavaScript modular en varios archivos y llamar child-modules desde el main js module.

El hecho es que JavaScript no proporciona esto. Ni siquiera hoy en las últimas versiones de navegador de Chrome y FF.

Pero, ¿hay alguna palabra clave en JavaScript para llamar a otro módulo de JavaScript?

Esta pregunta puede ser un colapso total del mundo para muchos porque la respuesta es No.


En ES5 (lanzado en 2009) JavaScript no tenía palabras clave como importar, incluir, o exigir.

ES6 salva el día (lanzado en 2015) proponiendo el importar palabra clave ( https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/import ), pero ningún navegador implementa esto.

Si usa Babel 6.18.0 y transpile con la opción ES2015 solamente

import myDefault from "my-module";

conseguirás require de nuevo.

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

Esto es porque require significa que el módulo se cargará desde Node.js. Node.js se encargará de todo, desde la lectura de archivos de nivel del sistema hasta las funciones de ajuste en el módulo.

Porque en JavaScript las funciones son las únicas envolturas que representan los módulos.

Estoy muy confundido acerca de CommonJS y AMD?

Tanto CommonJS como AMD son solo dos técnicas diferentes sobre cómo superar el "defecto" de JavaScript para cargar módulos inteligentes.


9
2017-10-30 23:50