如何在 Node.js 脚本中同时使用 `require` 和 `import`? [已关闭]

问题描述 投票:0回答:1

我有下面的 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 进行任何更改吗?

javascript node.js requirejs esmodules import-require
1个回答
1
投票

要在同一个文件中同时使用

require
import
,您需要根据您使用的是 CommonJS 还是 ES 模块来处理它们:

选项 1:CommonJS(
.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"

选项2:ES模块(
.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"

使用哪个?

  • 如果您更喜欢 CommonJS (
    .cjs
    ),请使用
    require
  • 如果您更喜欢 ES 模块 (
    .mjs
    ),请使用
    import

这样,您就可以在同一个文件中混合

require
import

© www.soinside.com 2019 - 2024. All rights reserved.