Node.js planea admitir módulos de importación/exportación de ES6 (ECMAScript 2015)
He estado buscando por Internet sin una respuesta clara para esto.
Actualmente, Node.js usa solo la sintaxis CommonJS para cargar módulos, y si realmente desea usar la sintaxis de módulos estándar ECMAScript 2015, debe transpilarla de antemano o usar un cargador de módulos externo en tiempo de ejecución.
Actualmente no estoy muy seguro de usar ninguno de esos dos métodos. ¿Los mantenedores de Node.js planean siquiera admitir módulos ECMAScript 2015 o no? No he encontrado ninguna pista sobre esto.
Por el momento, Node.js 6.x afirma admitir el 96% de las funciones de ECMAScript 2015, pero no hay ninguna referencia a los módulos ( enlace de soporte de Node.js ECMAScript 2015 ).
¿Sabe si Node.js admitirá estos módulos de fábrica en un futuro próximo?
Node.js 13.2.0 y superiores
Node.js 13.2.0 ahora admite módulos ES sin bandera 🎉. Sin embargo, la implementación todavía está marcada como experimental, por lo que se recomienda utilizarla en producción con precaución.
Para habilitar la compatibilidad con el módulo ECMAScript (ESM) en 13.2.0, agregue lo siguiente a su package.json
:
{
"type": "module"
}
Todos los .js
archivos .mjs
(o archivos sin extensión) se tratarán como ESM.
Hay varias opciones diferentes además de package.json
la suscripción voluntaria completa, todas las cuales se detallan en la documentación de 13.2.0 .
Node.js 13.1.0 y anteriores
Aquellos que todavía usan versiones anteriores de Node pueden querer probar el [esm][3]
cargador de módulos, que es una implementación lista para producción de la especificación de módulos ES para Node.js:
node -r esm main.js
Actualizaciones detalladas...
23 de abril de 2019
Recientemente llegó un PR para cambiar la forma en que se detectan los módulos ECMAScript: 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 CommonJS- el valor predeterminado para un punto de entrada sin una extensión es CommonJS
type: "module"
:.js
se analiza como un módulo ECMAScript- no admite la carga de JSON o un módulo nativo de forma predeterminada
- el valor predeterminado para un punto de entrada sin una extensión es el módulo ECMAScript
--type=[mode]
para permitirle configurar el tipo en el punto de entrada. Se anularápackage.type
para el punto de entrada.- Una nueva extensión de archivo
.cjs
.- esto es específicamente para admitir la importación de CommonJS en el
module
modo. - esto es solo en el cargador de módulos ECMAScript, el cargador CommonJS permanece intacto, pero la extensión funcionará en el cargador anterior si usa la ruta completa del archivo.
- esto es específicamente para admitir la importación de CommonJS en el
--es-module-specifier-resolution=[type]
- Las opciones son
explicit
(predeterminada) ynode
- De forma predeterminada, nuestro cargador no permitirá extensiones opcionales en la importación, la ruta de un módulo debe incluir la extensión si la hay.
- De forma predeterminada, nuestro cargador no permitirá importar directorios que tengan un archivo de índice.
- los desarrolladores pueden utilizar
--es-module-specifier-resolution=node
para habilitar el algoritmo de resolución del especificador CommonJS - Esta no es una "característica", sino más bien una implementación para experimentación. Se espera que cambie antes de que se elimine la bandera.
- Las opciones son
--experimental-json-loader
- la única forma de importar JSON cuando
"type": "module"
- cuando esté habilitado, todo
import 'thing.json'
pasará por el cargador experimental independientemente del modo - basado en whatwg/html#4315
- la única forma de importar JSON cuando
- Puede utilizar
package.main
para establecer un punto de entrada para un módulo.- las extensiones de archivo utilizadas en main se resolverán según el tipo de módulo
17 de enero de 2019
Node.js 11.6.0 todavía enumera los módulos ES como experimentales, detrás de una bandera.
13 de septiembre de 2017
Node.js 8.5.0 se lanzó con soporte para archivos mjs detrás de una bandera:
node --experimental-modules index.mjs
El plan para esto es eliminar la marca para la versión v10.0 LTS.
--Información desactualizada. Guardado aquí con fines históricos.
8 de septiembre de 2017
La rama maestra de Node.js se actualizó con soporte inicial para módulos ESM: https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
Esto debería estar disponible en la última versión nocturna (se puede instalar a través de nvm para ejecutarlo junto con su instalación existente): https://nodejs.org/download/nightly/
Y habilitado detrás de la --experimental-modules
bandera:
paquete.json
{
"name": "testing-mjs",
"version": "1.0.0",
"description": "",
"main": "index.mjs" <-- Set this to be an mjs file
}
Entonces corre:
node --experimental-modules .
Febrero de 2017:
Una actualización de los módulos ES6 en Node.js
Los chicos de Node.js han decidido que la solución menos mala es utilizar la .mjs
extensión de archivo. La conclusión de esto es:
En otras palabras, dados dos archivos
foo.js
ybar.mjs
, el usoimport * from 'foo'
se trataráfoo.js
como CommonJS mientras queimport * from 'bar'
se tratarábar.mjs
como un módulo ES6.
Y en cuanto a los plazos...
En el momento actual, todavía hay una serie de problemas de especificación e implementación que deben suceder en el lado de ES6 y la máquina virtual antes de que Node.js pueda siquiera comenzar a trabajar en una implementación compatible de los módulos ES6. El trabajo está en progreso, pero llevará algún tiempo; actualmente estamos considerando al menos alrededor de un año .
Octubre de 2016:
Uno de los desarrolladores de Node.js asistió recientemente a una reunión TC-39 y escribió un excelente artículo sobre los obstáculos para la implementación de Node.js:
Node.js, TC-39 y módulos
La conclusión básica de esto es:
- Los módulos ECMAScript se analizan estáticamente y se evalúan CommonJS
- Los módulos CommonJS permiten exportaciones de parches de mono, y los módulos ECMAScript actualmente no lo hacen
- Es difícil detectar qué es un módulo ECMAScript y qué es CommonJS sin algún tipo de intervención del usuario, pero lo están intentando.
*.mjs
parece la solución más probable, a menos que puedan detectar con precisión un módulo ECMAScript sin intervención del usuario
-- Respuesta original --
Esta ha sido una papa caliente durante bastante tiempo. La conclusión es que sí, Node.js eventualmente admitirá la sintaxis ES2015 para importar/exportar módulos, muy probablemente cuando se finalice y acuerde la especificación para cargar módulos .
Aquí hay una buena descripción general de lo que está frenando a Node.js. Esencialmente, deben asegurarse de que la nueva especificación funcione para Node.js, que es principalmente carga condicional y sincrónica, y también para HTML, que es principalmente asincrónico.
Nadie lo sabe con seguridad en este momento, pero imagino que Node.js admitirá import/export
la carga estática, además de la nueva versión System.import
para la carga dinámica, manteniendo require
el código heredado.
Aquí hay algunas propuestas sobre cómo Node podría lograr esto:
- En defensa de .js
- módulos .mjs