前端架構: 腳手架通用框架封裝之CommonJS和ESM混合開發兼容解決(教程五)

CommonJS 和 ESModule 混合開發

  • 接上文,仍舊在 abc-cli 項目中
  • 參考:https://blog.csdn.net/Tyro_java/article/details/136433159
  • 現在要在腳手架項目中安裝 chalk 依賴,因為在 abc-cli 項目幾乎都是 CommonJS的實現
  • 而 chalk 這個依賴源碼是基于 ESModule 的,所以現在要解決的是兩者的兼容
  • 先安裝 chalk 到 cli 包中,在 abc-cli 目錄下,$ npm i chalk -w packages/cli
  • 但是,在使用 chalk 的時候,就會報錯,不能使用 require,現在有幾種解決方案
    • 第一種,降級 chalk 到低版本, 大概在4.0左右,但是這就無法使用 chalk 的新特性了
    • 第二種,修改自己的代碼,將之前的 require 全部修改成 import, 并且package.json中添加 "type":"module"
      • 這種會造成更大的問題:一是,之前的語法全部要修改,包括 module.exports
      • 二是,如果要使用一些只有 CommonJS 的依賴就會有問題
    • 第三種,在CommonJS中允許使用 import 來加載依賴,但是 import 返回了一個 Promise
      • 這種,只能異步拿到真實的依賴,就不好處理了
  • 現在遇到了一個問題,就是如何兼容 CommonJS 和 ESModule, 怎樣才能最佳實踐
  • npm 模塊有的使用CommonJS, 有的使用 ESM, 兩者混合開發成為 Nodejs 項目必須考慮的問題

1 )CommonJS

  • CommonJS 單獨使用有兩種方式
    • 1 )在 package.json 中指定 "type": "common" 這個不指定也是默認的
    • 所有js文件的的導入都用 require 語法來引用模塊
    • 所有js文件的導出都用 module.exports 語法來導出
    • 2 )不管 package.json 中指定的是 "type": "common" 亦或是 "type": "module"
    • 只要js文件的后綴是 .cjs 都可以使用 requiremodule.exports 語法
    • 這樣,默認走的就是 CommonJS 規范
  • 注意,module.exportsexports.xx 不能混用,兩者混用,后者不生效
  • CommonJS規范默認通過自執行函數實現,比如require源碼,它可以做一些變量注入
  • 比如 __dirname, __filename 都是通過注入的方式來顯示的
  • 可以把它們直接打印出來

2 )ESModule

  • ESModule 也有兩種使用方式
    • 1 )在package.json中定義 "type": "module",包內所有 .js 文件會被認為是 ESModule
    • 2 ).mjs 后綴的文件,強制被認定為 ESModule
  • 在ESModule中導出 export default {},導入 import
  • 在這里,__dirname, __filename 這種API,統統不支持,但是網上也有兼容方案,這里先不研究
    • 除了網上的一些解決方案,這里暫時提供一個第三方庫來解決 dirname-filename-esm

3 )CommonJS 和 ESModule 混用

  • 原則上,不應該混用,一般我們開發包的時候,需要指定一種
  • 單個模塊,必須指定CommonJS 或 ESM, 如果混用,必須用webpack或babel來解決
  • 另外,package.json 的 type 可以不寫,如果寫就必須指定一種,默認是 commonjs
  • 越來越多的模塊采用了 ESModule, 也就是指定 type 為 module

3.1 在 CommonJS 中引用 ESM

  • 如果一個模塊是ESM, 比如,它叫 “esm” 來舉例
    import('esm').then(esm => esm.default())
    
  • 這種做法非常別扭
  • CommonJS 本身是一個同步的規范,require 它的實現是一個同步加載模塊的方案
    • 它在模塊外圍包一層自執行函數,是同步方案實現的
    • 參考:https://blog.csdn.net/Tyro_java/article/details/53574887
  • ESM 本身用的是 import 用的是異步方式來加載,和CommonJS是完全不同的兩種實踐方案
  • 如果是 在 CommonJS 中引用 ESM,那么代碼就會非常的奇怪
  • 要想實現同步操作,就必須加一個自執行函數,并將這個函數指定為 async 方式
    (async function() {const esm = await import('esm');esm.default();
    })()
    
    • 這樣,很麻煩,也很奇怪
    • 但是能解決問題

3.2 在 ESM 中引用 CommonJS

  • 在 ESM 包中,不管依賴是 ESM還是CommonJS方案開發的,都可以直接 import
  • 假設 “cjs” 是一個 CommonJS 模塊的方案
    imort cjs form 'cjs';
    
  • 所以,推薦把源碼全部移植到ESM模塊中

