Recentemente , o suporte aos módulos ECMAScript foi anunciado no Node.js, e o suporte para importações dinâmicas apareceu no ES2020. Na estrutura deste artigo, falarei sobre a implementação do caso óbvio do uso de importações dinâmicas - com nomes de diretório desconhecidos com antecedência.

Edição
Frequentemente, observo aproximadamente a seguinte estrutura de diretĂłrios nos projetos:
$ tree . ├── modules │ ├── a │ │ └── index.ts │ ├── b │ │ └── index.ts │ └── c │ └── bobule.ts ├── index.ts └── package.json
e o conteĂşdo de index.ts
:
import a from './modules/a'; import b from './modules/b'; import c from './modules/c/bobule.ts'; export default { module: a, dopule: b, bobule: c };
E, em algum lugar no nĂvel superior, há outro index.ts que importa esse index.ts que importa ...
Gostaria de escrever algo como index.ts
nĂvel index.ts
import modules from './modules/*/*'
mas fora da caixa, isso nĂŁo Ă© suportado, o que despertou em mim um desejo irreprimĂvel de ferrar muleta, bicicleta, quadro Sem dĂşvida, uma solução Ăştil, original e muito necessária para esse problema.
Importações dinâmicas
A principal vantagem de importar dinâmico sobre estático é a forma funcional, que permite carregar módulos por condição. Funciona assim:
Assim, adicionando um pouco de fs
a esse design, as importações dinâmicas permitirĂŁo que vocĂŞ obtenha todos os arquivos dos subdiretĂłrios de qualquer nĂvel.
Inspirado em PHP
A idéia de carregamento automático não é nova e é ativamente usada em PHP, embora por razões arquitetônicas e históricas, mas nada me impeça de criar minhas próprias dificuldades e superá-las heroicamente. Portanto, tentei criar uma seção de carregamento automático em package.json e criar uma ferramenta que lê o nome do módulo por chave e o caminho do arquivo a partir do valor:
// package.json { "autoload": { "modules": ["modules", "*", "index.ts"] "bobules": ["*", "*", "bobule.ts"], } }
No caso do uso de digitação, há um momento irritante com o fato de as extensões mudarem após a criação do aplicativo e existirem mais de duas delas: ts|js|mjs|tsx
para que vocĂŞ possa levar isso imediatamente em consideração, listando todas as opções disponĂveis e baixe apenas as que vocĂŞ precisa:
// package.json { "autoload": { "modules": ["modules", "*", "index.ts|js"] "bobules": ["*", "*", "bobule.ts|js"], } }
Implementação
Os seguintes casos sĂŁo obtidos:
f(projectRoot, ['modules', '*', 'index.js|ts'], moduleName = 'default')
// carrega os módulos no caminho especificado pelo usuáriof(projectRoot)
// carregando os módulos do package.json, os nomes dos módulos (chaves na seção de carregamento automático) nesse caso são passados ​​pelo terceiro argumento já "sob o capô".
Construir caminhos é uma tarefa trivial, basta percorrer a matriz e selecionar todos os subdiretórios para as estrelas, quando a matriz terminar, retorná-la e carregar os módulos na matriz. Como resultado, por algumas noites, desenhei para mim esta solução desta maneira:

Por que isso Ă© tudo?
Pareceu-me que o problema das importações dinâmicas era injustamente muito mal coberto e todas essas bibliotecas no npm não são levemente atualizadas (ou eu estava parecendo mal?), E a tecnologia permite que você faça bem sem registrar e enviar SMS. Espero que o código-fonte do projeto e meus casos de uso o interessem para uso em seus projetos, reduzindo um pouco a duplicação de código estragando um novo muleta, bicicleta, quadro sem dúvida um ajudante útil.
Links, provas, traduções:
- MĂłdulos ECMAScript
- Importações dinâmicas:
O código fonte deste código sem falhas está aqui:
https://github.com/Melodyn/npm-dynamicimport/blob/master/lib/index.js#L93-L120
Obtenha uma experiência valiosa do usuário aqui:
https://www.npmjs.com/package/@melodyn/dynamicimport
O gato está aqui:
(^ ≗ω≗ ^)