JavaScript 模塊化詳解( CommonJS、AMD、CMD、ES6模塊化)

一.CommonJS

1.概念

????????CommonJS 規范概述了同步聲明依賴的模塊定義。這個規范主要用于在服務器端實現模塊化代碼組 織,但也可用于定義在瀏覽器中使用的模塊依賴。CommonJS 模塊語法不能在瀏覽器中直接運行;在瀏覽器端,模塊需要提前編譯打包處理。

2.特點

  • 所有代碼都運行在模塊作用域,不會污染全局作用域;

  • 模塊可以多次加載,但是只會在第一次加載時運行一次,然后運行結果就被緩存了,以后再加載,就直接讀取緩存結果。要想讓模塊再次運行,必須清除緩存;

  • 模塊加載的順序,按照其在代碼中出現的順序;

3.基本語法

  • 暴露模塊:module.exports = valueexports.xxx = value

  • 引入模塊:require(xxx),如果是第三方模塊,xxx為模塊名;如果是自定義模塊,xxx為模塊文件路徑

// example.js
var x = 5;
var addX = function (value) {return value + x;
};
module.exports.x = x;
module.exports.addX = addX;引入:var example = require('./example.js');//如果參數字符串以“./”開頭,則表示加載的是一個位于相對路徑
console.log(example.x); // 5
console.log(example.addX(1)); // 6

4.模塊的加載機制

????????CommonJS模塊的加載機制是,輸入的是被輸出的值的拷貝。也就是說,一旦輸出一個值,模塊內部的變化就影響不到這個值。這點與ES6模塊化有重大差異。

// example.js
var x = 5;
var addX = function (value) {return value + x;
};
module.exports.x = x;
module.exports.addX = addX;引入:var example = require('./example.js');//如果參數字符串以“./”開頭,則表示加載的是一個位于相對路徑
console.log(example.x); // 5
console.log(example.addX(1)); // 6

二. AMD

1.概念

????????AMD異步模塊定義,AMD 模塊實現的核心是用函數包裝模塊定義。這樣可以防止聲明全局變量,并允許加載器庫控制 何時加載模塊。包裝模塊的函數是全局 define 的參數,它是由 AMD 加載器庫的實現定義的。