常見的報錯問題和解決

  • 1 )未指定 package.json 中的 type, 但是使用了 importexport 語法

    • 這是缺失了 package.json 中 type 默認是 commonjs 的知識點造成的
  • 2 )require 語法無法加載ESM模塊

    • 必須使用 import 來加載ESM模塊
  • 3 )ESM 去加載其他ESM模塊時會有找不到模塊的報錯

    • 沒有構建工具時,import的時候需要添加后綴,不能省略
    • 注意,還有導出用 export default 時,引入時別忘記了這個 default

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718467.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718467.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718467.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

徹底剖析激光-視覺-IMU-GPS融合SLAM算法:理論推導、代碼講解和實戰

自主導航是機器人與自動駕駛的核心功能,而SLAM技術是實現自主導航的前提與關鍵。現有的機器人與自動駕駛車輛往往會安裝激光雷達,相機,IMU,GPS等多種模態的傳感器,而且已有許多優秀的激光SLAM與視覺SLAM算法。但是每種…

獲取wifi內容信息(僅供學習使用,勿作他用)

文章目錄 背景代碼實現槽點槽點 1槽點2總結背景 上一篇文章我們講解學習了密碼字典生成,下面我們來看一下如何獲取wifi信息 代碼實現 下面代碼,附帶注釋,可以很清晰的看明白每一行代碼具體是什么含義,通俗易通的變量定義,已經函數調用。如有任何不明白的地方可以隨時聯…

曲線生成 | 圖解Dubins曲線生成原理(附ROS C++/Python/Matlab仿真)

目錄 0 專欄介紹1 什么是Dubins曲線?2 Dubins曲線原理2.1 坐標變換2.2 單步運動公式2.3 曲線模式 3 Dubins曲線生成算法4 仿真實現4.1 ROS C實現4.2 Python實現4.3 Matlab實現 0 專欄介紹 🔥附C/Python/Matlab全套代碼🔥課程設計、畢業設計、…

c語言:轉移表的實現

Hello,寶子們&#xff01;今天我們來模擬實現一下我們生活中的應用最頻繁的工具&#xff1a;計算器&#xff0c;實現計算器有三種方式。 廢話不多說&#xff0c;直接上代碼&#xff0c;計算器的一般實現&#xff1a; #include <stdio.h> int add(int a, int b)//加法函數…

Foxmail快捷鍵設置問題

當快捷鍵設置錯誤時不會生效&#xff0c;原來的快捷鍵仍有效&#xff0c;即使禁用快捷鍵功能&#xff0c;原先快捷鍵仍有效。正確的快捷鍵&#xff1a; 1. 不能是空&#xff08;NULL&#xff09; 2. 應該設置按鍵值只有一個的鍵盤按鈕。

力扣字符串篇

以下解題思路來自代碼隨想錄以及官方題解。 文章目錄 344.反轉字符串541.反轉字符串||151.反轉字符串中的單詞28.找出字符串中第一個匹配項的下標459.重復的字符串 344.反轉字符串 編寫一個函數&#xff0c;其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給…

怎樣查詢到pycharm終端中執行過的命令?

pycharm終端中記錄了曾經運行過的命令&#xff0c;怎樣才能查詢到全部曾經運行過的命令呢&#xff1f; 怎樣查詢到pycharm終端中執行過的命令&#xff1f;

【動態規劃專欄】

動態規劃基礎知識 概念 動態規劃&#xff08;Dynamic Programming&#xff0c;DP&#xff09;&#xff1a;用來解決最優化問題的算法思想。 動態規劃是分治思想的延伸&#xff0c;通俗一點來說就是大事化小&#xff0c;小事化無的藝術。 一般來說&#xff0c;…

【CSS】初學輕松學會使用Flex布局

目錄 什么是Flex布局如何開始使用Flex布局Flex容器的屬性Flex項目的屬性舉個例子 什么是Flex布局 Flex布局是一種基于盒子模型的布局方式&#xff0c;它讓我們可以輕松地控制容器內的元素在主軸和交叉軸上的排列方式。通過設置不同的Flex屬性&#xff0c;我們可以實現各種不同…

探索Hadoop的三種運行模式:單機模式、偽分布式模式和完全分布式模式

