DEV Community

Charles Lima
Charles Lima

Posted on

Typescript 🆚 NodeJS Runtime: Problemas e soluções na importação de módulos

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

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

...nem no tsconfig.js

Imagem: Configuração do arquivo tsconfig.json

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

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:

node -r ts-node/register/transpile-only -r tsconfig-paths/register ./dist/main.js
Enter fullscreen mode Exit fullscreen mode

E não é que deu certo?

Imagem: Sucesso no teste do nodejs com os modulos carregados

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

Node com caminhos relativos

Imagem: Consumo de memória do nodejs com módulos adicionais

Node com módulos adicionais

Depois de pesquisar muitas alternativas, descobri o pacote 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

Espero que tenham gostado ❤

Valeu pessoal!

GitHub logo justkey007 / tsc-alias

Replace alias paths with relative paths after typescript compilation

tsc-alias

Replace alias paths with relative paths after typescript compilation. You can add aliases that reference other projects outside your tsconfig.json project by providing a relative path to the baseUrl.

npm version License Donate

Comparison to tsconfig-paths

+ Compile time (no runtime dependencies)

Getting Started

First, install tsc-alias as devDependency using npm.

npm install -g tsc-alias
Enter fullscreen mode Exit fullscreen mode
npm install --save-dev tsc-alias

Add it to your build scripts in package.json

"scripts": {
  "build": "tsc --project tsconfig.json && tsc-alias -p tsconfig.json",
}

================ OR ===================

"scripts": {
  "build": "tsc && tsc-alias",
  "build:watch": "tsc && (concurrently \"tsc -w\" \"tsc-alias -w\")"
}
Enter fullscreen mode Exit fullscreen mode

Issues

If you have an issue, please create one. But, before:

  • try to check the FAQ.
  • try to check if there exits alike issues.
  • try to run with --debug and check if config is correctly loaded and all sourcefiles…

Top comments (0)