为了账号安全,请及时绑定邮箱和手机立即绑定

为什么不能在同一项目中同时使用 require('foo') 和 ECMAScript 导出?

为什么不能在同一项目中同时使用 require('foo') 和 ECMAScript 导出?

jeck猫 2022-12-22 12:53:24
刚刚跟上 JavaScript 的步伐,我遇到了一个我无法解释的问题。我只是想了解不同的导入选项。我有:main.jsutils.jspackage.json工具.js// this is simply an exemple from the node.js docsconst readline = require("readline");const rl = readline.createInterface({    input: process.stdin,    output: process.stdout});rl.question("What is your name ? ", function(name) {    rl.question("Where do you live ? ", function(country) {        console.log(`${name}, is a citizen of ${country}`);        rl.close();    });});export {rl}包.json{  "name": "sandbox",  "version": "1.0.0",  "description": "",  "main": "main.js",   "type": "module",  "scripts": {    "test": "echo \"Error: no test specified\" && exit 1"  },  "keywords": [],  "author": "",  "license": "ISC",  "devDependencies": {    "babel-preset-env": "^1.7.0",    "babel-register": "^6.26.0"  }}主程序import {rl} from './utils.js'// do stuff with rl, but the import fails使用上面的代码,require(...) is not defined 如果我尝试直接运行 utils.js。我需要删除导出语句和“type”:“module”。如果我将 utils.js 重命名为 utils.mjs,那么我会得到“require is not defined”。所以基本上我不能同时拥有 require(...) 和使用 exports。如果我运行 main.js,它会说 utils.js 不提供名为 rl 的导出(但它提供!)。为什么 "type":"module" & require(...) 语法不能共存?如果我使用的包已经使用了 require() 语法,那么这是否意味着我的项目的其余部分不能使用 ECMAScript 导出?
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

为什么 "type":"module" & require(...) 语法不能共存?

他们可以。在 ESM 模块(JavaScript import/export语法)中,您可以从 CJS 模块(较旧的 CommonJS 模块系统)导入。createRequire如果您需要其他方式不可用的功能(如导入 JSON),您也可以使用。

如果我使用的包已经使用了 require() 语法,那么这是否意味着我的项目的其余部分不能使用 ecmascript 导出?

不,这仍然是可能的,尽管如果您完全转换为 ESM(或者根本不使用 ESM——例如,如果您避免同时使用两者),生活会简单得多。typenearest中的设置package.json决定了正在导入的内容是默认使用 ESM 还是 CJS。您可以(例如)有一个包含旧内容的目录,其中包含最小package.json的内容,"type": "commonjs"而您的项目的主要package.json内容有"type": "module".

project_root/

+ package.json w/"type": "module"

+ foo.js - ESM module

+ bar.js - ESM module

+ legacy/

  + package.json w/"type": "commonjs"

  + baz.js - CJS module

或者,您可以在 main中有"type": "commonjs"(或根本没有)并在 ESM 模块上使用文件扩展名。(我不喜欢它,但 Node.js 支持它。)typepackage.json.mjs

Node.js ESM 文档中有更多内容。


查看完整回答
反对 回复 2022-12-22
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信