猿问

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

刚刚跟上 JavaScript 的步伐,我遇到了一个我无法解释的问题。我只是想了解不同的导入选项。


我有:


main.js

utils.js

package.json

工具.js


// this is simply an exemple from the node.js docs

const 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 导出?


jeck猫
浏览 83回答 1
1回答

12345678_0001

为什么 "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.mjsNode.js ESM 文档中有更多内容。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答