ECMAScript Modules no NodeJS
ECMAScript modules, também conhecido como “ES modules” ou apenas “ESM”, é uma feature muito esperada há anos, que adiciona suporte para uso de módulos no JavaScript de forma nativa, padronizada.
E com a chegada do NodeJS 12, tivemos uma nova implementação da flag --experimental-modules
, e a expectativa é que esta seja entregue para substituir o padrão CommonJS, na versão LTS, prevista para ser lançada em Outubro desse ano.
Está na hora de brincarmos um pouco com essas novidades e preparar nosso código para essa atualização!
Usando ES Modules no NodeJS
Ao usar a flag --experimental-modules
, por padrão, o NodeJS reconhecerá a nova sintaxe somente nos arquivos com extensão .mjs
.
E se preferir, podemos continuar usando a extensão .js
. Para isso basta adicionar um "type": "module"
no package.json
do projeto.
Regras básicas
Para importar módulos, devemos passar o nome do arquivo completo, com a extensão.
Por exemplo: import Fliper from './fliper.js'
.
Mas, se quiser, podemos também usar o comportamento estilo CommonJS, que resolve a extensão de forma automática.
Para isso, é necessário passar uma nova flag: —-es-module-specifier-resolution=node
.
Com essa flag, o import
fica assim: import Fliper from './fliper'
.
Importando módulos do npm e bibliotecas do core
O loader de ES modules do NodeJS suporta módulos escritos em CommonJS também.
Por isso, podemos continuar usando normalmente os módulos baixados do npm
, que estejam nesse formato.
Por exemplo, para importar o framework Express: import express from 'express'
.
Além disso, todas as bibliotecas core como fs
e path
, já suportam o padrão ESM.
Conclusão
Com a chegada do ES Modules por padrão no NodeJS, não será mais necessário utilizar flags e transpiladores para termos suporte completo a código ES6. E ao menos que o código use bibliotecas core do NodeJS, poderemos — de verdade — escrever um único JavaScript que rode em qualquer ambiente, tanto no cliente como no servidor. JavaScript isomórfico!
Referências
- Announcing a new --experimental-modules
- The new ECMAScript module support in Node.js 12
- What’s New in Node.js 12: ESM Imports