JavaScript模塊化開(kāi)發(fā)流程分步講解
接觸了Vue模塊化開(kāi)發(fā)才發(fā)現(xiàn)JavaScript組件化開(kāi)發(fā)的演變一直在繼續(xù),以前也沒(méi)有特別在意這一塊內(nèi)容,寫(xiě)著代碼能調(diào)試運(yùn)行不報(bào)錯(cuò)就可以了,主要編程語(yǔ)言標(biāo)準(zhǔn)就是ECMAScript5和ECMAScript6(2015年發(fā)布),使用ECMAScript6規(guī)范編寫(xiě)的程序需要轉(zhuǎn)譯器將代碼編譯為ECMAScript5才能為瀏覽器支持。作為前度開(kāi)發(fā)者了解這些以及ECMAScript5和ECMAScript6的寫(xiě)法區(qū)別即可。
比如,ECMAScript5的寫(xiě)法:
var MyModuleName = { Property1: "", Property2: "", Config: { SetName1:"", SetName2:"" }, Method1: function() {}, Method2: function() {} };
對(duì)應(yīng)的ECMAScript6的寫(xiě)法:
export const MyModuleName = { Property1: "", Property2: "", Config: { SetName1: "", SetName2: "" }, myMethod1() {}, myMethod2() {} };
其實(shí)學(xué)習(xí)前端開(kāi)發(fā)僅僅知道大概是不行的,現(xiàn)在把這一塊的內(nèi)容詳細(xì)梳理一下。
1、使用傳統(tǒng)的全局命名空間
這樣情況下的缺點(diǎn)顯而易見(jiàn):
⑴全局變量無(wú)法控制是否沖突;
⑵成員函數(shù)之間看不出直接關(guān)系。
示例代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>最原始的模式</title> </head> <body> <div id="view"></div> <script> var a=1,b=2; const viewId=document.getElementById('view'); const contentId=document.createElement('div'); contentId.innerHTML="a+b="+add(a,b); viewId.appendChild(contentId); function add(a,b){ return a+b; } function subtract(a,b){ return a-b; } </script> </body> </html>
可以出正確結(jié)果,如果進(jìn)行所謂的模塊化開(kāi)發(fā),就是將代碼不同文件化來(lái)進(jìn)行。
主文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>最原始的模式</title> </head> <body> <div id="view"></div> <script> var a=1,b=2; </script> <script src="module2.js"></script> <script src="module1.js"></script> </body> </html>
module1.js代碼:
const viewId=document.getElementById('view'); const contentId=document.createElement('div'); contentId.innerHTML="a+b="+add(a,b); viewId.appendChild(contentId);
module2.js代碼:
var add=function(a,b){ return a+b; } var subtract=function(a,b){ return a-b; }
但是這導(dǎo)致可能因?yàn)槲募腠樞蚨霈F(xiàn)運(yùn)行錯(cuò)誤,如果文件多了,依賴(lài)不容易檢查,那么糾錯(cuò)就是一件讓人頭疼的事情了。
2、使用對(duì)象的寫(xiě)法
缺點(diǎn):
⑴暴露所有模塊成員;
⑵內(nèi)部狀態(tài)可以被外部改寫(xiě);
⑶多文件化后依賴(lài)關(guān)系不好處理。
示例代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>使用對(duì)象寫(xiě)法</title> </head> <body> <div id="view"></div> <script> var a=1,b=2; var MyUtils=new Object({ Property1: "as", add:function(a,b){ return a+b; }, subtract:function(a,b){ return a-b; } }); const viewId=document.getElementById('view'); const contentId=document.createElement('div'); var result=MyUtils.add(a,b); contentId.innerHTML="a+b="+result; viewId.appendChild(contentId); </script> </body> </html>
3、使用命名空間的寫(xiě)法
前端開(kāi)發(fā)者基本上都使用過(guò)JQuery.js來(lái)進(jìn)行前端開(kāi)發(fā),JQuery.js主要使用率命名空間模式來(lái)組織代碼,定義了一個(gè)全局變量 $ 或 jQuery,該變量是一個(gè)對(duì)象,包含了所有 jQuery 提供的功能。當(dāng)使用 $或者jQuery 時(shí),實(shí)際上就是訪問(wèn)這個(gè)全局變量。而 jQuery 庫(kù)中所有的方法和屬性都是在這個(gè)全局變量上定義的。
缺點(diǎn):
⑴無(wú)法解決相互依賴(lài)問(wèn)題特別是多文件化后;
⑵代碼組織形式逐漸復(fù)雜化;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>使用命名空間的寫(xiě)法</title> </head> <body> <div id="view"></div> <script> var a=1,b=2; var MyApp = { UI: { //定義UI操作內(nèi)容 }, Data: { //定義Data內(nèi)容 }, Service: { //定義Service的內(nèi)容 }, Utils: { //定義工具類(lèi)內(nèi)容 add:function(a,b){ return a+b; }, subtract:function(a,b){ return a-b; } } }; const viewId=document.getElementById('view'); const contentId=document.createElement('div'); var result=MyApp.Utils.add(a,b); contentId.innerHTML="a+b="+result; viewId.appendChild(contentId); </script> </body> </html>
最開(kāi)始常見(jiàn)的寫(xiě)法也可以是這樣的:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>使用IIFE(立即執(zhí)行函數(shù))寫(xiě)法</title> </head> <body> <div id="view"></div> <script> var a=1,b=2; //定義全局變量 var MyUtils={}; //定義子命名空間 var MyUtils.UI={}; var MyUtils.Data={}; var MyUtils.Service={}; var MyUtils.Utils={}; //在子命名空間中定義內(nèi)容 var MyUtils.Utils.add=function(a,b){ return a+b; }; const viewId=document.getElementById('view'); const contentId=document.createElement('div'); var result=MyUtils.add(a,b); contentId.innerHTML="a+b="+result; viewId.appendChild(contentId); </script> </body> </html>
4、使用IIFE的寫(xiě)法
缺點(diǎn):
⑴外部代碼無(wú)法讀取內(nèi)部的變量;
⑵無(wú)法徹底解決模塊間的相互依賴(lài)問(wèn)題。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>使用IIFE(立即執(zhí)行函數(shù))寫(xiě)法</title> </head> <body> <div id="view"></div> <script> var a=1,b=2; var MyUtils=(function(){ Property1: "as"; var add=function(a,b){ return a+b; }; var subtract=function(a,b){ return a-b; } return { add:add, subtract:subtract } })(); const viewId=document.getElementById('view'); const contentId=document.createElement('div'); var result=MyUtils.add(a,b); contentId.innerHTML="a+b="+result; viewId.appendChild(contentId); //外部代碼無(wú)法讀取內(nèi)部的變量。 </script> </body> </html>
要解決外部訪問(wèn)對(duì)象內(nèi)部數(shù)據(jù),可以對(duì)外暴露方法:
var a=1,b=2; var MyUtils=(function(){ Property1: "as"; var add=function(a,b){ return a+b; }; var subtract=function(a,b){ return a-b; }; var setProperty=function(str){ this.Property1=str; }; return { add:add, subtract:subtract, setProperty } })(); const viewId=document.getElementById('view'); const contentId=document.createElement('div'); var result=MyUtils.add(a,b); contentId.innerHTML="a+b="+result; viewId.appendChild(contentId); MyUtils.setProperty("123"); console.log(MyUtils.Property1);
上面的代碼暴露了setProperty方法,可以操作對(duì)象的內(nèi)部屬性值。
遵循IIFE(立即執(zhí)行函數(shù))規(guī)范很好地使用了閉包的特點(diǎn),可以進(jìn)行多模塊的開(kāi)發(fā):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>使用IIFE(立即執(zhí)行函數(shù))寫(xiě)法</title> </head> <body> <div id="view"></div> <script> var a=1,b=2; var MyUtils1=(function(){ Property1: "as"; var add=function(a,b){ return a+b; }; var setProperty=function(str){ this.Property1=str; }; return { add:add, setProperty } })(); var MyUtils2=(function(){ Property1: "untils2"; var add=function(a,b){ return a+b; }; var setProperty=function(str){ this.Property1=str; }; return { add:add, setProperty } })(); //"繼承"前面兩個(gè)模塊 var MyUtils=(function(MyUtils1,MyUtils2){ MyProperty: "MyUntils"; function add(a,b){ return MyUtils1.add(a,b); }; function subtract(a,b){ return MyUtils1.subtract(a,b); }; return { add:add, subtract:subtract } })(MyUtils1,MyUtils2); const viewId=document.getElementById('view'); const contentId=document.createElement('div'); var result=MyUtils.add(a,b); contentId.innerHTML="a+b="+result; viewId.appendChild(contentId); </script> </body> </html>
但是最終的模塊嚴(yán)格意義上并不是真正地繼承前面的兩個(gè)模塊,只是依賴(lài)這兩個(gè)模塊的注入。
本想在這一篇把所有的演變模式總結(jié)完畢,可是后續(xù)的內(nèi)容太多了并且后面的內(nèi)容才是重點(diǎn),寫(xiě)到這里文字已經(jīng)有點(diǎn)多了,還是先寫(xiě)到這里。
到此這篇關(guān)于JavaScript模塊化開(kāi)發(fā)流程分步講解的文章就介紹到這了,更多相關(guān)JS模塊化開(kāi)發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
火狐和ie下獲取javascript 獲取event的方法(推薦)
下面小編就為大家?guī)?lái)一篇火狐和ie下獲取javascript 獲取event的方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11js實(shí)現(xiàn)addClass,removeClass,hasClass的函數(shù)代碼
js實(shí)現(xiàn)addClass,removeClass,hasClass的函數(shù)代碼,需要的朋友可以參考下。2011-07-07arcgis for js柵格圖層疊加(Raster Layer)問(wèn)題
這篇文章主要介紹了arcgis for js柵格圖層疊加(Raster Layer)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11JavaScript 自動(dòng)完成腳本整理(33個(gè))
所謂的提升用戶體驗(yàn),其實(shí)就是把所有用戶視為懶鬼,比如JavaScript自動(dòng)完成(Autocomplete)腳本, 常用于表單,用戶只需輸入一兩個(gè)字母,就為你擴(kuò)展、聯(lián)想、匹配和供君選擇,2009-10-10你不知道的 TypeScript 高級(jí)類(lèi)型(小結(jié))
這篇文章主要介紹了你不知道的 TypeScript 高級(jí)類(lèi)型(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08layer實(shí)現(xiàn)登錄彈框,登錄成功后關(guān)閉彈框并調(diào)用父窗口的例子
今天小編就為大家分享一篇layer實(shí)現(xiàn)登錄彈框,登錄成功后關(guān)閉彈框并調(diào)用父窗口的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09