typescript 打字脚本/节点错误[未找到模块错误]:找不到模块

laawzig2  于 2023-03-04  发布在  TypeScript
关注(0)|答案(2)|浏览(163)

将项目表单 * CJS * 转换为 * ESM *

我正在尝试将我当前的TypeScript-Node项目从ESM转换为CJS,但是,我一直收到下面的错误

Error [ERR_MODULE_NOT_FOUND]: Cannot find module` 'redacted/dist/config/datadog' 
imported from /redacted/dist/app.js
这是**app.ts中导入的外观:**
import './config/datadog';
这是**app.js**的外观
import './config/datadog';
这是我的datadog.ts文档

datadog.ts

import tracer from 'dd-trace';
tracer.init({
    logInjection: true,
    profiling: true,
    appsec: true
});

export default tracer;

下面是我通过~/$ node dist/app.js执行应用程序时收到的错误的完整打印输出。

> node dist/app.js

node:internal/errors:465
    ErrorCaptureStackTrace(err);
    ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'redacted/dist/config/datadog' imported from /redacted/dist/app.js
    at new NodeError (node:internal/errors:372:5)
    at finalizeResolution (node:internal/modules/esm/resolve:405:11)
    at moduleResolve (node:internal/modules/esm/resolve:966:10)
    at defaultResolve (node:internal/modules/esm/resolve:1176:11)
    at ESMLoader.resolve (node:internal/modules/esm/loader:605:30)
    at ESMLoader.getModuleJob (node:internal/modules/esm/loader:318:18)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:80:40)
    at link (node:internal/modules/esm/module_job:78:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}

Node.js v18.0.0

Process finished with exit code 1

使用ts-node运行时工作正常

node --experimental-specifier-resolution=node --loader ts-node/esm app.ts --project tsconfig.json
我已将tsconfig.json文件配置为:
{
      "compilerOptions": {
        "target": "ES2020",
        "module": "ES2020",
        "lib": ["ES2020"],
        "moduleResolution": "node",
        "esModuleInterop": true,
        "rootDir": "./src",
        "outDir": "./dist",
        "forceConsistentCasingInFileNames": true,
        "strict": true,
      }
    }
    • 编辑**

我已经在GitHub上发布了code

t5fffqht

t5fffqht1#

您需要使用TypeScript v4.7,这是当前的TS-Next版本

升级到typescript@next(可通过执行~/$ npm install -D typescript@next命令完成)后,您需要对tsconfig.json文件进行以下更改。

{
    "compilerOptions": {
    "lib": [
      "ESNext" /* ESNext includes new Level-4 features that were
               recently added to the ECMA-262 JS spec */
     ],

    "module": "NodeNext",/* (1 of 2) TS v4.7 settings you need 
                            to change */

    "moduleResolution": "NodeNext", /* This is the one that will 
                                    specifically solve the error you're 
                                    getting. Without the internal changes
                                    made by this, your project will not
                                    resolve modules correctly. */

    "esModuleInterop": true, /* This is properly configured. FYI you cannot 
                                change this, it must be set to true. */
                                

    /* 
      THE REST OF THE SETTINGS DO NOT AFFECT THE MODULE TYPE OR HOW TSC 
      RESOLVES OTHER MODULES */

    "target": "ES2021",
    "rootDir": "./src",
    "outDir": "./dist",
    "forceConsistentCasingInFileNames": true,
    "strict": true,
  }
}

总结

您必须按如下所示设置tsconfig.jsonmodulemoduleResolution
1.模块分辨率:"下一个节点"

  1. module: "NodeNext"
您将需要TypeScript v4.7

就我个人而言,我保留了一个全局属性,所以下面我展示了全局安装的命令,但你真正需要的是将它作为当前项目的依赖项添加到你的node_modules目录中。
1.#####~$ sudo npm i -g typescript@next // Global Install
1.#####一米九一x
我不能帮助任何IDE的存在,但如果你使用VSCode,使用以下配置,使您的项目使用版本v4.7。
然后,您需要设置以下配置

"typescript.tsdk": "./node_modules/typescript/lib",

一米十一秒

您还需要在中为Node ..启用ESM。为此,您需要将以下内容添加到package.json

/** @file "package.json" */

{
    "type": "module"
}
  • *...或者您可以对所有文件使用dot MTS(.mts)**文件扩展名。两者都有优点,但讨论优点超出了本答案的范围。

应该是这样。听起来很难,但实际上只要你以前做过,就很容易了。

另一个有用的资源:

链接上的答案更详细地介绍了这一主题。我建议您查看一下。

xoshrz7s

xoshrz7s2#

我只是想感谢JayDev的回答。它解决了我的问题。(我不能反对他的帖子,因为他不允许我有愚蠢的理由)。

相关问题