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