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
:
{
"type": "module"
}
Todos .js
, .mjs
(ou arquivos sem uma extensão) será tratado como ESM.
Existem várias opções diferentes da aceitaçãopackage.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:
node -r esm main.js
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 um module
oucommonjs
type: "commonjs"
:
.js
é analisado como commonjs
- o padrão para o ponto de entrada sem uma extensão é commonjs
type: "module"
:
.js
é analisado como esm
- não suporta carregar JSON ou Native Module por padrão
- o padrão para o ponto de entrada sem uma extensão é esm
--type=[mode]
para permitir que você defina o tipo no ponto de entrada. Substituirá package.type
pelo ponto de entrada.
- Uma nova extensão de arquivo
.cjs
.
- isso é especificamente para oferecer suporte à importação de commonjs no
module
modo
- isso é apenas no carregador esm, o carregador commonjs permanece intocado, mas a extensão funcionará no carregador antigo se você usar o caminho completo do arquivo.
--es-module-specifier-resolution=[type]
- opções são
explicit
(padrão) enode
- por padrão, nosso carregador não permitirá extensões opcionais na importação, o caminho para um módulo deve incluir a extensão se houver uma
- por padrão, nosso carregador não permitirá a importação de diretórios que possuem um arquivo de índice
- os desenvolvedores podem usar
--es-module-specifier-resolution=node
para ativar o algoritmo de resolução do especificador commonjs
- Este não é um "recurso", mas uma implementação para experimentação. Espera-se que mude antes que o sinalizador seja removido
--experimental-json-loader
- a única maneira de importar json quando
"type": "module"
- quando ativar tudo
import 'thing.json'
, passará pelo carregador experimental independente do modo
- com base no whatwg / html # 4315
- Você pode usar
package.main
para definir um ponto de entrada para um módulo
- as extensões de arquivo usadas no main serão resolvidas com base no tipo do módulo
17 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:
node --experimental-modules index.mjs
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
{
"name": "testing-mjs",
"version": "1.0.0",
"description": "",
"main": "index.mjs" <-- Set this to be an mjs file
}
Então corra:
node --experimental-modules .
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 é:
Em outras palavras, dados dois arquivos foo.js
e bar.mjs
, using import *
from 'foo'
tratará foo.js
como CommonJS enquanto import * from 'bar'
tratará bar.mjs
como um módulo ES6
E quanto aos prazos ...
No momento atual, ainda existem vários problemas de especificação e implementação que precisam ocorrer no lado ES6 e na Máquina Virtual antes que o Node.js possa começar a trabalhar em uma implementação suportável dos módulos ES6. Trabalho está em andamento, mas vai levar algum tempo - Estamos navegando em torno de um ano , pelo menos .
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 é:
- Módulos ES são analisados estaticamente, CommonJS são avaliados
- Os módulos CommonJS permitem exportações de patches de macaco, atualmente os Módulos ES não
- É difícil detectar o que é um módulo ES e o que é CommonJS sem alguma forma de entrada do usuário, mas eles estão tentando.
*.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 novo System.import
para carregamento dinâmico - enquanto mantém o require
código legado.
Aqui estão algumas propostas sobre como o Node pode conseguir isso:
node es2015 modules
, mostra o seguinte como um dos principais resultados: github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node .