沉冰浮水

沉冰浮水

做最终到的事,成为最终成为的人!
github
bilibili
mastodon
zhihu
douban

「Node.js」一個 export/import 問題

前言#

折騰,遇到問題,解決,水一篇,周而復始……

然而昨天久違的看了下百度統計,日 IP 已經掉到 20 了……

話說之前也遇到個類似的問題:

「大坑」關於 module 模式下如何正確引入 WebSocketServer_電腦網路_沉冰浮水

正文#

以下為去 v2ex 提問時的原始內容;

專案本身使用 rollup 構建,然後功能上是一個 rollup-plugin,一開始只導出了一個函數 monkey,後邊加了功能,結果就是拿到的東西不統一了。

雖然可以先判斷一下,然而還是想弄清為什麼會有這種差異……

export { main as default, monkeyPath, monkeyRequire };
// for test
import monkey, { monkeyPath, monkeyRequire } from "../../dist/index.mjs";

console.log("typeof monkey:", typeof monkey);
// typeof monkey: function
// for prod
import monkey, { monkeyPath, monkeyRequire } from "rollup-plugin-monkey";

console.log("typeof monkey:", typeof monkey);
// typeof monkey: object
console.log("typeof monkey.default:", typeof monkey.default);
// typeof monkey.default: function

專案源碼:
https://github.com/wdssmq/rollup-plugin-monkey

這裡可以看到 dist/ 內容:
https://www.npmjs.com/package/rollup-plugin-monkey?activeTab=explore

最終專案使用的配置文件:
https://github.com/wdssmq/rollup-plugin-monkey/blob/main/test/gm/rollup.config.mjs

v 友指出實際引用應該是 cjs,exports["default"] = main,會得到一個object類型的導出;

刪除 prod 內對應的 cjs 後變成找不到文件了,是有 mjs 的,然後 pkg 內有如下配置:

  "main": "dist/index.cjs",
  "module": "dist/index.mjs",
  "type": "module",

看來我理解有誤,以為使用 module 語法就會使用對應字段的路徑?

好像應該按下邊的寫,雖然並沒有測試過 require:

  "main": "dist/index.mjs",
  "exports": {
    "import": "./dist/index.mjs",
    "require": "./dist/index.cjs"
  },
  "type": "module",

補充#

只導出 default 時的代碼:

// msj
export { main as default };

// cjs
exports["default"] = main;

有額外導出時的代碼:

// msj
export { main as default, monkeyPath, monkeyRequire };

// cjs
exports["default"] = main;
exports.monkeyPath = monkeyPath;
exports.monkeyRequire = monkeyRequire;

參考#

Node.js 如何處理 ES6 模塊 - 阮一峰的網絡日誌

https://www.ruanyifeng.com/blog/2020/08/how-nodejs-use-es6-module.html

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。