TL; DR - No, hasta ~ octubre de 2019. El equipo de módulos de Node.js ha preguntado :
No publique ningún paquete de módulo ES destinado a ser utilizado por Node.js hasta [octubre de 2019]
Actualización de mayo de 2019
Desde 2015, cuando se hizo esta pregunta, el soporte de JavaScript para los módulos ha madurado significativamente y esperamos que sea oficialmente estable en octubre de 2019. Todas las demás respuestas ahora son obsoletas o demasiado complicadas. Aquí está la situación actual y las mejores prácticas.
Soporte ES6
El 99% de ES6 (también conocido como 2015) ha sido compatible con Node desde la versión 6 . La versión actual de Node es 12. Todos los navegadores de hoja perenne admiten la gran mayoría de las funciones de ES6. ECMAScript ahora está en la versión 2019 , y el esquema de versiones ahora favorece el uso de años.
Módulos ES (también conocidos como módulos ECMAScript) en navegadores
Todos los navegadores de hoja perenne han sido compatibles con los import
módulos ES6 desde 2017. Las importaciones dinámicas son compatibles con Chrome (+ tenedores como Opera y Samsung Internet) y Safari. El soporte de Firefox está programado para la próxima versión, 67.
Ya no necesita Webpack / rollup / Parcel, etc. para cargar módulos. Pueden seguir siendo útiles para otros fines, pero no están obligados a cargar su código. Puede importar directamente las URL que apuntan al código de los módulos ES.
Módulos ES en Nodo
Los módulos ES ( .mjs
archivos con import
/ export
) han sido soportados desde el Nodo v8.5.0 llamando node
con la --experimental-modules
bandera. Nodo v12, lanzado en abril de 2019, reescribió el soporte de módulos experimentales. El cambio más visible es que la extensión del archivo debe especificarse de forma predeterminada al importar:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
Tenga en cuenta las .mjs
extensiones obligatorias en todo. Correr como:
node --experimental-modules index.mjs
La versión Node 12 también es cuando el Equipo de Módulos solicitó a los desarrolladores que no publiquen paquetes de módulos ES destinados a ser utilizados por Node.js hasta que se encuentre una solución para usar paquetes a través de ambos require('pkg')
y import 'pkg'
. Todavía puede publicar módulos ES nativos destinados a navegadores.
Soporte de ecosistema de módulos ES nativos
A partir de mayo de 2019, el soporte del ecosistema para los módulos ES es inmaduro. Por ejemplo, los marcos de prueba como Jest y Ava no son compatibles --experimental-modules
. Debe usar un transpilador, y luego debe decidir entre usar la import { symbol }
sintaxis nombrada import ( ) (que todavía no funcionará con la mayoría de los paquetes npm), y la sintaxis predeterminada de importación ( import Package from 'package'
), que funciona, pero no cuando Babel lo analiza para paquetes creados en TypeScript (graphql-tools, node-influx, faast, etc.) Sin embargo, existe una solución alternativa que funciona con --experimental-modules
y si Babel transpila su código para que pueda probarlo con Jest / Ava / Mocha, etc.
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
Posiblemente feo, pero de esta manera puede escribir su propio código de módulos ES con import
/ export
y ejecutarlo con node --experimental-modules
, sin transpiladores. Si tiene dependencias que aún no están preparadas para ESM, impórtelas como se indica arriba y podrá usar marcos de prueba y otras herramientas a través de Babel.
Respuesta previa a la pregunta: recuerde, no haga esto hasta que Node resuelva el problema de requerir / importar, con suerte alrededor de octubre de 2019.
Publicación de módulos ES6 en npm, con compatibilidad con versiones anteriores
Para publicar un módulo ES en npmjs.org para que se pueda importar directamente, sin Babel u otros transpiladores, simplemente apunte el main
campo en package.json
el .mjs
archivo, pero omita la extensión:
{
"name": "mjs-example",
"main": "index"
}
Ese es el único cambio. Al omitir la extensión, Node buscará primero un archivo mjs si se ejecuta con --experimental-modules. De lo contrario, volverá al archivo .js, por lo que su proceso de transpilación existente para admitir versiones de Nodo anteriores funcionará como antes, solo asegúrese de apuntar a Babel a los .mjs
archivos.
Aquí está la fuente de un módulo ES nativo con compatibilidad con versiones anteriores para Nodo <8.5.0 que publiqué en NPM. Puedes usarlo ahora mismo, sin Babel ni nada más.
Instale el módulo:
npm install local-iso-dt
# or, yarn add local-iso-dt
Cree un archivo de prueba test.mjs :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Ejecute el nodo (v8.5.0 +) con el indicador --experimental-modules:
node --experimental-modules test.mjs
Mecanografiado
Si desarrolla en TypeScript, puede generar código ES6 y usar módulos ES6:
tsc index.js --target es6 --modules es2015
Luego, debe cambiar *.js
el nombre de la salida a .mjs
, un problema conocido que, con suerte, se solucionará pronto para que tsc
pueda enviar .mjs
archivos directamente.