Reimpreso: https://www.jianshu.com/p/7c7fc199b7aa
- El módulo de carga estándar CommonJS es síncrono, y solo después de completar la carga se pueden realizar las siguientes operaciones.
- La especificación AMD es para cargar módulos de forma asíncrona, lo que permite especificar funciones de devolución de llamada.
Dado que Node.js se usa principalmente para la programación del servidor, los archivos de módulo generalmente ya están en el disco duro local, por lo que se carga más rápido y no necesita considerar el método de carga asíncrono, por lo que la especificación CommonJS es más aplicable. Sin embargo, si se trata de un entorno de navegador, para cargar el módulo desde el lado del servidor, debe usar el modo asíncrono, por lo que el lado del navegador generalmente adopta la especificación AMD.
CommonJS
En la especificación module
, exports
yrequire
- Cada archivo es un módulo y tiene su propio alcance. Dentro de cada módulo, la
module
variable representa el módulo actual y es un objeto, y susexports
atributos (es decir,module.exports
son interfaces externas). module.exports
El atributo indica la interfaz de salida actual del módulo, y otros archivos que cargan el módulo realmente leen lasmodule.exports
variables.- Para mayor comodidad,
Node
proporcione unaexports
variable para que apunte cada módulomodule.exports
.
dejar exportaciones = module.exports;
require
El comando se usa para cargar el archivo del módulo.
Ejemplos de uso:
// name.js exports.name = function () { return '李婷婷'}; // export // getName.js let getName = require ('name'); // import
Nota: No puede exports
apuntar directamente la variable a un valor, porque esto es equivalente a cortar la exports
conexión con module.exports
:
exportaciones = función (x) {console.log (x)}
Si la interfaz externa de un módulo es un valor único, la exports
salida no se puede usar , solo la module.exports
salida.
Especificaciones de AMD / CMD
AMD
EsRequireJS
la salida estandarizada de la definición del módulo en el proceso de promoción.
CMD
EsSeaJS
la salida estandarizada de la definición del módulo en el proceso de promoción.- Para los módulos dependientes, se
AMD
ejecuta por adelantado y conCMD
retraso. PeroRequireJS
desde el2.0
principio, que se puede cambiar para realizar retardo (dependiendo de la redacción manejado de manera diferente).CMD
Respetadoas lazy as possible
. -
CMD
Respeta la dependencia del más cercano yAMD
respeta la dependencia del frente.
// CMD define ( función (require, exportaciones, módulo) { let a = require ('./ a' ); a.doSomething (); · let b = require ('./ b'); // depend Puede escribir b.doSomething (); ... }) // AMD recomienda definir (['./ a', './b'], función (a, b) { // la dependencia debe comenzar Simplemente escriba a.doSomething () ... b.doSomething () ... })
Aunque AMD
también admite CMD
la redacción y también admite el paso require
como una dependencia, RequireJS
el autor establece de manera predeterminada la redacción anterior, que también es la redacción de definición de módulo predeterminada en el documento oficial.
-
AMD
ElAPI
valor predeterminado es una distinción estricta entre usos múltiples yCMD
unaAPI
responsabilidad única.
Por ejemploAMD
, lorequire
globalrequire
y lo local serequire
llaman require.CMD
Aquí, no hay globalrequire
, pero de acuerdo con la integridad del sistema de módulos, se proporcionaseajs.use
para realizar el inicio de carga del sistema de módulos.CMD
Aquí, cada unoAPI
es simple y puro.
Extensión
En la actualidad, no se han implementado todos los motores import
, node
y se utiliza babel
soporte en él ES6
. Es solo ES6
para transcodificar para ES5
volver a ejecutar, y la import
sintaxis se transcodificará require
. Es por eso que se usa cuando se exporta el módulo, module.exports
y import
aún funciona cuando se importa el módulo , porque en esencia, se import
transcodificará require
para ejecutarse.
¿Cuál es la diferencia entre AMD y CMD en la
especificación CommonJS del documento de referencia
?
Nodo no entiende requerir e importar, serás miserable