1 什麼是模組化程式設計
2 為什麼要模組化
3 AMD
4 CommonJS
5 總結
了解一個技術,首先要了解這個技術產生的背景及解決的問題,而不應該只是單純的知道該怎麼用。之前的狀態可能就是只是為了了解而了解,並不知道實際產生的原因及帶來的好處,所以今天就來總結一下。
1 什麼是模組化程式設計
來看百度百科的定義
模組化程式設計是指在進行程式設計時將一個大程式依照功能劃分為若干小程式模組,每個小程式模組完成一個確定的功能,並在這些模組之間建立必要的聯繫,透過模組的互相協作完成整個功能的程式設計方法。
例如 java 的 import,C# 的 using。我的理解是透過模組化編程,可以將不同的功能獨立出來,修改某個功能時不會對其他功能產生影響。
2 為什麼要模組化
來看下面一個例子
// A.jsfunction sayWord(type){ if(type === 1){ console.log("hello"); }else if(type === 2){ console.log("world"); } }// B.jsfunction Hello(){ sayWord(1); }// C.jsHello()
假設上面三個文件,B.js 引用了A.js 裡面的內容,C.js又引用了B.js 裡面的內容,如果寫C.js 的人只知道引用了B.js,那他就不會引用A.js 就會導致程式出錯,而且檔案的引用順序也不能出錯。給整體程式碼的調試修改帶來不便。
還有個問題,上述程式碼暴露了兩個全域變量,容易造成全域變數的污染
3 AMD
AMD 即Asynchronous Module Definition(非同步模組定義) 。採取非同步載入的方式載入模組,模組的載入不會影響它後面的語句執行。
假設下面這種情況
// util.jsdefine(function(){ return { getFormatDate:function(date,type){ if(type === 1){ return '2018-08-9' } if(type === 2){ return '2018 年 8 月 9 日' } } } })// a-util.jsdefine(['./util.js'],function(util){ return { aGetFormatDate:function(date){ return util.getFormatDate(date,2) } } })// a.jsdefine(['./a-util.js'],function(aUtil){ return { printDate:function(date){ console.log(aUtil.aGetFormatDate(date)) } } })// main.jsrequire(['./a.js'],function(a){ var date = new Date() a.printDate(date) }) console.log(1);// 使用// <script src = "/require.min.js" data-main="./main.js"></script>
頁面上先列印 1
,然後才會列印 2018 年 8 月 9 日
。因此 AMD 的載入並不會影響後續的語句執行。
如果不是非同步載入會出現什麼情況呢
var a = require('a'); console.log(1)
後面的語句需要等待 a 載入完成才能執行,如果載入時間過長,整個程式都會卡在這。因此,瀏覽器不能同步載入資源,這也是 AMD 的產生背景。
AMD 是在瀏覽器端實作模組化開發的規格。由於該規範不是 JavaScript 原始支援的,使用 AMD 規範進行開發的時候需要引入第三方的函式庫函數,也就是 RequireJS。
RequireJS 主要解決的問題
使JS 非同步加載,避免頁面失去回應
- ##管理程式碼之間的依賴性,有利於程式碼的寫寫
// ? 代表该参数可选 define(id?, dependencies?, factory);
- id:指的是定義的模組的名字
- #dependencies:是定義的模組所依賴模組的陣列
-
#factory:為模組初始化要執行的函數或物件。如果為函數,它應該只被執行一次。如果是對象,此對象應該為模組的輸出值。 具體的規格說明可以參考AMD (中文版)
- 舉個例子,創建一個名為「alpha」 的模組,使用了require,exports,和名為「beta」的模組:
-
define("alpha", ["require", "exports", "beta"], function (require, exports, beta) { exports.verb = function() { return beta.verb(); //Or: return require("beta").verb(); } });
一個傳回物件的匿名模組: define(["alpha"], function (alpha) { return { verb: function(){ return alpha.verb() + 2; } }; });
一個沒有依賴性的模組可以直接定義物件:
define({ add: function(x, y){ return x + y; } });
如何使用
AMD 採用require 語句載入模組
require([module],callback);
module:是數組,裡面的成員是要載入的模組
callback:載入成功之後的回呼函數
例如
<pre class='brush:php;toolbar:false;'>require([&#39;./a.js&#39;],function(a){
var date = new Date()
a.printDate(date)
})</pre>
具體的使用方法如下
// util.jsdefine(function(){ return { getFormatDate:function(date,type){ if(type === 1){ return '2018-08-09' } if(type === 2){ return '2018 年 8 月 9 日' } } } })// a-util.jsdefine(['./util.js'],function(util){ return { aGetFormatDate:function(date){ return util.getFormatDate(date,2) } } })// a.jsdefine(['./a-util.js'],function(aUtil){ return { printDate:function(date){ console.log(aUtil.aGetFormatDate(date)) } } })// main.jsrequire(['./a.js'],function(a){ var date = new Date() a.printDate(date) })// 使用//
假設這裡有4 個文件,util.js,a- util.js 引用了util.js,a.js 引用了a-util.js,main.js 引用了a.js。
其中,data-main 屬性的作用是載入網頁程式的主模組。
上例示範了一個主模組最簡單的寫法,預設情況下,require.js 假設依賴和主模組在同一個目錄。
使用
require.config()方法可以對模組的載入行為進行自訂。
require.config()就寫在主模組(main.js)的頭部,參數是一個對象,這個對象的paths 屬性指定各個模組的載入路徑
require.config({ paths:{ "a":"src/a.js", "b":"src/b.js" } })
還有一種方法是改變基礎目錄(baseUrl)
require.config({ baseUrl: "src", paths: { "a": "a.js", "b": "b.js", } });
4 CommonJS
commonJS 是nodejs 的模組化規範,現在被大量用在前端,由於建置工具的高度自動化,使得使用npm 的成本非常低。 commonJS 不會非同步載入JS,而是同步一次性載入出來
###在commonJS 中,有一個全域性的方法require(),用於載入模組,例如###const util = require('util');###然後,就可以呼叫util 提供的方法了###
const util = require('util');var date = new date(); util.getFormatDate(date,1);###commonJS 對於模組的定義分三種,模組定義(exports),模組引用(require)和模組標示(module)#######exports() 對象用於導出當前模組的變數或方法,唯一的導出口。 require() 用來引入外部模組。 module 物件代表模組本身。 ######舉個栗子###
// util.jsmodule.exports = { getFormatDate:function(date, type){ if(type === 1){ return '2017-06-15' } if(type === 2){ return '2017 年 6 月 15 日' } } }// a-util.jsconst util = require('util.js') module.exports = { aGetFormatDate:function(date){ return util.getFormatDate(date,2) } }###或下面這種方式###
// foobar.js // 定义行为 function foobar(){ this.foo = function(){ console.log('Hello foo'); } this.bar = function(){ console.log('Hello bar'); } } // 把 foobar 暴露给其它模块 exports.foobar = foobar;// main.js//使用文件与模块文件在同一目录var foobar = require('./foobar').foobar, test = new foobar(); test.bar(); // 'Hello bar'
5 总结
CommonJS 则采用了服务器优先的策略,使用同步方式加载模块,而 AMD 采用异步加载的方式。所以如果需要使用异步加载 js 的话建议使用 AMD,而当项目使用了 npm 的情况下建议使用 CommonJS。
相关推荐:
以上是什麼是模組化程式設計? js 模組化程式設計的總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

禪工作室 13.0.1
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器