紅寶書第二十一講:詳解JavaScript的模塊化(CommonJS與ES Modules)


紅寶書第二十一講:詳解JavaScript的模塊化(CommonJS與ES Modules)

資料取自《JavaScript高級程序設計(第5版)》。
查看總目錄:紅寶書學習大綱


一、模塊化的意義:分而治之

模塊化解決代碼依賴混亂、命名沖突問題,核心思想:

  • 每個文件為一個獨立模塊
  • **導出(export)**需要暴露的功能
  • **導入(import)**其他模塊的功能

二、CommonJS:服務端的模塊化方案

CommonJS設計用于服務器環境(如Node.js),特性:

  • 同步加載 → 適合本地文件系統 1
  • 使用require()導入,module.exports導出 2
示例1:導出對象
// math.js
function add(a, b) { return a + b; }
module.exports = { add }; // 導出模塊功能 [^5]// main.js
const math = require('./math.js'); // 導入模塊 [^6]
console.log(math.add(3, 5)); // 輸出8
示例2:導出類或實例
// User.js
class User { /* ... */ }
module.exports = User; // 導出類 [^5]// app.js
const User = require('./User.js');
const user = new User();

關鍵特點:導出的是對象或值的拷貝,多次導入會緩存結果 3


三、ES Modules(ESM):原生的瀏覽器支持

