我有下面的 package.json 并使用一个包,并尝试在同一个文件中使用 require 和 import 语句;到目前为止,这样做是可行的,但没有成功
// package.json (v1)
{
"main": "src/index.js",
"scripts": {
"start": "node src/index.js"
},
"dependencies": {
"@xkeshav/day": "latest"
}
}
并调用如下
// src/index.js
const { oneDay } = require("@xkeshav/day");
console.log({ oneDay });
console.log("Hello from template repository");
以上效果很好
现在从
require
更改为 import
声明
import { oneDay } from "@xkeshav/day";
console.log({ oneDay });
运行文件时,它会抛出错误
(node:14233) 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)
/home/recursive/dev/template/src/index.js:1
import { oneDay } from "@xkeshav/day";
^^^^^^
SyntaxError: Cannot use import statement outside a module
亮点
在
package.json中添加type:"module"
所以添加如下
// package.json ( v2 )
{
"type": "module",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js"
},
"dependencies": {
"@xkeshav/day": "latest"
}
}
现在可以了。
现已删除
import
声明并添加 require
声明
const { oneDay } = require("@xkeshav/day");
console.log({ oneDay });
并运行该文件;它抛出错误
at /src/index.js:1
const { oneDay } = require("@xkeshav/day");
^
ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and '/home/recursive/dev/template/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
亮点是
package.json 包含“type”:“module”,要将其视为 CommonJS 脚本,请将其重命名为使用“.cjs”文件扩展名。
因此将
index.js
重命名为 index.cjs
并在 package.json 中进行更改
// package.json ( v3 )
{
"type": "module",
"main": "src/index.cjs",
"scripts": {
"start": "node src/index.cjs"
},
"dependencies": {
"@xkeshav/day": "latest"
}
}
这有效。
现在添加
import
语句以及 require
如下
const { oneDay } = require("@xkeshav/day");
import { oneDay as dayOne } from "@xkeshav/day";
console.log({ oneDay, dayOne });
console.log("Hello from template repository");
运行文件时;它抛出错误
(node:14757) 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)
at src/index.cjs:3
import { oneDay as dayOne } from "@xkeshav/day";
^^^^^^
SyntaxError: Cannot use import statement outside a module
亮点
在 package.json 中设置 "type": "module" 或使用 .mjs 扩展名
因此将
index.cjs
重命名为 index.mjs
并在 package.json 中运行
// # package.json ( v4 )
{
"type": "module",
"main": "src/index.mjs",
"scripts": {
"start": "node src/index.cjs"
},
"dependencies": {
"@xkeshav/day": "latest"
}
}
现在又出现另一个错误
> @xkeshav/[email protected] start
> node src/index.mjs
at src/index.mjs:1
const { oneDay } = require("@xkeshav/day");
^
ReferenceError: require is not defined in ES module scope, you can use import instead
那么我们如何在同一个文件中使用这两种语法呢?该文件扩展名为“.mjs”或“.cjs”或“.js”,以及需要对 package.json 进行任何更改吗?
要在同一个文件中同时使用
require
和 import
,您需要根据您使用的是 CommonJS 还是 ES 模块来处理它们:
.cjs
文件)require
。import
,使用动态导入语法:// src/index.cjs
const { oneDay } = require("@xkeshav/day");
(async () => {
const { oneDay: dayOne } = await import("@xkeshav/day");
console.log({ oneDay, dayOne });
})();
在
package.json
中,设置 "type": "commonjs"
。
.mjs
文件)import
。require
,请使用 createRequire
:// src/index.mjs
import { oneDay as dayOne } from "@xkeshav/day";
import { createRequire } from "module";
const require = createRequire(import.meta.url);
const { oneDay } = require("@xkeshav/day");
console.log({ oneDay, dayOne });
在
package.json
中,设置 "type": "module"
。
.cjs
),请使用 require
。.mjs
),请使用 import
。这样,您就可以在同一个文件中混合
require
和 import
。