// dataService.js文件
// 定義沒有依賴的模塊
define(function() {let msg = 'www.chenghuai.com'function getMsg() {return msg.toUpperCase()}return { getMsg } // 暴露模塊
})//alerter.js文件
// 定義有依賴的模塊
define(['dataService'], function(dataService) {let name = 'chenghuai'function showMsg() {alert(dataService.getMsg() + ', ' + name)}// 暴露模塊return { showMsg }
})// main.js文件
(function() {require.config({baseUrl: 'js/', //基本路徑 出發點在根目錄下paths: {//映射: 模塊標識名: 路徑alerter: './modules/alerter', //此處不能寫成alerter.js,會報錯dataService: './modules/dataService'}})require(['alerter'], function(alerter) {alerter.showMsg()})
})()// index.html文件
<!DOCTYPE html>
<html><head><title>Modular Demo</title></head><body><!-- 引入require.js并指定js主文件的入口 --><script data-main="js/main" src="js/libs/require.js"></script></body>
</html>
AMD 也支持 require exports 對象,通過它們可以在 AMD 模塊工廠函數內部定義 CommonJS
風格的模塊。這樣可以像請求模塊一樣請求它們,但 AMD 加載器會將它們識別為原生 AMD 結構,而不是模塊定義:

三. UMD

1.概念

????????為了統一 CommonJS AMD 生態系統,通用模塊定義( UMD Universal Module Definition )規范 應運而生。UMD 可用于創建這兩個系統都可以使用的模塊代碼。本質上, UMD 定義的模塊會在啟動時 檢測要使用哪個模塊系統,然后進行適當配置,并把所有邏輯包裝在一個立即調用的函數表達式(IIFE ) 中。雖然這種組合并不完美,但在很多場景下足以實現兩個生態的共存。
(function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD。注冊為匿名模塊define(['moduleB'], factory); } else if (typeof module === 'object' && module.exports) { // Node。不支持嚴格 CommonJS // 但可以在 Node 這樣支持 module.exports 的// 類 CommonJS 環境下使用module.exports = factory(require(' moduleB ')); } else { // 瀏覽器全局上下文(root 是 window)root.returnExports = factory(root. moduleB); } 
}(this, function (moduleB) { // 以某種方式使用 moduleB // 將返回值作為模塊的導出// 這個例子返回了一個對象// 但是模塊也可以返回函數作為導出值return {}; 
}));

四.?ES6 模塊

1. 模塊標簽及定義

????????ECMAScript 6 模塊是作為一整塊 JavaScript 代碼而存在的。帶有 type="module" 屬性的 <script> 標簽會告訴瀏覽器相關代碼應該作為模塊執行,而不是作為傳統的腳本執行。模塊可以嵌入在網頁中, 也可以作為外部文件引入:
????????與傳統腳本不同,所有模塊都會像<script defer> 加載的腳本一樣按順序執行。解析到 <script
type="module"> 標簽后會立即下載模塊文件,但執行會延遲到文檔解析完成。無論對嵌入的模塊代碼, 還是引入的外部模塊文件,都是這樣。<script type="module"> 在頁面中出現的順序就是它們執行 的順序。與<script defer> 一樣,修改模塊標簽的位置,無論是在 <head> 還是在 <body> 中,只會影 響文件什么時候加載,而不會影響模塊什么時候加載。
下面演示了嵌入模塊代碼的執行順序:
不管它是如何加載的,實際上都只會加載一次,如下面的代碼所示:
ECMAScript 6 模塊借用了 CommonJS AMD 的很多優秀特性。下面簡單列舉一些。
優點:
? 模塊代碼只在加載后執行。
? 模塊只能加載一次。
? 模塊是單例。
? 模塊可以定義公共接口,其他模塊可以基于這個公共接口觀察和交互。
? 模塊可以請求加載其他模塊。
? 支持循環依賴。
ES6 模塊系統也增加了一些新行為。
? ES6 模塊默認在嚴格模式下執行。
? ES6 模塊不共享全局命名空間。
? 模塊頂級 this 的值是 undefined (常規腳本中是 window )。
? 模塊中的 var 聲明不會添加到 window 對象。
? ES6 模塊是異步加載和執行的。

2.模塊導出

????????ES6 模塊的公共導出系統與 CommonJS 非常相似。控制模塊的哪些部分對外部可見的是 export 關 鍵字。ES6 模塊支持兩種導出:命名導出和默認導出。不同的導出方式對應不同的導入方式。
????????導出時也可以提供別名,別名必須在 export 子句的大括號語法中指定。因此,聲明值、導出值和 為導出值提供別名不能在一行完成。在下面的例子中,導入這個模塊的外部模塊可以使用 myFoo 訪問 導出的值:
????????默認導出 default export )就好像模塊與被導出的值是一回事。默認導出使用 default 關鍵字將一 個值聲明為默認導出,每個模塊只能有一個默認導出。

3.模塊導入

????????模塊可以通過使用 import 關鍵字使用其他模塊導出的值。與 export 類似, import 必須出現在
模塊的頂級:
????????導入對模塊而言是只讀的,實際上相當于 const 聲明的變量。在使用 * 執行批量導入時,賦值給別 名的命名導出就好像使用 Object.freeze() 凍結過一樣。直接修改導出的值是不可能的,但可以修改 導出對象的屬性。同樣,也不能給導出的集合添加或刪除導出的屬性。要修改導出的值,必須使用有內 部變量和屬性訪問權限的導出方法。
????????命名導出和默認導出的區別也反映在它們的導入上。命名導出可以使用* 批量獲取并賦值給保存導 出集合的別名,而無須列出每個標識符:

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

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

