亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么不能在同一項目中同時使用 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 關注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號