ES Modules是JavaScript官方標準,特性:

  • 瀏覽器直接支持(需要<script type="module">43
  • 導出用export,導入用import
示例3:基本語法
// math.js
export const multiply = (a, b) => a * b;// main.js
import { multiply } from './math.js';
console.log(multiply(3, 5)); // 輸出15
示例4:導出默認值
// config.js
const API_KEY = '12345abc';
export default API_KEY; // 默認導出// app.js
import key from './config.js'; // 默認導入不使用大括號

關鍵特點:導出的是引用,動態綁定,值更新影響所有導入方 3


四、對比CommonJS與ES Modules

特征CommonJSES Modules
運行環境Node.js(服務器端)1瀏覽器原生支持+現代Node 4
加載方式同步(立即執行)1異步(按需加載)3
導出內容值的拷貝(靜態)2值的引用(動態)3
語法module.exports / requireexport / import

五、現代工具鏈:模塊打包與轉換

由于瀏覽器兼容問題,常用工具:

  1. Webpack/Babel → 將ESM/CommonJS轉為兼容代碼 5
  2. SystemJS → 動態加載多種格式模塊(包括ESM)5


目錄:總目錄
上篇文章:紅寶書第二十講:詳解JavaScript的Proxy與Reflect
下篇文章:紅寶書第二十二講:詳解JavaScript類型化數組與二進制數據處理

腳注


  1. 《JavaScript高級程序設計(第5版)》詳解CommonJS語法與Node.js的關系 ?? ?? ??

  2. 《JavaScript高級程序設計(第5版)》演示CommonJS導出類與實例的方式 ?? ??

  3. 《JavaScript高級程序設計(第5版)》描述模塊加載器的依賴圖與執行順序 ?? ?? ?? ?? ??

  4. 《JavaScript高級程序設計(第5版)》的目錄指明ES Modules為原生標準 ?? ??

  5. 《JavaScript高級程序設計(第5版)》指出SystemJS支持動態加載ESM等模塊格式 ?? ??

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

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

相關文章

Android Product Flavors 深度解析與最佳實踐:構建多版本應用的全方位指南

1. 高效配置模板 1.1 現代化多維度配置 (Kotlin DSL) android {flavorDimensions listOf("version", "market", "environment")productFlavors {register("free") {dimension "version"applicationIdSuffix ".free…

QListView開發入門

1. QListView 基礎介紹 QListView 是 Qt 框架中用于顯示項目列表的控件&#xff0c;屬于模型/視圖架構的一部分。它提供了一種靈活的方式來顯示和操作項目列表。 主要特點&#xff1a; 基于模型/視圖架構 支持多種視圖模式&#xff08;列表、圖標&#xff09; 內置選擇、編…

Cookie可以存哪些指?

Cookie是一種小型文本文件&#xff0c;通常由服務器生成并發送到用戶瀏覽器中保存。它可以用于存儲一些簡單但非常有用的信息&#xff0c;以便于后續請求時自動附帶回服務器使用。下面是Cookie能夠存儲的一些典型內容類別及用途說明&#xff1a; 會話標識符(Session ID) 這是最…

非手性分子發光有妙招:借液晶之力,實現高不對稱圓偏振發光

*本文只做閱讀筆記分享* 一、圓偏振發光研究背景與挑戰 圓偏振發光&#xff08;CPL&#xff09;材料在3D顯示、光電器件等領域大有用處&#xff0c;衡量它的一個重要指標是不對稱發光因子&#xff08;glum&#xff09;。早期CPL材料的glum值低&#xff0c;限制了實際應用。為…

CSS中的em,rem,vm,vh詳解

一&#xff1a;em 和 rem 是兩種相對單位&#xff0c;它們常用于 CSS 中來設置尺寸、字體大小、間距等&#xff0c;主要用于更靈活和響應式的布局設計。它們與像素&#xff08;px&#xff09;不同&#xff0c;不是固定的&#xff0c;而是相對于其他元素的尺寸來計算的。 1. em …

《非暴力溝通》第十二章 “重獲生活的熱情” 總結

《非暴力溝通》第十二章 “重獲生活的熱情” 的核心總結&#xff1a; 本章將非暴力溝通的核心理念延伸至生命意義的探索&#xff0c;提出通過覺察與滿足內心深處的需要&#xff0c;打破“義務性生存”的桎梏&#xff0c;讓生活回歸由衷的喜悅與創造。作者強調&#xff0c;當行動…

MySQL數據庫精研之旅第五期:CRUD的趣味探索(上)

專欄&#xff1a;MySQL數據庫成長記 個人主頁&#xff1a;手握風云 目錄 一、CRUD簡介 二、Create新增 2.1. 語法 2.2. 示例 三、Retrieve檢索 3.1. 語法 3.2. 示例 一、CRUD簡介 CURD是對數據庫中的記錄進行基本的增刪改查操作&#xff1a;Create(創建)、Retrieve(檢索…

【銀河麒麟系統常識】需求:安裝.NET SDK

前提 網絡狀態正常(非離線安裝)&#xff1b; 終端命令如下所示 根據不同系統的版本&#xff0c;自行選擇&#xff0c;逐行執行即可&#xff1b; # 基于 Ubuntu/Debian 的銀河麒麟系統 wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O…

行業智能體大爆發,分布式智能云有解

Manus的一夜爆紅&#xff0c;在全球范圍內引爆關于AI智能體的討論。 與過去一般的AI助手不同&#xff0c;智能體&#xff08;AI Agent&#xff09;并非只是被動響應&#xff0c;而是主動感知、決策并執行的應用。Gartner預測&#xff0c;到2028年&#xff0c;15%的日常工作決策…

工作記錄 2017-03-13

工作記錄 2017-03-13 序號 工作 相關人員 1 修改郵件上的問題。 開始處理操作日志部分。 測試了C#和MySql的連接。 更新RD服務器。 郝 更新的問題 1、 修改了CMS1500的打印&#xff0c;NDC的內容用了小的字體。 2、在Cliams List中可以查看Job的Notes。 3、Payment Po…

【七層分析框架:寒門貴子消亡的系統性絞殺】

七層分析框架&#xff1a;寒門貴子消亡的系統性絞殺 第一層&#xff1a;教育資源斷層 結論&#xff1a;基礎教育投入差已達量子級差距 機制&#xff1a; 北京海淀小學生均經費&#xff08;&#xffe5;47,800&#xff09; 云南山區&#xff08;&#xffe5;6,200&#xff09;…

Codeforces Round 1014 (Div. 2)(A-D)

題目鏈接&#xff1a;Dashboard - Codeforces Round 1014 (Div. 2) - Codeforces A. Kamilka and the Sheep 思路 最大值-最小值 代碼 void solve(){int n;cin>>n;vi a(n10);int mx0;int miinf;for(int i1;i<n;i){cin>>a[i];mimin(mi,a[i]);mxmax(mx,a[i])…

開源AI智能體項目OpenManus的部署

關于開源AI智能體項目OpenManus的部署與背景信息整理如下&#xff1a; 1. OpenManus 背景與核心亮點 開發背景&#xff1a;Manus作為一款閉源的通用型AI智能體產品&#xff0c;因內測邀請碼稀缺&#xff08;二手平臺炒至10萬元&#xff09;引發爭議。開源社區迅速反應&#xff…

使用jieba庫進行TF-IDF關鍵詞提取

文章目錄 一、什么是TF-IDF&#xff1f;二、為什么選擇jieba庫&#xff1f;三、代碼實現1.導入必要的庫2. 讀取文件3.將文件路徑和內容存儲到DataFrame4.加載自定義詞典和停用詞5.分詞并去除停用詞 四、總結 一、什么是TF-IDF&#xff1f; TF-IDF&#xff08;Term Frequency-I…

【學Rust寫CAD】20 平鋪模式結構體(spread.rs)

這個 Spread。rs文件定義了漸變超出定義區域時的擴展方式&#xff0c;通常用于處理漸變在邊界之外的行為。 源碼 //color/spread.rs #[derive(Debug, Clone, Copy)] pub struct Pad; // 空結構體&#xff0c;表示 Pad 模式#[derive(Debug, Clone, Copy)] pub struct Reflect…

[操作系統,學習記錄]3.進程(2)

1.fork(); 玩法一&#xff1a;通過返回值if&#xff0c;else去執行不同的代碼片段 玩法二&#xff1a;if&#xff0c;else然后調用execve函數去執行新的程序 2.進程終止&#xff1a; 退出碼&#xff0c;子進程通過exit/return返回&#xff0c;父進程wait/waitpid等待而得&am…

Masked Attention 在 LLM 訓練中的作用與原理

在大語言模型&#xff08;LLM&#xff09;訓練過程中&#xff0c;Masked Attention&#xff08;掩碼注意力&#xff09; 是一個關鍵機制&#xff0c;它決定了 模型如何在訓練時只利用過去的信息&#xff0c;而不會看到未來的 token。這篇文章將幫助你理解 Masked Attention 的作…

【自學筆記】PHP語言基礎知識點總覽-持續更新

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 1. PHP 簡介2. PHP 環境搭建3. 基本語法變量與常量數據類型運算符 4. 控制結構條件語句循環語句 5. 函數函數定義與調用作用域 6. 數組7. 字符串8. 表單處理9. 會話…

css選擇最后結尾的元素DOM

前言 選中最后一個元素&#xff0c;實際使用非常頻繁。 解決方案 使用 CSS 提供的選擇器&#xff0c;即可完成。 如下代碼示例&#xff0c;兩種選擇器均可實現。 <p>...</p>p:last-child{ background:#ff0000; }p:nth-last-child(1){background:#ff0000; }p&…

Axios 相關的面試題

在跟著視頻教程學習項目的時候使用了axios發送請求&#xff0c;但是只是跟著把代碼粘貼上去&#xff0c;一些語法規則根本不太清楚&#xff0c;但是根據之前的博客學習了fetch了之后&#xff0c;一看axios的介紹就明白了。所以就直接展示axios的面試題吧 本文主要內容&#xff…