TL; DR - não, até ~ outubro de 2019. O Node.js Módulos equipe tem perguntou :
Não publique nenhum pacote de módulo ES destinado ao Node.js. até [outubro de 2019]
Atualização de maio de 2019
Desde 2015, quando essa pergunta foi feita, o suporte a JavaScript para módulos amadureceu significativamente e, espero, permanecerá oficialmente estável em outubro de 2019. Todas as outras respostas agora estão obsoletas ou muito complicadas. Aqui está a situação atual e as melhores práticas.
Suporte ES6
99% do ES6 (também conhecido como 2015) é suportado pelo Node desde a versão 6 . A versão atual do Node é 12. Todos os navegadores perenes suportam a grande maioria dos recursos do ES6. O ECMAScript está agora na versão 2019 , e o esquema de versão agora favorece o uso de anos.
Módulos ES (também conhecidos como módulos ECMAScript) nos navegadores
Todos os verdes navegadores foram apoiar import
-ing módulos ES6 desde 2017. importações dinâmicos são suportados pelo Chrome (+ garfos como Opera e Samsung Internet) e Safari. O suporte ao Firefox está previsto para a próxima versão, 67.
Você não precisa mais do Webpack / rollup / Parcel etc. para carregar os módulos. Eles ainda podem ser úteis para outros fins, mas não são necessários para carregar seu código. Você pode importar diretamente URLs apontando para o código dos módulos ES.
Módulos ES no Nó
Os módulos ES ( .mjs
arquivos com import
/ export
) são suportados desde o Nó v8.5.0 chamando node
com o --experimental-modules
sinalizador. O nó v12, lançado em abril de 2019, reescreveu o suporte aos módulos experimentais. A mudança mais visível é que a extensão do arquivo precisa ser especificada por padrão ao importar:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
Observe as .mjs
extensões obrigatórias por toda parte. Correr como:
node --experimental-modules index.mjs
O lançamento do nó 12 é também quando a Equipe de Módulos perguntou desenvolvedores de não publicar pacotes de módulos ES destinado ao uso por Node.js até que uma solução seja encontrada para o uso de pacotes via tanto require('pkg')
e import 'pkg'
. Você ainda pode publicar módulos ES nativos destinados a navegadores.
Suporte ao ecossistema de módulos ES nativos
Em maio de 2019, o suporte ao ecossistema para os Módulos ES é imaturo. Por exemplo, estruturas de teste como Jest e Ava não suportam --experimental-modules
. Você precisa usar um transpiler e, em seguida, deve decidir entre usar a import { symbol }
sintaxe import ( ) nomeada (que ainda não funcionará com a maioria dos pacotes npm) e a sintaxe padrão de importação ( import Package from 'package'
), que funciona, mas não quando Babel a analisa. para pacotes criados no TypeScript (graphql-tools, node-influx, faast etc.) No entanto, existe uma solução alternativa que funciona com --experimental-modules
e se Babel transpila seu código para que você possa testá-lo com Jest / Ava / Mocha etc:
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
Indiscutivelmente feio, mas dessa maneira você pode escrever seu próprio código de módulo ES com import
/ export
e executá-lo com node --experimental-modules
, sem transpilers. Se você tiver dependências que ainda não estão preparadas para o ESM, importe-as como acima, e poderá usar estruturas de teste e outras ferramentas via Babel.
Resposta anterior à pergunta - lembre-se, não faça isso até o Node resolver o problema de solicitação / importação, esperamos que em outubro de 2019.
Publicando módulos ES6 para npm, com compatibilidade com versões anteriores
Para publicar um módulo ES no npmjs.org para que ele possa ser importado diretamente, sem Babel ou outros transpilers, basta apontar o main
campo package.json
para o .mjs
arquivo, mas omita a extensão:
{
"name": "mjs-example",
"main": "index"
}
Essa é a única mudança. Ao omitir a extensão, o Node procurará primeiro um arquivo mjs se for executado com --experimental-modules. Caso contrário, ele retornará ao arquivo .js, portanto, seu processo de transpilação existente para suportar versões mais antigas do Node funcionará como antes - apenas aponte Babel para o .mjs
(s) arquivo (s).
Aqui está a fonte de um módulo ES nativo com compatibilidade com versões anteriores para o Nó <8.5.0 que publiquei no NPM. Você pode usá-lo agora mesmo, sem Babel ou qualquer outra coisa.
Instale o módulo:
npm install local-iso-dt
# or, yarn add local-iso-dt
Crie um arquivo de teste test.mjs :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Execute o nó (v8.5.0 +) com o sinalizador --experimental-modules:
node --experimental-modules test.mjs
TypeScript
Se você desenvolver no TypeScript, poderá gerar o código ES6 e usar os módulos ES6:
tsc index.js --target es6 --modules es2015
Em seguida, é necessário renomear a *.js
saída para .mjs
, um problema conhecido que, esperançosamente, será corrigido em breve para tsc
que os .mjs
arquivos sejam gerados diretamente.