Typescript 🆚 NodeJS Runtime: Problemas e soluções na importação de módulos
Tags: typescript, node, javascript, beginners
Published: 2024-03-22 18:10:47


Como um desenvolvedor gosto de experimentar diversas linguagens. Já faz um bom tempo desde a última vez que fiz algum com Typescript, porém hoje estive trabalhando em um projeto e tive uma enorme dificuldade para conseguir gerar a build em javascript

O interessante é que o código funciona corretamente no *ts-node*, porém ao executar o *tsc* e utilizar o nodejs surge o erro `MODULE_NOT_FOUND`


![Imagem: Mensagem de erro Module Not Found](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/su7kw9z5w8pqpixk5lon.png)


Nessa hora entendi que era um problema com os imports pois não é a primeira vez que me deparo com esse problema. No entanto nada aparentava erro no meu VSCode…


![Imagem: Importações não utilizando caminhos relativos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/auecbfjc7l5exkqn3mym.png)



...nem no *tsconfig.js*


![Imagem: Configuração do arquivo tsconfig.json](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pcmlpi3p35u3qxjz83ty.png)



Quando fui dar uma olhada no script de dev e start, lembrei do *tsconfig-paths* o qual eu havia configurado no início do projeto para resolver os caminhos relativos dis *imports.* Com isso, dei uma pesquisada e descobri que ele pode ser utilizado não apenas no *ts-node* e *ts-node-dev*, mas também no próprio *node*.


![Imagem: Conteúdo do package.json](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sg8msi3payb93rv8ysak.png)



Assim, resolvi testar uma nova build, mas agora passando os parametros abaixo para o node:

*ts-node/register/transpile-only -* transpila arquivos TypeScript em tempo de execução usando o `ts-node`, sem realizar a verificação de tipo.

*tsconfig-paths/register -* registra os caminhos definidos no `tsconfig.json` usando o `tsconfig-paths`. Isso permite que o Node.js resolva os módulos usando os caminhos definidos no `tsconfig.json`, dispensando a necessidade dos caminhos relativos.

O comando fica assim:

```plaintext
node -r ts-node/register/transpile-only -r tsconfig-paths/register ./dist/main.js
```

E não é que deu certo?


![Imagem: Sucesso no teste do nodejs com os modulos carregados](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0suxfhu53qkfg0nsfkjr.png)




### Nem tudo são flores…

Apesar de ser uma boa solução, pode não ser uma boa opção para ambientes de produção visto que há um aumento no consumo de memória devido aos modulos extras carregados pelo node. No entanto, não conseguir descobrir se o consumo escala de acordo com o tamanho da aplicação.


![Imagem: Consumo de memória do nodejs com caminhos relativos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6orz56lf9zzvd89hsc90.png)



Node com caminhos relativos


![Imagem: Consumo de memória do nodejs com módulos adicionais](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ku7oghtaqnj0rxnly81h.png)



Node com módulos adicionais

Depois de pesquisar muitas alternativas, descobri o pacote [*tsc-alias*](https://www.npmjs.com/package/tsc-alias) que simplifica toda essa questão de resolução de módulos no typescript vs runtime.

Após adicioná-lo ao projeto, basta buildar o projeto normalmente com o *tsc* e na sequencia executar o comando *tsc-alias*. Você também pode adicionar o comando ao script de build no package.json.

Olha como ficou a utilização de memória.


![Imagem: Consumo de memória do nodejs apos o tsc-alias](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ipsbi2kvgu4hjr4gb0vq.png)


Espero que tenham gostado ❤

Valeu pessoal!

{% github https://github.com/justkey007/tsc-alias %}