javascript - modificările ESM creează conflicte în proiectul meu NestJS


Sunt autorul pachetului nestjs-cashify. Am decis să actualizez pachetul meu, precum și pachetele de bază. Întâmpin unele probleme după ce am actualizat unul dintre pachetele de bază pe care le folosesc. Deoarece configurația ts a pachetului meu este setată la es6, nu es2020. (Cu alte cuvinte, noua versiune a pachetului pe care îl folosesc a fost schimbată recent la es2020)

Când vreau să folosesc pachetul meu într-un proiect NestJS obișnuit (în folderul meu de exemplu), primesc aceste erori:

/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'
}

Acest lucru are sens deoarece proiectul meu este setat pe „es6” și atunci când construiesc, folosește „require” pentru modulul ES (modulul de bază este acum ESM din cauza noii versiuni): Aceasta este eroarea: require() al modulului ES /index.js din /cashify.module.js nu este acceptat.

Apoi am decis să setez proiectul meu la „es2020” de asemenea. Acum, această eroare a dispărut (deoarece în rezultatul construirii nu mai folosește require, ci folosește instrucțiunea import).

În dosarul meu de exemplu (proiect NestJS obișnuit), în care testez pachetul meu, această configurație este setată: "target": "es2017",

Acum văd următoarea eroare:

SyntaxError: Unexpected token 'export'

NOTĂ IMPORTANTĂ:

Chiar dacă nu este o idee bună să schimb configurația proiectului meu de exemplu (deoarece toți dezvoltatorii NestJS vor trebui să facă acest lucru), am încercat să rezolv asta oricum. De asemenea, am schimbat-o la es2020.

De data aceasta, primesc următoarele erori:

(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

Am încercat, de asemenea, să setez „type”: „module” în fișierul package.json (așa cum se menționează în mesajul de eroare) și atunci văd această eroare:

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

Vreo idee?

Răspuns #1

Trebuie să încarci modulul cu async import.

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