相關文章

TCP BBR 的優化

前段時間&#xff0c;老板發了篇資料&#xff0c;下面是我學習的相關記錄整理。 https://aws.amazon.com/cn/blogs/china/talking-about-network-optimization-from-the-flow-control-algorithm/ PS&#xff1a;ubuntu24默認使用的tcp控制算法。還是 cubic sysctl net.ipv4.tc…

什么是異步?

什么是異步&#xff1f; 異步是一個術語&#xff0c;用于描述不需要同時行動或協調就能獨立運行的流程。這一概念在技術和計算領域尤為重要&#xff0c;它允許系統的不同部分按自己的節奏運行&#xff0c;而無需等待同步信號或事件。在區塊鏈技術中&#xff0c;異步是指網絡中…

SSM婚紗攝影網的設計

&#x1f345;點贊收藏關注 → 添加文檔最下方聯系方式咨詢本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345; 項目視頻 SS…

石頭剪刀布游戲

自己寫的一個石頭剪刀布游戲&#xff0c;如果有需要更改的地方請指出 #define _CRT_SECURE_NO_WARNINGS // scanf_s編寫起來太過于麻煩&#xff0c;直接把這個警告關掉&#xff0c;便于編寫。 #include <stdio.h> #include <stdlib.h> #include <time.h> //…

大數據系列之:Kerberos

大數據系列之&#xff1a;Kerberos 基本概念工作流程安全特性應用場景總結加密原理Kerberos認證流程更改您的密碼授予賬戶訪問權限票證管理Kerberos 票據屬性使用 kinit 獲取票據使用 klist 查看票據使用 kdestroy 銷毀票據.k5identity 文件描述 Kerberos 是一種網絡認證協議&a…

WPF 免費UI 控件HandyControl

示例效果和代碼 直接可以用 Button 按鈕 | HandyOrg 1.安裝 , 輸入 HandyControl 2.<!--配置HandyControl--> <!--配置HandyControl--> <ResourceDictionary Source"pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/> …

windows部署docker

1.下載docker 打開瀏覽器&#xff0c;訪問 Docker Desktop 下載頁面。 2.安裝 Docker Desktop 運行安裝程序&#xff1a; 雙擊下載的 Docker Desktop 安裝包&#xff0c;啟動安裝程序。 選擇安裝選項&#xff1a; 按照屏幕上的指示進行操作。建議選擇默認選項&#xff0c;包…

【Linux】遠程登錄時,使用圖形界面報錯:MoTTY X11 proxy: Unsupported authorisation protocol

1、問題描述 使用 MobaXterm 遠程登錄Ubuntu后,使用sudo權限運行圖形界面程序報錯: MoTTY X11 proxy: Unsupported authorisation protocol (gpartedbin:10518): Gtk-WARNING **: 22:01:34.377: cannot open display: localhost:10.02、查看SSH配置 修改 SSH 服務端配置,…

解決 Hugging Face SentenceTransformer 下載失敗的完整指南:ProxyError、SSLError與手動下載方案

問題背景 在使用 Hugging Face 的 SentenceTransformer 加載預訓練模型 all-MiniLM-L6-v2 時&#xff0c;遇到了以下錯誤&#xff1a; 代理連接失敗&#xff08;ProxyError / SSLError: KRB5_S_TKT_NYV&#xff09;大文件下載中斷&#xff08;unexpected EOF while reading&a…

MySQL——DQL的單表查詢

1、查詢表中所有的字段&#xff08;列&#xff09; 語法&#xff1a;select * from 表名; * 是通配符&#xff0c;用來表示所有的字段&#xff08;列&#xff09;。 select 表示查詢哪些列。 from 表示從哪張表中查詢。 2、查詢表中指定的字段 語法&#xff1a;select 列…

開源RuoYi AI助手平臺的未來趨勢

