摘要:前兩天有朋友拿了這樣一段代碼來問我,我想把一段代碼寫成模塊化的樣子,你幫我看看是不是這樣的。的一個好處在與依賴前置,所有被使用到的模塊都會被提前加載好,從而加快運行速度。
前兩天有朋友拿了這樣一段代碼來問我,“我想把一段代碼寫成模塊化的樣子,你幫我看看是不是這樣的。”,代碼大概是這樣的:
(function(global) { var myModules = { name: "xxx", location: "chengdu", intro: function() { return `his name is ${myModules.name} and come from ${myModules.location}` }, } // some other code... if(typeof module === "undefined") global.myModules = myModules else module.exports = myModules })(this)
“可是我這段代碼在全局還是能myModules這個屬性啊?”
我一臉懵,還有這種操作,為什么你的立即執行函數要把this傳進去呢,這樣不久將里面的內容掛在到了window上了嗎,他似懂非懂,我只好說,你可能需要回頭去看看AMD和CMD規范了,我大概能夠理解這其中的緣由,畢竟這段時間前端發展的速度飛快,加上webpack也不需要自己配,包括vue,react,angular在內的框架類庫都有一鍵生成項目的工具,從而只需要使用下import * from "*"和export default {},而這種便利會讓新人不再需要去學習基本原理就能快速上手,畢竟現在都ES2018了呀。
對象形式
最開始的時候,為了減少全局變量,一般會使用一個對象的方式來對所有的變量方法進行一個包裝:
var obj = { a: 1, b: 2, sum: function(val) { return obj.a + obj.b + val }, rest: function(val) { return val - obj.a - obj.b } }
以上代碼似乎解決了全局變量的問題,但是其中的a和b兩個變量還是可能被修改,其中包含的進化有限。
立即執行函數
回過頭來看文章開頭的代碼,姑且不論以上代碼的錯誤之處,稍作修改,這算是最初的一種關于JavaScript模塊化的開端,立即執行函數:
var add = (function(){ var a = 1 var b = 2 function sum(count){ return a + b + count } function rest(count){ return count - a - b } return { rest: rest, sum: sum } })()
這就是一種最簡單的模塊化的方式,利用閉包的特性,設置了兩個只有在被暴露出來的add和reduce方法內部才能訪問到的兩個變量,從而保證了函數的局部變量不可被修改的特性,這次的進化用到了閉包,從而實現了部分有效的目的。
放大模式
其實開頭的代碼更符合另外一種叫做放大模式的方法,不過一般來說不會講window作為放大模式中被傳入的對象
var globalObject = { fn1: function() { // todo... }, // ... } globalObject = (function(obj) { var name = "xxx" var location = "xxx" function sum(val) { /* todo... */ } function rest(val) { /* todo... */ } obj.sum = sum obj.rest = rest return obj })(globalObject)
以這種形式來寫,可以讓全局變量盡量的減少,同時讓一個立即執行函數中的代碼盡量做到精簡。
但是這種放大模式也存在著問題,比如當globalObject內容足夠多的時候,很可能會造成命名重復的情況,并且以上所有的方式都不可以減少script標簽的數量,所以,我們還是會被模塊的加載順序,命名空間沖突等問題所困擾,這時候,我們應該跨入新時代了。
CMD規范
CMD規范來自阿里的框架seajs,當初確實有挺多人使用,不過現階段已經不再維護了,我也不會,就暫時不說了,只列出來。
commonjs
同時,從2009年開始,JavaScript就不再只是一種瀏覽器端的腳本語言了,nodejs的出現讓使用js開發服務端變成了可能,隨著node出現的東西還有一個叫做commonjs的規范,在這個規范中,每個文件都是一個模塊,有著自己的作用域。
譬如,如下代碼
// 文件a.js var a = 1 // 文件b.js console.log(a) // a is not defined.
在這樣的特性下,a.js和b.js都有著自己獨有的作用域,要在b中對a進行訪問,就需要一種加載機制,一般來說,有兩種方法能夠做到:
方法1
// 文件a.js global.a = 1 // 文件b.js console.log(a) // 1
這種方法掛載在global上,當然是不可取的。
方法2
// 文件a.js exports.a = 1 // 文件b.js var moduleA = require("./a") console.log(moduleA.a)
AMD規范
requirejs的出現讓script標簽的減少變成了可能,在requirejs的時代,我們一般會使用jQuery,underscore這類的類庫,如果按照往常的樣子我們會將代碼寫成下面這副模樣:
這樣的代碼乍一看似乎沒什么問題,但是當一個項目的代碼量上了一個量級,一切就變得不是這么回事兒了,你會被困在加載順序,加載時間的問題上,這也就是requirejs能夠出現的原因了。
在requirejs中,你可以如此改寫以上代碼:
// `index.js` require(["js/lib/jquery.min", "js/lib/underscore.min", "js/app/app"], function($, _, app) { /* todo... */ }) // `app.js` define(["js/lib/jquery.min", "js/lib/underscore.min"], function($, _) { /* todo... */ })
這里當然顯得更加優雅了,在requirejs的推廣過程中,AMD規范也就應運而生了,那么,requirejs或者說AMD規范到底解決了什么樣的問題呢,主要有幾點:
AMD是“異步模塊定義”的縮寫,也就是說,其中內容是異步加載的,從而讓頁面不被js的加載阻塞,最大程度上的避免了頁面假死等情況的產生。
AMD的一個好處在與依賴前置,所有被使用到的模塊都會被提前加載好,從而加快運行速度。
那么,commonjs規范和AMD規范有什么區別呢
運行環境不同,commonjs規范只能運行在node端,而AMD規范則被用到瀏覽器端
由于運行環境的不同,二者的加載機制也不同,commonjs中的require是同步執行的,而AMD中則是異步的。
ES2015模塊化
在ES2015中,可以使用export, export default, import import * as 等操作符來作模塊化的功能,但是這個規范現在尚未被任何瀏覽器加入規范中,我目前的Chrome版本為63.0.3239.132,也無法原生支持,不過現階段我們幾乎都用上了這個規范,這一切都只能歸功于babel,webpack和rollup等新工具的出現,既然如此,那就擁抱未來吧,不過有一點,需要在了解原理的前提下,不然,倘若有一天,真的需要我們來封裝一個小小的模塊的時候,沒有了那些工具,我們該從何下手呢。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92746.html
摘要:反正在阿里巴巴,很多的運維人員都說了,我們每年的工作中有一項不用寫的工作就是搬遷。未來我們確實相信阿里巴巴,可能在未來搬遷會相對更少一點,我們認為不能讓搬遷成為阿里巴巴運維團隊的核心競爭力。以上,正是阿里巴巴的運維團隊所覆蓋的五個領域。 隨著大數據、機器學習和 AI 技術的飛速發展,智能化運維成為運維的熱點領域。Gartner 的報告宣稱,到 2020 年,將近 50% 的企業將會在他們的業...
摘要:程序人生從黑客到創業,他說技術創業該這么做知道創宇,安全焦點民間白帽黑客組織核心成員,分享他創業感悟和踩過的那些坑。技術周刊由小組出品,匯聚一周好文章,周刊原文。 業界動態 他們寫的代碼能上天!NASA的10條安全編碼準則大公開 NASA的10條代碼編寫規范準則 本期推薦 Node.js 中遇到含空格 URL 的神奇Bug——小范圍深入 HTTP 協議 本文闡述了博主遇到含空格 URL...
摘要:前端每周清單第期與模式變遷與優化界面生成作者王下邀月熊編輯徐川前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點分為新聞熱點開發教程工程實踐深度閱讀開源項目巔峰人生等欄目。 showImg(https://segmentfault.com/img/remote/1460000013279448); 前端每周清單第 51 期: React Context A...
摘要:精讀前端可以從多個角度理解,比如規范框架語言社區場景以及整條研發鏈路。同是前端未來展望,不同的文章側重的格局不同,兩個標題相同的文章內容可能大相徑庭。作為使用者,現在和未來的主流可能都是微軟系,畢竟微軟在操作系統方面人才儲備和經驗積累很多。 1. 引言 前端展望的文章越來越不好寫了,隨著前端發展的深入,需要擁有非常寬廣的視野與格局才能看清前端的未來。 筆者根據自身經驗,結合下面幾篇文章...
閱讀 2577·2023-04-25 17:33
閱讀 654·2021-11-23 09:51
閱讀 2961·2021-07-30 15:32
閱讀 1408·2019-08-29 18:40
閱讀 1952·2019-08-28 18:19
閱讀 1473·2019-08-26 13:48
閱讀 2248·2019-08-23 16:48
閱讀 2281·2019-08-23 15:56