javascript require()在模块类型nodejs脚本中不工作

eqoofvh9  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(115)

在我的package.json文件中,我指定了我的nodejs应用的类型是module,因为如果我不这样做,似乎我不能使用import语句。这就是它现在的样子:

{
  "name": "...",
  "version": "1.0.0",
  "description": "....",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "...."
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "lodash": "^4.17.15"
  },
  "type": "module"
}

但是如果我将"type": "module"添加到我的package.json文件中,我就不能再使用require语句了,因为我会得到一个ReferenceError: require is not defined错误。
如果我从package.json中删除"type": "module"行,并将所有导入重写为requires,则一切正常。
我似乎找不到任何迹象表明,importrequire不能混合或一起使用在同一个脚本,我错过了什么,或者我有一些其他的错误?我如何解决在同一个脚本中使用这两种语句?

  • 为什么 * 我会需要这个,是因为我想require一些配置文件的基础上动态路径,只有当文件存在,我认为我不能做import .
    **免责声明:**我是nodejs服务器端编程的新手,所以我可能非常错误地处理了这种情况,如果是这样的话,请根据我上面提到的 * 为什么 * 给我一些建议。
    **注意:**我正在从服务器终端运行此节点脚本,而不是从浏览器。
qzlgjiam

qzlgjiam1#

但是如果我将"type": "module"添加到package.json文件中,我就不能再使用require语句了,因为我得到了一个ReferenceError: require is not defined error
好吧。二选一。要么使用ESM(JavaScript modules,type =“module”)**,要么使用CJS(CommonJS类Node.js原生模块,require)。
但是它们之间有一些互操作性。例如,在ESM模块中,可以使用import CJS模块,也可以使用createRequire创建require函数来加载CJS模块。
为什么我会需要这个,是因为我想require一些配置文件的基础上动态路径,只有当文件存在,我认为我不能做import
您仍然可以在使用type="module"时执行此操作。你有几个选择:
1.如果这些“config”文件是JavaScript,则可以使用createRequire

import { createRequire } from "module";
const require = createRequire(import.meta.url);
const yourData = require("./config.js");

1.如果这些配置文件是JSON,您可以使用当前实验性的支持来导入JSON模块。既然你说你想允许不存在的文件,你应该使用动态的import()而不是静态的import声明:

let config = /*...defaults...*/;
try {
    config = await import("./config.json", { assert: { type: "json" } });
} catch (error) {
    // ...the file didn't exist or wasn't valid JSON...
}

1.或者,如果(再次)它们是JSON,您可以使用传统的方法:使用readFileJSON.parse。:—)

eit6fx6z

eit6fx6z2#

通常你需要Babel来转译使用ES模块的Node.js代码。
如果你不想使用Babel:ES模块是最新Node.js的实验性功能。
你需要三件事:
1.最新Node.js
1.增加“类型”:“module”到package.json
1.运行node.js node --experimental-modules app.js时添加实验标志

相关问题