جاوااسکریپت - تغییرات ESM در پروژه NestJS من باعث ایجاد تعارض میشوند


من نویسنده پکیج nestjs-cashify هستم. تصمیم گرفتم پکیجم را بهروزرسانی کنم و همچنین پکیجهای پایهای را. بعد از بهروزرسانی یکی از پکیجهای اصلی که از آن استفاده میکنم، با مشکلاتی مواجه شدم. از آنجایی که تنظیمات ts پکیجم روی es6 تنظیم شده است و نه es2020. (به عبارت دیگر، نسخه جدید پکیجی که استفاده میکنم بهتازگی به es2020 تغییر یافته است)

زمانی که میخواهم از پکیج خود در یک پروژه معمولی NestJS (در پوشه مثال خودم) استفاده کنم، این خطاها را دریافت میکنم:

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

این منطقی است زیرا پروژه من روی «es6» تنظیم شده و وقتی سازه میکنم، از «require» برای ماژول ES استفاده میکند (ماژول هسته اکنون از نسخه جدید ESM است): این خطا است: require() از ماژول ES /index.js از /cashify.module.js پشتیبانی نمیشود.

سپس تصمیم گرفتم پروژهام را نیز روی «es2020» تنظیم کنم. حالا، این خطا برطرف شده است (چون در نتیجهی ساخت من دیگر از require استفاده نمیکند، بلکه از دستور import استفاده میکند).

در پوشه نمونه من (پروژه معمولی NestJS) که دارم بسته خود را آزمایش میکنم، این تنظیمات قرار داده شده است: "target": "es2017",

حالا من خطای زیر را میبینم:

SyntaxError: Unexpected token 'export'

توجه مهم:

با اینکه تغییر پیکربندی پروژه نمونه من ایده خوبی نیست (چون تمام توسعهدهندگان NestJS مجبور خواهند بود این کار را انجام دهند)، من با این حال سعی کردم این مشکل را حل کنم. من آن را نیز به es2020 تغییر دادم.

این بار، خطاهای زیر را دریافت میکنم:

(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

من همچنین سعی کردم «type»: «module» را در فایل package.json تنظیم کنم (همانطور که در پیام خطا ذکر شده بود) و سپس این خطا را دیدم:

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

نظری داری؟

پاسخ شماره ۱

شما نیاز دارید ماژول را با async import بارگذاری کنید.

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