Pesquisa de site

javascript - As mudanças no ESM estão causando conflito no meu projeto NestJS


Sou o autor do nestjs-cashify. Decidi atualizar meu pacote, assim como os pacotes subjacentes. Estou encontrando alguns problemas após atualizar um dos pacotes principais que estou usando. Como a configuração do meu pacote em ts está definida para es6 e não es2020. (Em outras palavras, a nova versão do pacote que estou usando foi alterada para es2020 recentemente)

Quando quero usar meu pacote em um projeto NestJS comum (na minha pasta de exemplo), recebo estes erros:

/home/vahidnajafi/repos/nestjs-cashify/dist/cashify.module.js:21
const cashify_1 = require("cashify");
                  ^

Error [ERR_REQUIRE_ESM]: require() of ES Module /home/vahidnajafi/repos/nestjs-cashify/node_modules/cashify/dist/index.js from /home/vahidnajafi/repos/nestjs-cashify/dist/cashify.module.js not supported.
Instead change the require of index.js in /home/vahidnajafi/repos/nestjs-cashify/dist/cashify.module.js to a dynamic import() which is available in all CommonJS modules.
    at Object.<anonymous> (/home/vahidnajafi/repos/nestjs-cashify/dist/cashify.module.js:21:19)
    at Object.<anonymous> (/home/vahidnajafi/repos/nestjs-cashify/dist/index.js:18:14)
    at Object.<anonymous> (/home/vahidnajafi/repos/nestjs-cashify/example/dist/app.module.js:12:26)
    at Object.<anonymous> (/home/vahidnajafi/repos/nestjs-cashify/example/dist/main.js:4:22) {
  code: 'ERR_REQUIRE_ESM'
}

Isso faz sentido, já que meu projeto está configurado para "es6" e, ao compilar, ele usa "require" para módulo ES (o módulo principal agora é ESM a partir da nova versão): Este é o erro: require() de ES Module /index.js de /cashify.module.js não é suportado.

Então decidi configurar meu projeto para "es2020" também. Agora, esse erro desapareceu (já que no resultado da minha compilação ele não está mais usando require, está usando a instrução import).

Na minha pasta de exemplo (projeto NestJS regular), na qual estou testando meu pacote, esta configuração está definida: "target": "es2017",

Agora vejo o seguinte erro:

SyntaxError: Unexpected token 'export'

NOTA IMPORTANTE:

Mesmo que não seja uma boa ideia mudar a configuração do meu projeto de exemplo (já que todos os desenvolvedores NestJS terão que fazer isso), eu tentei consertar isso de qualquer maneira. Eu também mudei para es2020.

Desta vez, recebo os seguintes erros:

(node:89687) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
/home/vahidnajafi/repos/nestjs-cashify/example/dist/main.js:1
import { NestFactory } from '@nestjs/core';
^^^^^^

SyntaxError: Cannot use import statement outside a module

Também tentei definir "type": "module" no arquivo package.json (conforme mencionado na mensagem de erro) e então vejo este erro:

internal/process/esm_loader.js:74
    internalBinding('errors').triggerUncaughtException(
                              ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/vahidnajafi/repos/nestjs-cashify/example/dist/app.module' imported from /home/vahidnajafi/repos/nestjs-cashify/example/dist/main.js

Alguma ideia?

Resposta #1

Você precisa carregar o módulo com async import.

https://nodejs.org/api/esm.html#esm_interoperability_with_commonjs