NodeJS 要加载ES模块,请设置“类型”:package.json中的“模块”或使用.mjs扩展名

afdcj2ne  于 2023-01-16  发布在  Node.js
关注(0)|答案(7)|浏览(336)

我试图在桌面上运行这个repository的vscode扩展。
我在本地克隆了它并运行npm install
在vscode编辑器上按f5键,出现错误

Process exited with code 1
(node:1404) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
internal/process/warning:44
Canceled

为了解决这个警告,我发现了另一个堆栈溢出问题-(node:9374) Warning: To load an ES module, set "type": "module"
因此,我将"type":"module"设置为package.json,并再次按f5。
并显示另一个错误。

Process exited with code 1
Uncaught TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /mnt/c/vscode-php-debug/src/phpDebug.ts

并在stackoverflow上找到另一个问题-Can't run my Node.js Typescript project TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /app/src/App.ts
所以我去掉了“type”:“module”,现在我在循环中,混淆。
有没有人试过调试这个或遇到这样的?

zhte4eai

zhte4eai1#

要解决此问题,请更改扩展名文件名。
例如,如果您的模块javascript文件名为script.js -请将名称更改为script. mjs。
对将使用导入的文件和将导出的文件执行此操作。
此外,在index.html页面中,确保使用.mjs扩展名引用文件,例如:

<script type="module" src="script.mjs"></script>
cpjpxq1n

cpjpxq1n2#

使用以下命令对节点v14.16.1有效:

node --loader ts-node/esm --experimental-specifier-resolution=node index.ts

有一个警告告诉我--experimental-loader是一个实验特性,但我不在乎,因为我只用它来调试 typescript 代码。

r3i60tvu

r3i60tvu3#

在你的package.json里面设置"type": "module"应该可以了,再检查一下输入的时候有没有错,输入的时候解决了我的问题。

ej83mcc0

ej83mcc04#

在从js(带有commonJs模块)迁移到支持Eslint和Prettier的Typescript的过程中,面临着这个问题和许多相关问题。主要问题是Node.js需要在. js文件中导入commonJs,并且允许在. mjs中使用es6模块。Typescript默认生成. js文件,因此有两种方法可以处理它:

    • 方法1(如果您希望将ts文件编译为支持es6modules的js)**:

1.迁移到es6模块,调用所有.js文件-.mjs,将__dirname用途更改为const __dirname = dirname(fileURLToPath(import.meta.url));
1.然后在package.json中设置"type": "module"
1.然后我为tsconfig.json添加了这样的配置:

{
  "compilerOptions":
    {
      "target": "es2018",
      "module": "es2020",
      "outDir": "dist",
      "sourceMap": true,
      "allowJs": true,
      "esModuleInterop": true,
      "moduleResolution": "node",
      "strict": true, 
    },
  "include": ["./src"],
  "exclude": ["node_modules"],
}
  1. json的配置如下所示:
{
    "root": true,
    "env": {
      "es2020": true,
      "jasmine": true,
      "jest": true,
      "node": true
    },
    "settings": {
      "noInlineConfig": true,
      "node": {
        "tryExtensions": [".js", ".ts", ".d.ts"],
        "moduleDirectory": ["node_modules", "src/"]
      },
      "import/resolver": {
        "node": {
          "extensions": [".js", ".ts", ".d.ts"],
          "moduleDirectory": ["node_modules", "src/"],
          "typescript": {}
        },
        "typescript": {
          "alwaysTryTypes": true,
          "project": "."
        }
      }
    },
    "parser": "@typescript-eslint/parser",
    "extends": [
      "eslint:recommended",
      "plugin:@typescript-eslint/recommended",
      "plugin:node/recommended",
      "airbnb-base",
      "prettier"
    ],
    "parserOptions": { "ecmaVersion": 2018, "sourceType": "module" },
    "plugins": [
        "@typescript-eslint"
    ],
    "rules": {
      "import/extensions": "off",
      "linebreak-style": "off",
      "node/no-unsupported-features/es-syntax": "off",
      "no-underscore-dangle": "off",
      "import/prefer-default-export": "off",
    }
}

1.在一个终端中,我运行:npx tsc -w
1.在另一篇文章中:npm run start启动脚本:"start": "nodemon --es-module-specifier-resolution=node dist/server.js"

    • 方法2(如果你不关心编译的js代码,它可以是commonJS)**:

1.迁移到es6模块,调用所有.js文件-.ts,添加类型,保留__dirname用法不变(将由@types/node处理)并安装@types/node,ts-node,nodemon。
1.在包中. json "type": "commonjs", "main": "src/{your_root_file}.ts",
1.然后我为tsconfig.json添加了这样的配置:

{
  "compilerOptions":
    {
      "target": "es6",
      "module": "commonjs",
      "outDir": "dist",
      "esModuleInterop": true,
      "lib": ["es6"],
      "moduleResolution": "node",
      "strict": true, 
      "noEmitOnError": true,
      "noImplicitAny": true,
      "experimentalDecorators": true, // for typeorm
      "emitDecoratorMetadata": true // for typeorm
    },
  "include": ["./src"],
  "exclude": ["node_modules"],
}
  1. json的配置如下所示:
{
    "root": true,
    "env": {
      "es2020": true,
      "jasmine": true,
      "jest": true,
      "node": true
    },
    "settings": {
      "noInlineConfig": true,
      "node": {
        "tryExtensions": [".js", ".ts",".mjs", ".d.ts"],
        "moduleDirectory": ["node_modules", "src/"]
      },
      "import/resolver": {
        "node": {
          "extensions": [".js", ".ts", ".d.ts", ".mjs"],
          "moduleDirectory": ["node_modules", "src/"],
          "typescript": {}
        },
        "typescript": {
          "alwaysTryTypes": true,
          "project": "."
        }
      }
    },
    "parser": "@typescript-eslint/parser",
    "extends": [
      "eslint:recommended",
      "plugin:@typescript-eslint/recommended",
      "plugin:node/recommended",
      "airbnb-base",
      "plugin:import/errors",
      "plugin:import/warnings",
      "plugin:import/typescript",
      "prettier"
    ],
    "parserOptions": { "ecmaVersion": 2018, "sourceType": "module", "project": "./tsconfig.json" },
    "plugins": [
        "@typescript-eslint",
        "eslint-plugin-tsdoc",
        "import"
    ],
    "rules": {
      "tsdoc/syntax": "warn",
      "import/extensions": "off",
      "linebreak-style": "off",
      "node/no-unsupported-features/es-syntax": "off",
      "no-underscore-dangle": "off",
      "import/prefer-default-export": "off",
      "@typescript-eslint/no-explicit-any": "error",
      "quotes": [
        "error",
        "single"
      ],
      "semi": [
        "error",
        "always"
      ]
    }
}

1.终端内:npm run start启动脚本:Nodemon会自动检测到它运行在. ts文件上,并将使用ts节点来运行您的应用程序。

vecaoik1

vecaoik15#

{

"version": "0.2.0",
"configurations": [
    {
        "type": "pwa-node",
        "request": "launch",
        "name": "Launch Program",
        "skipFiles": [
            "<node_internals>/**"
        ],
        "cwd": "${workspaceFolder}",
        "program": "${workspaceFolder}/index.js",
        "runtimeArgs": ["-r","esm"],
    }
]

}

eaf3rand

eaf3rand6#

package.json文件中添加"type": "module"

agxfikkp

agxfikkp7#


“模块”:“公用js”
tsconfig.json中。这将解决此问题
更多详细信息,请参阅:https://nodejs.org/api/modules.html#modules-commonjs-modules

相关问题