Eu tenho procurado por toda a internet sem uma resposta clara para isso.
Atualmente, o NodeJS usa apenas a sintaxe CommonJS para carregar módulos e, se você realmente deseja usar a sintaxe padrão dos módulos do ES2015, é necessário transpilar previamente ou usar um carregador de módulo externo em tempo de execução.
Atualmente, não sou muito positivo em usar um desses dois métodos. Os mantenedores do NodeJS estão planejando dar suporte aos módulos do ES2015 ou não? Eu não encontrei uma dica sobre isso.
No momento, o NodeJS 6.x afirma apoiar 96% dos recursos do ES2015, mas não há nenhuma referência a módulos ( link de suporte do NodeJS ES2105 ).
Você sabe se o NodeJS suportará esses módulos imediatamente, em um futuro próximo?
javascript
node.js
module
ecmascript-6
es6-modules
Zorgatone
fonte
fonte
node es2015 modules
, mostra o seguinte como um dos principais resultados: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node .Respostas:
Nó 13.2.0 ou superior
O NodeJS 13.2.0 agora suporta os Módulos ES sem um sinalizador 🎉 No entanto, a implementação ainda está marcada como experimental, portanto, use na produção com cuidado.
Para habilitar o suporte ao ESM na 13.2.0, adicione o seguinte ao seu
package.json
:Todos
.js
,.mjs
(ou arquivos sem uma extensão) será tratado como ESM.Existem várias opções diferentes da aceitação
package.json
total, todas detalhadas na documentação para 13.2.0 .Nó 13.1.0 e inferior
Aqueles que ainda usam versões mais antigas do Node podem querer experimentar o carregador de módulo esm , que é uma implementação pronta para produção da ES Modules Spec for NodeJS:
Atualizações detalhadas ...
23 de abril de 2019
Um PR chegou recentemente para alterar a maneira como os Módulos ES são detectados: https://github.com/nodejs/node/pull/26745
Ainda está atrás do
--experimental-modules
sinalizador, mas há grandes mudanças na maneira como os módulos podem ser carregados:package.type
que pode ser ummodule
oucommonjs
type: "commonjs"
:.js
é analisado como commonjstype: "module"
:.js
é analisado como esm--type=[mode]
para permitir que você defina o tipo no ponto de entrada. Substituirápackage.type
pelo ponto de entrada..cjs
.module
modo--es-module-specifier-resolution=[type]
explicit
(padrão) enode
--es-module-specifier-resolution=node
para ativar o algoritmo de resolução do especificador commonjs--experimental-json-loader
"type": "module"
import 'thing.json'
, passará pelo carregador experimental independente do modopackage.main
para definir um ponto de entrada para um módulo17 de janeiro de 2019
O nó 11.6.0 ainda lista os Módulos ES como experimentais, atrás de um sinalizador.
13 de setembro de 2017
O NodeJS 8.5.0 foi lançado com suporte para arquivos mjs atrás de um sinalizador:
O plano para isso é remover o sinalizador da versão v10.0 LTS.
- Informações desatualizadas. Mantido aqui para fins históricos--
8 de setembro de 2017
A ramificação principal do NodeJS foi atualizada com suporte inicial para módulos ESM:
https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5
Isso deve estar disponível na última noite (isso pode ser instalado via nvm para ser executado juntamente com a instalação existente):
https://nodejs.org/download/nightly/
E ativado atrás da
--experimental-modules
bandeira:package.json
Então corra:
Fevereiro de 2017:
https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37
O pessoal do NodeJS decidiu que a solução menos ruim é usar a
.mjs
extensão do arquivo. A conclusão disso é:E quanto aos prazos ...
Outubro de 2016:
Um dos desenvolvedores do Node.JS participou recentemente de uma reunião do TC-39 e escreveu um excelente artigo sobre os bloqueadores para a implementação do Node.JS:
https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e
A retirada básica disso é:
*.mjs
parece a solução mais provável, a menos que eles possam detectar com precisão um módulo ES sem a entrada do usuário- Resposta original -
Esta tem sido uma batata quente há algum tempo. A conclusão é que sim, o Node eventualmente suportará a sintaxe do ES2015 para importar / exportar módulos - provavelmente quando a especificação para carregar módulos for finalizada e acordada.
Aqui está uma boa visão geral do que está mantendo o NodeJS. Essencialmente, eles precisam garantir que a nova especificação funcione para o Node, que é principalmente carregamento síncrono condicional e também HTML, que é basicamente assíncrono.
Ninguém sabe ao certo agora, mas imagino que o Node suporte
import/export
para carregamento estático, além do novoSystem.import
para carregamento dinâmico - enquanto mantém orequire
código legado.Aqui estão algumas propostas sobre como o Node pode conseguir isso:
fonte
.mjs
extensão:We have affectionately called these “Michael Jackson Script” files in the past
. Apenas no caso de você ouvir alguém falando sobre artistas pop durante o JS.import * from 'foo'
tratará foo.js como o CommonJSimport * as bar from 'bar'
tratará bar.js como um módulo ES6 Alguém pode explicar?