詳解Js模塊化的作用原理和方案
一、模塊化概念
將一個(gè)復(fù)雜的程序依據(jù)一定的規(guī)則(規(guī)范)封裝成幾個(gè)塊(文件), 并進(jìn)行組合在一起;塊的內(nèi)部數(shù)據(jù)與實(shí)現(xiàn)是私有的, 只是向外部暴露一些接口(方法)與外部其它模塊通信。
二、模塊化作用
為什么要用模塊化的JavaScript?
因?yàn)樵趯?shí)際的開發(fā)過程中,經(jīng)常會遇到變量、函數(shù)、對象等名字的沖突,這樣就容易造成沖突,還會造成全局變量被污染;
同時(shí),程序復(fù)雜時(shí)需要寫很多代碼,而且還要引入很多類庫,這樣稍微不注意就容易造成文件依賴混亂;
為了解決上面的的問題,我們才開始使用模塊化的js,所以說模塊化的作用就是:
- 避免全局變量被污染
- 便于代碼編寫和維護(hù)
三、模塊化歷程
1、普通寫法(全局函數(shù)及變量)
其實(shí)只要是不同的函數(shù)或變量放一起就是簡單的模塊,這樣弊端很明顯,就是變量容易被污染;
var name = '卡卡'; function cat1(){ name = '年年'; } function cat2(){ name = '有魚'; }
2、對象封裝
將整個(gè)模塊放在一個(gè)對象里面,外部訪問時(shí)直接調(diào)用對象的屬性或者方法就行
var cat = { name:'卡卡', cat1:function(){ var name = '年年'; console.log(name); }, cat2:function(){ var name = '有魚'; console.log(name); } } cat.name;// 卡卡 cat.cat1();// 年年 cat.cat2();// 有魚
這種方法雖然解決了變量沖突問題,但是容易被外部隨意修改:
cat.name = '樓樓';
3、匿名函數(shù)方式
var cat = (function () { // 匿名函數(shù)的局部變量name var name = '卡卡'; // 匿名函數(shù)的局部函數(shù)cat1 var cat1 = function () { var name = '年年'; console.log(name); }; // 匿名函數(shù)的局部函數(shù)cat2 var cat2 = function () { var name = '有魚'; console.log(name); }; //通過window暴露一個(gè)對外的口,想要被外界訪問,可以放到這里 window.myModule = { cat1:cat1, cat2:cat2, name:name, }; })(); console.log(myModule.name);// name變量放入暴露口內(nèi),可以輸出,結(jié)果為:卡卡 myModule.cat1();// cat1函數(shù)放入暴露口內(nèi),可以輸出,結(jié)果為:年年 myModule.cat2();// cat2函數(shù)放入暴露口內(nèi),可以輸出,結(jié)果為:有魚
如果把變量name移除,此時(shí)再訪問就訪問不了,結(jié)果為undefined,這樣就實(shí)現(xiàn)了變量不被隨意修改的問題,即:
window.myModule = { cat1:cat1, cat2:cat2, }; console.log(myModule.name);// undefined
匿名函數(shù)方式基本上解決了函數(shù)污染及變量隨意被修改問題,這個(gè)也是模塊化規(guī)范的基石!
四、模塊化方案
根據(jù)匿名函數(shù)自調(diào)用的方式,同時(shí)為了增強(qiáng)代碼依賴性,現(xiàn)在大部分JavaScript運(yùn)行環(huán)境都有自己的模塊化規(guī)范;
可以分為:Commonjs、AMD、CMD、ES6 module四大類
1、CommonJS
①在node環(huán)境下使用,不支持瀏覽器環(huán)境
②NodeJS遵循的規(guī)范
③使用require()進(jìn)行引入依賴
④使用exports進(jìn)行暴露模塊
2、AMD
①瀏覽器環(huán)境下的異步加載模塊
②RequireJS遵循的規(guī)范
③依賴于require.js模塊管理工具庫
④AMD 推崇依賴前置
3、CMD
①瀏覽器環(huán)境下,同時(shí)支持異步和同步加載
②SeaJS遵循的規(guī)范
③CMD 推崇依賴就近
4、ES6 module
ES6模塊化語法在編譯時(shí)就能確定模塊的依賴關(guān)系,還能確定好輸入輸出的變量聲明,已經(jīng)不僅僅是模塊規(guī)范,現(xiàn)在已經(jīng)作為JS語言的標(biāo)準(zhǔn)語法使用,有以下特性:
①瀏覽器環(huán)境、服務(wù)器環(huán)境都支持
②編譯時(shí)就能確定模塊的依賴關(guān)系及變量,其他模塊規(guī)范都是在運(yùn)行時(shí)確定的
③export命令用于規(guī)定模塊的對外接口
④import命令用于輸入其他模塊提供的功能
這里補(bǔ)充一點(diǎn):ES5版本的模塊化方案,僅在語言的層面上實(shí)現(xiàn)了模塊化,缺點(diǎn)在于無法直接運(yùn)行在大部分 JavaScript 運(yùn)行環(huán)境下,必須通過構(gòu)建工具轉(zhuǎn)換成標(biāo)準(zhǔn)的 ES5 后才能正常運(yùn)行,這里就需要使用自動化構(gòu)建工具webpack。
以上就是詳解Js模塊化的作用原理和方案的詳細(xì)內(nèi)容,更多關(guān)于Js模塊化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
javascript實(shí)現(xiàn)tab響應(yīng)式切換特效
這篇文章主要為大家介紹了javascript實(shí)現(xiàn)tab響應(yīng)式切換特效,以一個(gè)完整的實(shí)例對tab響應(yīng)式切換特效進(jìn)行詳細(xì)的分析,感興趣的小伙伴們可以參考一下2016-01-01Echarts實(shí)現(xiàn)點(diǎn)擊列表聯(lián)動餅圖的示例代碼
本文主要介紹了Echarts實(shí)現(xiàn)點(diǎn)擊列表聯(lián)動餅圖的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05javascript全局變量封裝模塊實(shí)現(xiàn)代碼
javascript全局變量封裝模塊的應(yīng)用,本文將詳細(xì)介紹,需要了解更多的朋友可以參考下2012-11-11Bootstrap Paginator分頁插件與ajax相結(jié)合實(shí)現(xiàn)動態(tài)無刷新分頁效果
這篇文章主要介紹了Bootstrap Paginator分頁插件與ajax相結(jié)合實(shí)現(xiàn)動態(tài)無刷新分頁效果,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-05-05JavaScript獲取偽元素(Pseudo-Element)屬性的方法技巧
這篇文章主要介紹了JavaScript獲取偽元素(Pseudo-Element)屬性的方法技巧,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-03-03