目錄 前言一、 單機模式二、 偽分布式模式三、 完全分布式模式&#xff08;重點&#xff09;3.1 準備工作3.2 配置集群3.2.1 配置core-site.xml 文件3.2.2 配置hdfs-site.xml 文件3.2.3 配置yarn-site.xml 文件3.2.4 配置mapred-site.xml 文件 3.3 啟動集群3.3.1 配置workers3.…

【百度】商業AIGC組_AIGC Java研發工程師(J70353)

北京市技術4人2024-02-28 工作職責&#xff1a; 負責商業AIGC平臺方向的工程架構設計及研發&#xff0c;致力于為廣告業務提供內容生成、內容知識化、內容多模態等中臺化服務&#xff0c;并將內容能力打通廣告檢索系統&#xff0c;于廣告的觸發、創意、模型和機制等聯動&#…

RK3568 android11 調試陀螺儀模塊 MPU6500

一&#xff0c;MPU6500功能介紹 1.簡介 MPU6500是一款由TDK生產的運動/慣性傳感器&#xff0c;屬于慣性測量設備&#xff08;IMU&#xff09;的一種。MPU6500集成了3軸加速度計、3軸陀螺儀和一個板載數字運動處理器&#xff08;DMP&#xff09;&#xff0c;能夠提供6軸的運動…

Matlab|基于Logistic函數負荷需求響應

目錄 1 基于Logistic函數的負荷轉移率模型 2 程序示例 3 效果圖 4 下載鏈接 負荷需求響應模型種類較多&#xff0c;有電價型和激勵型等類型&#xff0c;本次和大家分享一個基于Logistic函數的負荷轉移率模型&#xff0c;該模型屬于電價型&#xff0c;由于該方法使用的較少&a…

mysql 性能調優參數配置文件

########################################################################### ## my.cnf for MySQL 8.0.x # ## 本配置參考 https://imysql.com/my-cnf-wizard.html # ## 注意&#xff1a; …

python爬蟲之app爬取-charles的使用

專欄系列:http://t.csdnimg.cn/WfCSx 前言 前面介紹的都是爬取 Web 網頁的內容。隨著移動互聯網的發展,越來越多的企業并沒有提供 Web 網頁端的服務,而是直接開發了 App,更多更全的信息都是通過 App 來展示的。那么針對 App 我們可以爬取嗎?當然可以。 App 的爬取相比 …

FM AM WM DAB是啥

技術描述頻率范圍優點缺點調頻調制&#xff08;FM&#xff09;在FM廣播中&#xff0c;音頻信號的頻率被調制以匹配載波信號的變化&#xff0c;而載波信號的振幅保持不變。FM廣播通常具有較高的音質&#xff0c;并且在一定范圍內提供清晰的音頻。88 MHz 至 108 MHz- 高音質 - 清…

[linux] matplotlib plt畫training dynamics指標曲線時,標記每個點的值

plt畫折線圖時&#xff0c;plt.annotate標記折線圖的點的數值。 def plot_ret(*ret_dicts):plt.figure(figsize(10, 5))for ret_dict in ret_dicts:print(ret_dict["iters"])plt.plot([iter*4/1000 for iter in ret_dict["iters"]], ret_dict["ret&q…

億道信息發布兩款升級款全加固筆記本電腦

2022年5月19日&#xff0c;加固手持終端。加固平板電腦、加固筆記本電腦專業設計商和制造商&#xff0c;以及加固型移動計算機軟硬件整體定制解決方案提供商億道信息&#xff0c;宣布對其兩款廣受歡迎的加固筆記本電腦產品EM-X14U和EM-X15U進行重大升級。新發布的兩款升級款全加…

下載element-ui 資源,圖標 element-icons.woff,element-icons.ttf 無法解碼文件字體

css下載地址&#xff1a;https://unpkg.com/element-ui2.15.14/lib/theme-chalk/index.css js下載地址&#xff1a;https://unpkg.com/element-ui2.15.14/lib/index.js 圖標及文字文件下載地址&#xff1a; element-icons.woff:&#xff1a; ? https://unpkg.com/element-…

《TCP/IP詳解 卷一》第10章 UDP 和 IP 分片

目錄 10.1 引言 10.2 UDP 頭部 10.3 UDP校驗和 10.4 例子 10.5 UDP 和 IPv6 10.6 UDP-Lite 10.7 IP分片 10.7.1 例子&#xff1a;IPV4 UDP分片 10.7.2 重組超時 10.8 采用UDP的路徑MTU發現 10.9 IP分片和ARP/ND之間的交互 10.10 最大UDP數據報長度 10.11 UDP服務器…