He estado buscando en Internet sin una respuesta clara para esto.
Actualmente, NodeJS usa solo la sintaxis CommonJS para cargar módulos, y si realmente quiere usar la sintaxis estándar de módulos ES2015, debe transpilarla de antemano o usar un cargador de módulos externo en tiempo de ejecución.
Actualmente no soy demasiado positivo para usar ninguno de esos dos métodos, ¿los encargados de mantenimiento de NodeJS incluso planean admitir módulos ES2015 o no? No he encontrado ninguna pista sobre esto.
Por el momento, NodeJS 6.x afirma que admite el 96% de las funciones de ES2015, pero no hay ninguna referencia a los módulos ( enlace de soporte de NodeJS ES2105 ).
¿Sabes si NodeJS admitirá estos módulos listos para usar, en un futuro cercano?
javascript
node.js
module
ecmascript-6
es6-modules
Zorgatone
fuente
fuente
node es2015 modules
muestra lo siguiente como uno de los mejores resultados: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node .Respuestas:
Nodo 13.2.0 y superior
NodeJS 13.2.0 ahora es compatible con los módulos ES sin una marca 🎉 Sin embargo, la implementación todavía está marcada como experimental, por lo que debe usarse con precaución en la producción.
Para habilitar el soporte de ESM en 13.2.0, agregue lo siguiente a su
package.json
:Todo
.js
,.mjs
(o archivos sin extensión) serán tratados como ESM.Hay varias opciones diferentes además de la suscripción completa
package.json
, todas las cuales se detallan en la Documentación para 13.2.0 .Nodo 13.1.0 y abajo
Aquellos que todavía usan versiones anteriores de Node pueden querer probar el cargador de módulos esm , que es una implementación lista para producción de la especificación de módulos ES para NodeJS:
Actualizaciones detalladas ...
23 abril 2019
Un RP recientemente aterrizó para cambiar la forma en que se detectan los módulos ES: https://github.com/nodejs/node/pull/26745
Todavía está detrás de la
--experimental-modules
bandera, pero hay cambios importantes en la forma en que se pueden cargar los módulos:package.type
que puede sermodule
ocommonjs
type: "commonjs"
:.js
se analiza como commonjstype: "module"
:.js
se analiza como esm--type=[mode]
para permitirle establecer el tipo en el punto de entrada. Se anularápackage.type
para el punto de entrada..cjs
.module
modo.--es-module-specifier-resolution=[type]
explicit
(por defecto) ynode
--es-module-specifier-resolution=node
para habilitar el algoritmo de resolución del especificador commonjs--experimental-json-loader
"type": "module"
import 'thing.json'
pasarán por el cargador experimental independientemente del modopackage.main
para establecer un punto de entrada para un módulo17 enero 2019
El nodo 11.6.0 todavía enumera los módulos ES como experimentales, detrás de una bandera.
13 de septiembre de 2017
NodeJS 8.5.0 ha sido lanzado con soporte para archivos mjs detrás de una bandera:
El plan para esto es eliminar la bandera de la versión v10.0 LTS.
- Información desactualizada. Mantenido aquí para fines históricos
8 de septiembre de 2017
La rama maestra NodeJS se ha actualizado con soporte inicial para módulos ESM:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
Esto debería estar disponible en la última noche (se puede instalar a través de nvm para que se ejecute junto con su instalación existente):
https://nodejs.org/download/nightly/
Y habilitado detrás de la
--experimental-modules
bandera:package.json
Entonces corre:
Febrero 2017:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
Los chicos de NodeJS han decidido que la solución menos mala es usar la
.mjs
extensión de archivo. La conclusión de esto es:Y en cuanto a las líneas de tiempo ...
Octubre 2016:
Uno de los desarrolladores de Node.JS asistió recientemente a una reunión TC-39 y escribió un excelente artículo sobre los bloqueadores para la implementación de Node.JS:
https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e
La conclusión básica de eso es:
*.mjs
parece la solución más probable, a menos que puedan detectar con precisión un módulo ES sin la intervención del usuario- Respuesta original -
Esta ha sido una papa caliente durante bastante tiempo. La conclusión es que sí, Node eventualmente admitirá la sintaxis ES2015 para importar / exportar módulos, muy probablemente cuando la especificación para cargar módulos esté finalizada y acordada.
Aquí hay una buena descripción de lo que está deteniendo a NodeJS. Esencialmente, deben asegurarse de que la nueva especificación funcione para Node, que es principalmente condicional, carga síncrona y también HTML, que es principalmente asíncrono.
Nadie lo sabe con certeza en este momento, pero imagino que Node admitirá
import/export
la carga estática, además de la nuevaSystem.import
para la carga dinámica, al tiempo que conserva elrequire
código heredado.Aquí hay algunas propuestas sobre cómo Node podría lograr esto:
fuente
.mjs
extensión:We have affectionately called these “Michael Jackson Script” files in the past
. En caso de que escuches a alguien hablando de artistas pop durante la charla de JS.import * from 'foo'
tratarán a foo.js como CommonJSimport * as bar from 'bar'
tratará a bar.js como un Módulo ES6. ¿Alguien puede explicarlo?