在我的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,则一切正常。
我似乎找不到任何迹象表明,import
和require
不能混合或一起使用在同一个脚本,我错过了什么,或者我有一些其他的错误?我如何解决在同一个脚本中使用这两种语句?
- 为什么 * 我会需要这个,是因为我想
require
一些配置文件的基础上动态路径,只有当文件存在,我认为我不能做import
.
**免责声明:**我是nodejs服务器端编程的新手,所以我可能非常错误地处理了这种情况,如果是这样的话,请根据我上面提到的 * 为什么 * 给我一些建议。
**注意:**我正在从服务器终端运行此节点脚本,而不是从浏览器。
2条答案
按热度按时间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
:1.如果这些配置文件是JSON,您可以使用当前实验性的支持来导入JSON模块。既然你说你想允许不存在的文件,你应该使用动态的
import()
而不是静态的import
声明:1.或者,如果(再次)它们是JSON,您可以使用传统的方法:使用
readFile
和JSON.parse
。:—)eit6fx6z2#
通常你需要Babel来转译使用ES模块的Node.js代码。
如果你不想使用Babel:ES模块是最新Node.js的实验性功能。
你需要三件事:
1.最新Node.js
1.增加“类型”:“module”到package.json
1.运行node.js
node --experimental-modules app.js
时添加实验标志