nodejs node modules exports es6 ecmascript javascript node.js module ecmascript-6 es6-modules

javascript - modules - NodeJS planea admitir módulos de importación/exportación es6(es2015)



node js es6 import module (1)

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 desea 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 ).

¿Sabe si NodeJS admitirá estos módulos listos para usar, en un futuro próximo?


tl; dr

El último NodeJS todavía enumera los módulos ES como experimentales, detrás de una bandera.

Aquellos que buscan una solución al problema pueden 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:

node -r esm main.js

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 del --experimental-modules , pero hay cambios importantes en la forma en que se pueden cargar los módulos:

  • package.type que puede ser module o commonjs
    • type: "commonjs" :
    • .js se analiza como commonjs
    • el valor predeterminado para el punto de entrada sin una extensión es commonjs
    • type: "module":
    • .js se analiza como esm
    • no admite cargar JSON o Native Module de forma predeterminada
    • el valor predeterminado para el punto de entrada sin una extensión es esm
  • --type=[mode] para permitirle establecer el tipo en el punto de entrada. Reemplazará 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 modo de module .
    • esto es solo en el cargador de esm, el cargador commonjs permanece intacto, pero la extensión funcionará en el cargador anterior si utiliza la ruta completa del archivo.
  • --es-module-specifier-resolution=[type]
    • las opciones son explicit (por defecto) y node
    • de manera predeterminada, nuestro cargador no permitirá extensiones opcionales en la importación, la ruta de un módulo debe incluir la extensión si hay una
    • de manera predeterminada, nuestro cargador no permitirá importar directorios que tengan un archivo de índice
    • los desarrolladores pueden usar --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 la experimentación. Se espera que cambie antes de quitar la bandera
  • --experimental-json-loader
    • la única forma de importar json cuando "type": "module"
    • cuando habilite toda la import ''thing.json'' pasará por el cargador experimental independientemente del modo
    • basado en whatwg/html#4315
  • Puede usar 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 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:

node --experimental-modules index.mjs

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 las últimas noches (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 bandera --experimental-modules :

package.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 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 extensión de archivo .mjs . La conclusión de esto es:

En otras palabras, dados dos archivos foo.js y bar.mjs , el uso de import * from ''foo'' tratará foo.js como CommonJS, mientras que import * from ''bar'' tratará bar.mjs como un Módulo ES6

Y en cuanto a las líneas de tiempo ...

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 comenzar a trabajar en una implementación compatible de módulos ES6. El trabajo está en progreso, pero llevará algún tiempo. Actualmente estamos analizando alrededor de un año al menos .

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:

  • Los módulos ES se analizan estáticamente, se evalúan CommonJS
  • Los módulos CommonJS permiten exportaciones de parches de mono, los módulos ES actualmente no
  • Es difícil detectar qué es un módulo ES y qué es CommonJS sin alguna forma de entrada 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 ES sin *.mjs 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á la import/export para la carga estática, además del nuevo System.import para la carga dinámica, sin dejar de require código heredado.

Aquí hay algunas propuestas sobre cómo Node podría lograr esto: