JS 模塊化 - 03 AMD 規範與 Require JS

来源:https://www.cnblogs.com/youyacoder/archive/2022/09/23/16722084.html
-Advertisement-
Play Games

*AMD* 規範,全稱 *Asynchronous Module Definition*,非同步模塊定義,模塊之間的依賴可以被非同步載入。 AMD 規範由 Common JS 規範演進而來,前文介紹 Common JS 規範時說過,瀏覽器端無法直接使用 Common JS,需要使用 *browseri... ...


1 AMD 規範介紹

AMD 規範,全稱 Asynchronous Module Definition,非同步模塊定義,模塊之間的依賴可以被非同步載入。

AMD 規範由 Common JS 規範演進而來,前文介紹 Common JS 規範時說過,瀏覽器端無法直接使用 Common JS,需要使用 browserify 編譯後才能運行。而 AMD 規範規範則專註於瀏覽器端。

1.1 定義模塊

AMD 規範定義模塊使用 define 函數,函數聲明如下:

define(id?, dependencies?, factory)

參數含義:

- id:非必填,模塊的名字。如果沒有傳該參數,模塊的名字預設為模塊載入器請求的指定腳本的名字
- dependencies:非必填,數組,定義的這個模塊所需要依賴的模塊的數組。如果定義的這個模塊不依賴於其他模塊,則不需要傳遞該參數。
- factory:必填,工廠方法。如果為對象,則表示這個模塊輸出的值;如果為函數,則是這個模塊要乾的事。

如果傳遞了 dependenciesdependencies 中依賴的每項模塊會在當前模塊的 factory 之前執行。

1.2 載入模塊

與 Common JS 規範類似,載入模塊使用 require 函數,但 AMD 規範中該函數有兩個參數,語法格式如下:

require([module], callback)

參數含義:

- module:數組,要載入的模塊數組。
- callback:模塊載入成功之後要乾的事。

2 Require JS

require.js 是符合 AMD 規範的 JS 庫,使用 require.js 可以實現 AMD 規範,進行模塊的定義和載入。

2.1 使用準備

首先下載 require.js 文件。require.js 可以從 github 下載。(不知道是不是網路原因,官網我打不開)

在項目中創建 lib 目錄,將 require.js 文件複製到 lib 目錄中。

2.2 初始化目錄

lib 同級目錄創建目錄 modules,在 modules 目錄中分別創建 module1.jsmodule2.js 代表兩個模塊。

同時下載 moment.js 文件,將其複製到 lib 目錄中。

lib 同級目錄創建入口 HTML 和 JS 文件,名字分別為:index.htmlindex.js.

此時目錄結構為:

|- 03_AMD/
	|- lib/
		|- require.js
		|- moment.js
	|- modules/
		|- module1.js
		|- module2.js
	|- index.html
	|- index.js

index.html 文件中通過 script 標簽引入 require.js 文件,同時指定 data-main 屬性:

<script src="./lib/require.js" data-main="./index.js"></script>

data-main 屬性指定了在載入完 require.js 屬性後,執行的入口文件,該文件也稱為 主模塊 。咱們的主模塊為 index.html 同級路徑下的 index.js

2.3 路徑配置

在入口 JS 文件 index.js 中對模塊進行配置:

requirejs.config({
  baseUrl: './',
  paths: {
    m1: './modules/module1',
    m2: './modules/module2',
    moment: './lib/moment'
  },
  shim: {
    moment: {
      exports: 'moment'
    },
  }
})
  1. baseUrl 屬性:指定了基本路徑,後面模塊路徑配置都是相對於這個基本路徑。
  2. paths 屬性:配置各個模塊的名稱及對應文件路徑(省略 .js 尾碼)。上面分別給 module1.jsmodule2.jsmoment.js 三個模塊命名為 m1m2moment。名字可以取其他名字,但路徑要正確。
  3. shim 屬性:當使用其他不符合 AMD 規範的模塊時,可以使用該屬性導出模塊。(這裡選擇的 moment.js 是相容 AMD 規範的庫,無須配置到 shim 屬性中,此處僅為了簡單演示)

2.4 定義模塊

前面創建了兩個自定義模塊,現在分別編寫這兩個模塊。

module1.js 中定義一個簡單的加法運算:

define(function () {
  console.log('in module1.')

  function sum(num1, num2) {
    console.log('module1 sum function.', num1, num2)
    return num1 + num2
  }

  return {
    sum
  }
})

module2.js 定義一個 calculate 函數,在該函數中需要調用 moment.js 中的格式化函數、 module1.js 中的 sum 函數,也就是說該模塊(m2)依賴於 moment 模塊 和 m1 模塊:

define(['m1', 'moment'], function (m1, moment) {

  console.log('in module2.')

  function calculate (n1, n2) {
    console.log('begin calc: ', moment().format('YYYY MMM Do h:mm:ss a'))
    return m1.sum(n1, n2)
  }

  return {
    calculate
  }
})

2.5 使用模塊

前面在主模塊 index.js 中定義了模塊的路徑,現在繼續在該文件中通過 require 函數使用其他模塊:

// ...

require(['m2'], function (m2) {
  const result = m2.calculate(10, 20)
  console.log(result)
})

主模塊中載入 m2 模塊(module2.js),並調用 m2 模塊中的 calculate 函數。

2.6 運行

在瀏覽器中運行 index.html,瀏覽器控制台輸出如下:

image-20220921224121047

主模塊(index.js)依賴於 m2 模塊(module2.js),m2 模塊又依賴於 m1 模塊(module1.js),故 require.js 會首先載入 module1.js,輸出 in module1.,然後載入 module2.js, 輸出 in module2.

m1m2moment 三個模塊都載入完畢後,才會執行主模塊中的 factory 工廠函數。

3 總結

AMD 規範的使用:

  • 定義模塊:define 函數
  • 載入模塊:require 函數

感謝你閱讀本文,如果本文給了你一點點幫助或者啟發,還請三連支持一下,點贊、關註、收藏,作者會持續與大家分享更多乾貨


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

-Advertisement-
Play Games
更多相關文章
  • 1 DBeaver介紹 DBeaver是一個通用的資料庫管理工具和 SQL 客戶端,支持多種相容 JDBC 的資料庫。DBeaver 提供一個圖形界面用來查看資料庫結構、執行SQL查詢和腳本,瀏覽和導出數據,處理BLOB/CLOB 數據,修改資料庫結構等。 2 安裝DBeaver 下載地址:http ...
  • ​ 這次來聊聊Hadoop中使用廣泛的分散式計算方案——MapReduce。MapReduce是一種編程模型,還是一個分散式計算框架。 MapReduce作為一種編程模型功能強大,使用簡單。運算內容不只是常見的數據運算,幾乎大數據中常見的計算需求都可以通過它來實現。使用的時候僅僅需要通過實現Map和 ...
  • 在最新一屆國際資料庫頂級會議 ACM SIGMOD 2022 上,來自清華大學的李國良和張超兩位老師發表了一篇論文:《HTAP Database: What is New and What is Next》,並做了 《HTAP Database:A Tutorial》 的專項報告。這幾期學術分享會的 ...
  • 使用過Redis事務的應該清楚,Redis事務實現是通過打包多條命令,單獨的隔離操作,事務中的所有命令都會按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。事務中的命令要麼全部被執行,要麼全部都不執行(原子操作)。但其中有命令因業務原因執行失敗並不會阻斷後續命令的執行,且也無... ...
  • ​介紹一下個人開發者賬號: 再說下什麼是免費的蘋果開發者賬號,就是你沒交688年費的就是免費賬號,如果你想變成付費開發者賬號,提交申請付費就行,賬號都是一樣的賬號。 沒有賬號的點擊鏈接申請: 蘋果開發者賬號申請 登錄開發者中心developer.apple.com/account這個界面就是免費開發 ...
  • 1、Date => String 代碼 /** * 函數描述:時間格式化工具 * @param format {String} 格式(y-年,M-月,d-日,H-時[24],h-時[12],m-分,s-秒,S-毫秒(3位數),q-季度,ap,午前am/午後pm) * @returns {String ...
  • ##PUT,DELETE,POST,GET四種基礎方法對應增刪改查 1、GET請求會向資料庫發索取數據的請求,從而來獲取信息,該請求就像資料庫的select操作一樣,只是用來查詢一下數據,不會修改、增加數據,不會影響資源的內容,即該請求不會產生副作用。無論進行多少次操作,結果都是一樣的。 2、與GE ...
  • 公粽號【今天也要寫bug】每日推送,歡迎關註 每日3題 1 以下代碼執行後,控制臺中的輸出內容為? const user = { name: "JM", age: 18, }; const data = JSON.stringify(user, ["age"]); console.log(data) ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...