摘要:是另一種模塊化方案,它與很類似,不同點(diǎn)在于推崇依賴前置提前執(zhí)行,推崇依賴就近延遲執(zhí)行。
commonJS規(guī)范
隨著前端技術(shù)的不斷發(fā)展,項(xiàng)目越來越大,越來越不好管理,多人開發(fā)越來讓開發(fā)者頭疼,于是出現(xiàn)了命名空間,這沒有辦法的辦法,但是所有變量都是全局的話,管理非常混亂,而且在Node 出現(xiàn)前,javascript 在服務(wù)器端基本沒有市場,經(jīng)過javascript 不斷努力,社區(qū)為 javascript 制定了相應(yīng)的規(guī)范。其中 commonJS 規(guī)范的提出算是最為重要的里程碑。
commonJS對模塊的引用非常簡單,主要分為模塊引用、模塊定義和模塊標(biāo)示3部分
在模塊中,上下文提供了 require() 方法來引入外來模塊,引入對應(yīng)的功能。上下文還提供了 exports 對象,用來導(dǎo)出當(dāng)前模塊的方法或變量。上下文還提供了一個(gè)module對象,它代表模塊本身,而 exports 是 module 的屬性。在node中一個(gè)文件就是一個(gè)模塊,將方法掛載在exports上作為屬性即可定義導(dǎo)出方式。
// math.js exports.add = function () { var sum = 0, i = 0, args = arguments, l = args.length; while (i < l) { sum += args[i]; i++ } return sum; }2.模塊引用
在commonJS規(guī)范中,存在 require() 方法,這個(gè)方法接受模塊標(biāo)示,以此引入一個(gè)模塊的API到當(dāng)前的上下文中。
模塊引入的實(shí)例代碼
var math = require("math");3.模塊標(biāo)示
模塊標(biāo)示其實(shí)就是傳遞給require()的參數(shù),必須符合小駝峰命名的字符串,或者以.,..開頭的相對路徑,或者絕對路徑。
commonJS 和 AMDCommonJS是主要為了JS在后端的表現(xiàn)制定的,他是不適合前端的,為什么這么說呢?
這需要分析一下瀏覽器端的js和服務(wù)器端js都主要做了哪些事,有什么不同了:
服務(wù)器端 | 瀏覽器js |
---|---|
加載時(shí)從磁盤中加載 | 加載時(shí)需要通過網(wǎng)絡(luò)加載 |
相同的代碼需要多次執(zhí)行 | 代碼需要從一個(gè)服務(wù)器端分發(fā)到多個(gè)客戶端執(zhí)行 |
CPU和內(nèi)存資源是瓶頸 | 帶寬是瓶頸 |
commonJS在服務(wù)器端運(yùn)行完全沒有問題的,因?yàn)樗匈Y源都在服務(wù)器端的磁盤里,加載速度很快。但是在瀏覽器端因?yàn)榫W(wǎng)速的限制,加載資源需要時(shí)間,會(huì)阻塞代碼的運(yùn)行,而AMD(異步模塊定義)的出現(xiàn),可以異。它的模塊定義如下:
define(id?, dependencies?, factory);
它的模塊id和依賴都是可選的,而factory函數(shù)的內(nèi)容就是實(shí)際代碼內(nèi)容,假設(shè)一個(gè)模塊不依賴任何一個(gè)模塊
//math.js define(function () { var math = {}; math.add = function (arr) { for(var i = 0, sum = 0; i < arr.length; i++) { sum += arr[i]; } return sum; } math.muti = function (arr) { for(var i = 0, sum = 0; i < arr.length; i++) { sum *= arr[i]; } return sum; } })
引用的時(shí)候這樣寫
//main.js define(["math", function(math) { var arr = [1, 10, 20], sum = math.add(arr); console.log(sum); //31 }]
當(dāng)然這是原理,大家明白了之后,對于入門者,估計(jì)還是不知道怎么去用,那么我就幫人幫到底(會(huì)用的繞過)。
引入一個(gè)requirejs
如果覺得覺得這個(gè)文件加載也會(huì)堵塞 js 的話就把他放在代碼的底部,然后這樣寫
其中defer是為了兼容IE瀏覽器。加載完requirejs之后,怎么加載我們自己的js呢
2.加載我們自己的js
// main.js // 首先用config()指定各模塊路徑和引用名 require.config({ baseUrl: "js/lib", paths: { "jquery": "jquery.min", //實(shí)際路徑為js/lib/jquery.min.js "underscore": "underscore.min", } }); // 執(zhí)行基本操作 require(["jquery","underscore"],function($,_){ // some code here });
data-main 屬性里面的就是我們自己的入口文件了,由于 requirejs 默認(rèn)加載 js 文件的,所以 后綴 js 可以省略。OK,下面就可以快樂的寫模塊了。
CMD規(guī)范CMD規(guī)范由國內(nèi)的玉伯大神指出。是另一種js模塊化方案,它與AMD很類似,不同點(diǎn)在于:AMD 推崇依賴前置、提前執(zhí)行,CMD推崇依賴就近、延遲執(zhí)行。
/** AMD寫法 **/ define(["a", "b", "c", "d", "e", "f"], function(a, b, c, d, e, f) { // 等于在最前面聲明并初始化了要用到的所有模塊 a.doSomething(); if (false) { // 即便沒用到某個(gè)模塊 b,但 b 還是提前執(zhí)行了 b.doSomething() } }); /** CMD寫法 **/ define(function(require, exports, module) { var a = require("./a"); //在需要時(shí)申明 a.doSomething(); if (false) { var b = require("./b"); b.doSomething(); } }); /** sea.js **/ // 定義模塊 math.js define(function(require, exports, module) { var $ = require("jquery.js"); var add = function(a,b){ return a+b; } exports.add = add; });
require, exports 和 module 通過形參傳遞給模塊,在需要依賴模塊時(shí),隨時(shí)引入,可以看出,與 AMD 規(guī)范相比,CMD 規(guī)范更加接近 node 對 commonJS規(guī)范的定義。
兼容多種模塊規(guī)范技術(shù)在發(fā)展,優(yōu)秀的開源項(xiàng)目也在不斷更新,比如jquery,underscore。它們很快出了兼容不同規(guī)范的版本,那么他們是怎么做到的,是寫好幾套符合不同規(guī)范的代碼么,當(dāng)然不是。那么我們怎么寫出像他們那樣兼容不同規(guī)范的代碼呢,很簡單,我給出一個(gè)例子:
//hello.js ;(function(name, definition){ //檢測上下文環(huán)境是否為 AMD 或 CMD var hasDefine = typeof define === "function", hasExports = typeof module !== "undefined" && module.exports; if (hasDefine) { //AMD 環(huán)境或 CMD 環(huán)境 define(definition); } else if (hasExports) { // 定義為普通的node模塊 module.exports = definition(); } else { //將模塊的執(zhí)行結(jié)果掛在 window 變量中,在瀏覽器中 this 指向 window 對象 this[name] = definition(); } })("hello", function() { //代碼主體 var hello = function () {}; return hello; })
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85037.html
摘要:目前通行的的模板規(guī)范共有兩種和的模塊系統(tǒng),是參照規(guī)范實(shí)現(xiàn)的即為服務(wù)器端模塊的規(guī)范。規(guī)范則是非同步加載模塊,允許指定回調(diào)函數(shù)。 目前通行的Javascript的模板規(guī)范共有兩種:CommonJS 和 AMD commonjs nodejs的模塊系統(tǒng),是參照commonjs規(guī)范實(shí)現(xiàn)的 commonjs即為服務(wù)器端模塊的規(guī)范。 commonjs的規(guī)范: 根據(jù)commonjs規(guī)范,一個(gè)單獨(dú)的...
摘要:是服務(wù)器端模塊化的規(guī)范,是這種規(guī)范的實(shí)現(xiàn)。異步模塊定義和通用模塊定義都是瀏覽器端模塊化的規(guī)范。是在推廣過程中對模塊定義的規(guī)范化產(chǎn)出。 前言:最近看到這樣一個(gè)問題「import ... from」、「 import ... = require()」 和 「import(path: string)」有什么區(qū)別? ,我遇到的項(xiàng)目中大都是ES6模塊規(guī)范,其他規(guī)范也有,但為什么會(huì)有這些規(guī)范?具體...
摘要:模塊化總結(jié)最近重新復(fù)習(xí)的模塊化的相關(guān)知識(shí),總結(jié)一下,僅供自己理解和大家參考。模塊化的優(yōu)點(diǎn)可維護(hù)性根據(jù)定義,每個(gè)模塊都是獨(dú)立的。良好設(shè)計(jì)的模塊會(huì)盡量與外部的代碼撇清關(guān)系,以便于獨(dú)立對其進(jìn)行改進(jìn)和維護(hù)。 模塊化總結(jié) 最近重新復(fù)習(xí)的模塊化的相關(guān)知識(shí),總結(jié)一下,僅供自己理解和大家參考。 模塊化的優(yōu)點(diǎn) 可維護(hù)性:根據(jù)定義,每個(gè)模塊都是獨(dú)立的。良好設(shè)計(jì)的模塊會(huì)盡量與外部的代碼撇清關(guān)系,以便于獨(dú)立...
摘要:即盡早地執(zhí)行依賴模塊。阮一峰輸出值的引用模塊是動(dòng)態(tài)關(guān)聯(lián)模塊中的值,輸出的是值得引用。的加載實(shí)現(xiàn)阮一峰運(yùn)行時(shí)加載靜態(tài)編譯模塊是運(yùn)行時(shí)加載,模塊是編譯時(shí)輸出接口。 模塊化開發(fā) 優(yōu)點(diǎn) 模塊化開發(fā)中,通常一個(gè)文件就是一個(gè)模塊,有自己的作用域,只向外暴露特定的變量和函數(shù),并且可以按需加載。 依賴自動(dòng)加載,按需加載。 提高代碼復(fù)用率,方便進(jìn)行代碼的管理,使得代碼管理更加清晰、規(guī)范。 減少了命名沖...
摘要:模塊化編程首先,我想說說模塊化編程這個(gè)概念當(dāng)我不清楚這個(gè)概念的時(shí)候,其實(shí)說什么模塊化編程多好多好都是懵逼的而我一直不覺得有多好,其實(shí)也是因?yàn)槲覐拈_始寫,就一直都在模塊化編程啊我們寫一個(gè)文件然后我們在文件中引入然后調(diào)用方法哈哈這樣已經(jīng)是模塊化 模塊化編程 首先,我想說說模塊化編程這個(gè)概念當(dāng)我不清楚這個(gè)概念的時(shí)候,其實(shí)說什么模塊化編程多好多好都是懵逼的而我一直不覺得有多好,其實(shí)也是因?yàn)槲覐?..
閱讀 2117·2023-04-26 00:41
閱讀 1153·2021-09-24 10:34
閱讀 3578·2021-09-23 11:21
閱讀 4070·2021-09-22 15:06
閱讀 1562·2019-08-30 15:55
閱讀 904·2019-08-30 15:54
閱讀 1833·2019-08-30 15:48
閱讀 555·2019-08-29 13:58