JavaScript模塊化-CommonJS、AMD、CMD、UMD、ES6

来源:https://www.cnblogs.com/justbecoder/archive/2020/04/01/12616621.html
-Advertisement-
Play Games

前言:模塊化開發需求 在JS早期,使用script標簽引入JS,會造成以下問題: 1. 載入的時候阻塞網頁渲染,引入JS越多,阻塞時間越長。 2. 容易污染全局變數。 3. js文件存在依賴關係,載入必須有順序。項目較大時,依賴會錯綜複雜。 4. 引入的JS文件過多,不美觀,且不易於管理。 一、Co ...


前言:模塊化開發需求

在JS早期,使用script標簽引入JS,會造成以下問題:

  1. 載入的時候阻塞網頁渲染,引入JS越多,阻塞時間越長。
  2. 容易污染全局變數。
  3. js文件存在依賴關係,載入必須有順序。項目較大時,依賴會錯綜複雜。
  4. 引入的JS文件過多,不美觀,且不易於管理。

一、CommonJS規範

CommonJS Modules/1.0規範,伺服器端規範。

Node.js推廣使用。該規範的核心是:允許模塊使用require方法來同步載入所依賴的其他模塊,然後通過exports或module.exports導出需要暴露的介面。

特點:

  1. 一個模塊是一個文件

  2. 使用module.exports或exports導出模塊

    // module.js
    exports.add = (a, b) => a+b
    
    module.exports = {
      add: (a, b) => a + b
    }
    
  3. 使用require載入模塊

    a. require命令第一次載入模塊時,執行整個腳本,在記憶體中生成對象
    b. 多次執行require命令再次載入該模塊時,不會再執行該腳本,直接從緩存中取值
    c. CommonJS載入模塊是同步載入模塊
    

Tips:

  1. 為什麼CommonJS規範不適合作為瀏覽器的規範

    由於CommonJS是同步加模塊,在服務端載入模塊時都是從本地硬碟中載入,讀取速度很快。但是在瀏覽器端載入模塊時,需要請求伺服器端,涉及網速、代理的問題,一旦等待時間過長,瀏覽器會處於“假死”狀態。
    

二、ADM規範

AMD(Asynchronous Module Definition)非同步模塊定義,客戶端規範。
採用非同步方式載入模塊,模塊載入不影響它後面語句的代執行。

AMD是require.js在推廣使用過程中對模塊定義規範化的產物。

在使用時,需引入require.js

特點

  1. 使用define()定義模塊

    /**
     * @param id 模塊名稱,如果為空,模塊的名字預設為模塊載入器請求的指定腳本名
     * @param dependencies 模塊依賴
     * @param factory 工場函數,模塊初始化執行的函數或對象
     */
    define(id? dependencies? factory)
    
  2. 使用require載入模塊

    require([module], callback)
    

    AMD是依賴前置模塊

三、CMD規範

CMD(Common Module Definition)通用模塊定義,非同步載入模塊。

CMD是sea.js在推廣過程中對模塊定義的規範化產物。

在使用時,需引入sea.js

特點:

  1. 使用define()定義模塊,使用require()載入模塊

    define(function (require, exports, module) {
    	let a = require('a')
    	let b = require('b')
    	exports.eat = a.eat
    	exports.run = b.run
    })
    

    CMD模塊載入是推崇就近依賴的,需要到某個模塊時再進行require載入

  2. 使用seajs.use載入使用模塊

    seajs.use(id, callback?)
    

四、UMD規範

UMD(Universal Module Definition)通用模塊定義,為了相容AMD、CMD和無模塊化開發規範

/**
 * UMD-Universal Module Definition 通用模塊定義
 * */
 (function (root, factory) {
	 // 判斷是否是AMD/CMD
	 if (typeof define === 'function') {
		 define([], factory)
	 } else if (typeof exports === 'object') {
		 // Node CommonJS規範
		 module.exports = factory()
	 } else {
		 // 瀏覽器環境
		 root.someAttr = factory
	 }
 })(this, function () {
	 let add = function (a, b) {
		 return a + b
	 }
	 return {
		 add,
		 module: 'UMD'
	 }
 })

