Módulos ECMAScript no Node.js: um novo plano

Status de suporte atual para módulos ECMAScript (ESMs) no Node.js:


  • O suporte experimental ao ESM foi adicionado ao Node.js 8.5.0 em 12 de setembro de 2017.
  • Depois disso, o Comitê Técnico de Direção do Node.js. formou a equipe responsável pela equipe de módulos para ajudar a projetar as peças ausentes para a próxima versão (não experimental). Essa equipe é formada por pessoas de vários setores de desenvolvimento da Web (front-end, back-end, mecanismos JS, etc.).

Em outubro, a equipe de módulos publicou o "Plano de implementação de novos módulos" . Esta postagem explica o que ela contém.


Fases


O processo é dividido em três fases:


  • Fase 1: crie um núcleo "mínimo" - o conjunto básico de regras e recursos, o mínimo e o mais seguro possível.
  • Fase 2 em diante: criando funcionalidades mais complexas baseadas no kernel.

Um núcleo mínimo será a base para trabalhos futuros. O novo design também substituirá a implementação experimental atual assim que adquirir recursos semelhantes.


Fase 1: suporte básico mínimo ao ESM no Node.js


Simplificação de identificadores de módulo


Um dos objetivos da equipe de módulos é alcançar a “equivalência do navegador” : o Node.js deve estar o mais próximo possível dos navegadores. O kernel consegue isso simplificando a análise de identificadores de módulo (URLs apontando para módulos):


  • Cada identificador de módulo deve terminar com um nome de arquivo com a extensão. Isso é
    • Extensões não são adicionadas automaticamente
    • A importação de diretórios não é suportada (por meio do redirecionamento para dir/index.mjs ou pela leitura do campo main em package.json ).
  • Os módulos ES podem importar módulos internos do Node.js. ( path e similares). Eles são a única exceção à regra anterior.
  • Por padrão, apenas os arquivos com a extensão .mjs são .mjs (consulte a Fase 2 se você estiver interessado no status de outras extensões). Portanto, outros tipos de módulos não podem ser importados através da import : módulos CommonJS, arquivos JSON, módulos nativos.

Trazendo recursos essenciais do CommonJS aos módulos ES


  • URL do módulo atual (semelhante ao __filename do CommonJS): import.meta.url
  • Importe dinamicamente os módulos ES (disponíveis por meio de require() no CommonJS): import()

Compatibilidade


  • Os módulos ES poderão importar módulos CommonJS por meio de createRequireFromPath() . Isso funcionará da seguinte maneira (há planos para criar um método abreviado, por exemplo, a função createRequireFromUrl() ):

 import {createRequireFromPath as createRequire} from 'module'; import {fileURLToPath as fromPath} from 'url'; const require = createRequire(fromPath(import.meta.url)); const cjsModule = require('./cjs-module.js'); 

  • Os módulos CommonJS poderão carregar os módulos ES através de import() .

Fase 2 e planos futuros


  • Na segunda fase, estamos aguardando:
    • Suporte para identificadores "simples", como 'lodash' . Provavelmente, isso incluirá alguma maneira de mapear esses identificadores para caminhos reais.
    • Suporte para outras extensões de arquivo além do .mjs . Isso inclui, entre outras coisas, suporte para módulos ES em arquivos .js .
  • A fase 3 provavelmente se concentrará nos carregadores de módulos com pontos de extensão em que os usuários podem conectar sua lógica.

Quando posso usar os módulos ES no Node.js?


  • Atrás da bandeira: disponível agora
    • Cuidado: o comportamento ainda não corresponde ao descrito acima na fase 1 (a partir do Node.js. 11.5.0)
  • Sem uma bandeira e de acordo com a fase 1: a equipe de módulos está tentando tornar isso possível o mais rápido possível. Esperamos que os módulos sejam liberados do sinalizador no Node.js. 14 (abril de 2020) e portados para versões anteriores, se possível.

Perguntas frequentes


  • Por que preciso de uma nova .mjs arquivo .mjs ?
    • Cada decisão de distinguir entre os formatos ESM e CommonJS tem suas vantagens e desvantagens. Usar uma resolução separada parece ser uma boa opção ( mais informações ).
  • Por que o Node.js deve se comportar como um navegador?
    • Porque isso possibilita a reutilização de código. Por exemplo, para criar bibliotecas que funcionam nos navegadores e no Node.js
    • Isso também deve facilitar a alternância entre o back-end e o front-end durante a codificação.
  • Por que todas essas restrições para compatibilidade?
    • Existem diferenças bastante fortes entre os módulos ES e CommonJS na estrutura (estática versus dinâmica) e no método de carregamento (assíncrono versus síncrono). As restrições ajudam a simplificar as coisas - já que, a longo prazo, a grande maioria será de módulos ES.
  • Por que tudo isso dura tanto tempo?
    • Muitas partes interessadas estão envolvidas aqui e muitas plataformas diferentes (Node.js, npm, navegadores, mecanismos JS, TypeScript, TC39 e outros). Se realmente adquirirmos módulos ES que podem funcionar em qualquer lugar, provavelmente vale a pena esperar, IMHO.

Gratidão


Obrigado a Miles Borins por seus comentários sobre este post.


Recursos adicionais para leitura adicional


Source: https://habr.com/ru/post/pt433964/


All Articles