近年來&#xff0c;人工智能技術的迅猛發展已經深刻地改變了我們的生活和工作方式。 無論是海外的GPT、Claude等國際知名AI助手&#xff0c;還是國內的DeepSeek、Kimi、Qwen等本土化解決方案&#xff0c;都為用戶提供了前所未有的便利。然而&#xff0c;對于那些希望構建屬于自…

[WUSTCTF2020]CV Maker1

進來是個華麗的界面&#xff0c;我們先跟隨這個網頁創造一個用戶 發現了一個上傳端口&#xff0c;嘗試上傳一個php文件并抓包 直接上傳進不去&#xff0c;加個GIF89A uploads/d41d8cd98f00b204e9800998ecf8427e.php 傳入 并且報告了 上傳路徑&#xff0c;然后使用蟻劍連接

Spring 中的 IOC

&#x1f331; 一、什么是 IOC&#xff1f; &#x1f4d6; 定義&#xff08;通俗理解&#xff09;&#xff1a; IOC&#xff08;Inversion of Control&#xff0c;控制反轉&#xff09; 是一種設計思想&#xff1a;對象不再由你自己創建和管理&#xff0c;而是交給 Spring 容器…

Vue2-實現elementUI的select全選功能

文章目錄 使用 Element UI 的全選功能自定義選項來模擬全選 在使用 Element UI 的 el-select組件時&#xff0c;實現“全選”功能&#xff0c;通常有兩種方式&#xff1a;一種是使用內置的全選功能&#xff0c;另一種是通過自定義選項來模擬全選。 使用 Element UI 的全選功能…

小菜Go:Ubuntu下Go語言開發環境搭建

前置要求Ubuntu環境搭建 文章推薦 此處推薦一個比較好的文章&#xff0c;基本按部就班就歐克~ 安裝虛擬機&#xff08;VMware&#xff09;保姆級教程&#xff08;附安裝包&#xff09;_vmware虛擬機-CSDN博客 安裝可能遇到的問題 虛擬機安裝遇到的問題如&#xff1a;Exception…

安卓中app_process運行報錯Aborted,怎么查看具體的報錯日志

我在pc端生成了一個jar包&#xff0c;可以正常執行&#xff0c;但是導入到安卓的/data/local/tmp下面執行就會報錯 執行命令如下&#xff1a; adb shell cd /data/local/tmp app_process -Djava.class.path/data/local/tmp/demo.jar /data/local/tmp com.example.demo.Hello然…

Python 面向對象 - 依賴倒置原則 (DIP)

1. 核心概念 依賴倒置原則(Dependency Inversion Principle, DIP) 是SOLID原則中的"D"&#xff0c;包含兩個關鍵點&#xff1a; 高層模塊不應依賴低層模塊&#xff0c;二者都應依賴抽象抽象不應依賴細節&#xff0c;細節應依賴抽象 2. 使用場景 典型應用場景 系…

centos7 yum install docker 安裝錯誤

1、錯誤信息&#xff1a; [rootlocalhost atguigu]# yum install docker 已加載插件&#xff1a;fastestmirror, langpacks Repository base is listed more than once in the configuration Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http:…

【Gorm】模型定義

intro package mainimport ("gorm.io/gorm""gorm.io/driver/sqlite" // GORM 使用該驅動來連接和操作 SQLite 數據庫。 )type Product struct {gorm.Model // 嵌入GORM 內置的模型結構&#xff0c;包含 ID、CreatedAt、UpdatedAt、DeletedAt 四個字段Cod…

R語言從專家到小白

文章目錄 下載安裝R下載安裝R StudioCRAN 下載安裝R Index of /bin https://cran.r-project.org/ 下載安裝R Studio https://posit.co/download/rstudio-desktop/ CRAN R綜合檔案網絡。 CRAN 鏡像是一個提供 R 語言軟件和包的在線服務&#xff0c;用戶可以從不同的地區選擇…