五、ES6模塊

ES6通過imort和export實現模塊的輸入與輸出,import命令用於輸入其他模塊提供的功能,export命令用於規定模塊對外的介面。

特點:

  1. 使用export導出模塊

    // test.js
    export let module = 'ES6 Module'
    export let hello = function () {}
    let demo = function () {}
    // 預設導出
    export default demo
    
  2. 使用import導入模塊

    // 導入預設模塊
    import demo from './test.js'
    
    // 導入指定模塊
    import { hello, module } from './test'
    
    // 導入指定模塊,並重命名
    import { hello as hi, module } from './test.js'
    
    // 導入全部模塊,並重命名
    import * as test from './test.js'
    

後記

以上就是胡哥今天給大家分享的內容,喜歡的小伙伴記得收藏轉發、點擊右下角按鈕在看,推薦給更多小伙伴呦,歡迎多多留言交流...

胡哥有話說,一個有技術,有情懷的胡哥!現任京東前端攻城獅一枚。
胡哥有話說,專註於大前端技術領域,分享前端系統架構,框架實現原理,最新最高效的技術實踐!

長按掃碼關註,更帥更漂亮呦!關註胡哥有話說公眾號,可與胡哥繼續深入交流呦!

胡哥有話說


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、大小寫特別敏感 大寫欄位需要用“”引號(pg欄位名使用“”,MySQL欄位名使用``) ******表名以及欄位名如果是小寫但是為關鍵字,比如name,則也需使用""; 二、分頁 limit ${limit} offset ${start} 三、判斷條件等號前後欄位類型需要一致 類型轉換相關函數 ...
  • 導讀 正所謂有人(鎖)的地方就有江湖(事務),人在江湖飄,怎能一無所知? 今天來細說一下Mysql中的三類鎖,分別是全局鎖、表級鎖、行級鎖。 文章首發於作者公眾號【碼猿技術專欄】,原創不易,喜歡的點個贊關註一下,謝謝!!! 全局鎖 全局鎖簡單的說就是鎖住整個資料庫實例,命令是Flush tables ...
  • Redis常用管理命令 # dbsize 返回當前資料庫 key 的數量。 # info 返回當前 redis 伺服器狀態和一些統計信息。 # monitor 實時監聽並返回redis伺服器接收到的所有請求信息。 # shutdown 把數據同步保存到磁碟上,並關閉redis服務。 # config ...
  • create table CUX_IMPORT_DATA_E45 as select * from CUX_IMPORT_DATA_L11 where 1>2; CREATE TABLE CUX.lmh_segment1_E41 AS SELECT * FROM CUX.lmh_segment1_L ...
  • 即使是一個開發工程師,也只是 MySQL 的用戶,但在瞭解了一個個系統模塊的原理後,再來使用它,感覺是完全不一樣的。 當在代碼里寫下一行資料庫命令的時候,就能想到它在資料庫端將怎麼執行,它的性能是怎麼樣的,怎樣寫能讓應用程式訪問資料庫的性能最高。進一步,哪些數據處理讓資料庫系統來做性能會更好,哪些數 ...
  • 一、 對UI界面盡心自定義組件 package com.example.uicustomviews; ​ import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.v ...
  • 最近簡單學習了MVVM框架,記錄一下。 結果演示: 分析其功能在不同框架下的構成: 無框架 可以明顯感受到在無框架下,雖然一個單獨的Activity即可實現功能,但其負擔過重,代碼複查時繁瑣,一旦需要修改,複雜項目極難維護。 MVC 在MVC框架下,雖然將獲取數據與界面展示分割開來,但對於Contr ...
  • 接上篇 https://www.cnblogs.com/chenyingying0/p/12609330.html 首先說下格式化的問題: vscode可以安裝Vetur插件 安裝之後重啟編輯器,滑鼠右鍵,有一個格式化代碼選項,點擊即可 首先放出文件路徑,先讓小伙伴們熟悉下結構 Navbar 組件: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...