這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)web網(wǎng)頁(yè)模塊化的原因,以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
為康保等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及康保網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站建設(shè)、做網(wǎng)站、康保網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!單個(gè)頁(yè)面中越來(lái)越多的Javascript。
在現(xiàn)代瀏覽器中你可以做越來(lái)越多的功能。
少量的全頁(yè)面刷新,以至于單個(gè)頁(yè)面中有更多的代碼。
正因?yàn)檫@些原因造成越來(lái)越多的代碼鑲嵌在瀏覽器端中。
這樣一個(gè)大的代碼倉(cāng)庫(kù)(code base)急需做出相應(yīng)的管理。正好,模塊化系統(tǒng)提供了這些功能分割你的代碼倉(cāng)庫(kù),把它們分割為一個(gè)個(gè)的模塊。
問(wèn)題
網(wǎng)站逐漸轉(zhuǎn)化為Web apps
代碼復(fù)雜度逐漸提高
組裝變的困難
開(kāi)發(fā)者想要分離的JS文件/模塊
部署時(shí)可以把代碼優(yōu)化成幾個(gè)HTTP請(qǐng)求
解決方案
前端開(kāi)發(fā)者需要這樣的解決方案:一些這類的API #include/import/require有能力加載嵌套的依賴,對(duì)開(kāi)發(fā)者來(lái)說(shuō)易于使用,并且有優(yōu)化工具在后面支持,有助于部署。
腳本載入API
首先梳理出腳本載入API。這里有幾個(gè)選擇:
Dojo: dojo.require("some.module") LABjs: $LAB.script("some/module.js") CommonJS: require("some/module")
所有的都映射到載入 some/path/some/module.js。理想情況下,我們可以選擇CommonJS的語(yǔ)法,因?yàn)樗芸赡軙?huì)變得更加常見(jiàn),而且我們想要重用代碼。
當(dāng)前我們也希望一些語(yǔ)法能夠載入已存在的純文本JavaScript文件,因此開(kāi)發(fā)者不用重寫所有的JavaScript來(lái)從腳本載入中獲益。
但是,我們需要一些能在瀏覽器中更好的工作的事物。CommonJS 的require()是一個(gè)同步調(diào)用,它期望能夠立即返回那個(gè)模塊。不過(guò)這在瀏覽器中工作的不是很好。
異步與同步
下面這個(gè)例子說(shuō)明了瀏覽器的基本問(wèn)題。假設(shè)我們有一個(gè)Employee對(duì)象,我們想要一個(gè)派生自Employee對(duì)象的Manager對(duì)象。獲取該例子,我們可能會(huì)用我們的腳步載入API來(lái)這樣編碼:
var Employee = require("types/Employee");function Manager () { this.reports = []; }//Error if require call is asyncManager.prototype = new Employee();
如上面注釋中所示,如果require()是異步的,這段代碼不會(huì)工作。但是,在瀏覽器中同步載入腳步將會(huì)抹殺性能。那么,怎么辦?
腳本載入:XHR
使用XMLHttpRequest(XHR)載入腳本是很有吸引力的。如果使用XHR,我們就可以觸摸上面的文本,也就是可以通過(guò)正則表達(dá)式來(lái)查找require()調(diào)用,以確保我們載入了這些腳本,然后再用eval()或script元素將文本內(nèi)容傳給使用XHR載入的腳本。
使用eval()來(lái)評(píng)估模塊不太好:
開(kāi)發(fā)者已經(jīng)被告知eval()不好用。
有些環(huán)境不支持eval()。
難以調(diào)試。Firebug和WebKit的檢查器有一個(gè)//@ sourceURL= 約定,用來(lái)給被評(píng)估的文本命名,不過(guò)這個(gè)特性不是所有的瀏覽器都支持。
不同的瀏覽器評(píng)估上下文環(huán)境是不同的。IE中的execScript或許可以做到,但是同時(shí)也意味著更多的移動(dòng)部件。
使用帶文本內(nèi)容的script標(biāo)簽來(lái)設(shè)置為文件文本也不太好:調(diào)試的時(shí)候,你得到的錯(cuò)誤行號(hào)和源文件對(duì)不上號(hào)。
XHR 在跨域請(qǐng)求的時(shí)候還有問(wèn)題。一些瀏覽器現(xiàn)在有跨域XHR的支持,但并不是全部。并且 IE 決定創(chuàng)建一個(gè)不同的API對(duì)象:XDomainRequest來(lái)實(shí)現(xiàn)跨域請(qǐng)求。出現(xiàn)了更多的需要改動(dòng)的地方,更容易出錯(cuò)。特別是,你需要確定不發(fā)送任何不標(biāo)準(zhǔn)的HTTPheader或者還需要另外一個(gè)"預(yù)檢"的請(qǐng)求來(lái)保證這次跨域的請(qǐng)求是被允許的。
Dojo 通過(guò)eval()使用基于XHR的loader,但是,雖然它能用,但是一直是困擾開(kāi)發(fā)者的源頭。Dojo 有一個(gè) xdomain loader但是它需要通過(guò)使用一個(gè)函數(shù)wrapper來(lái)修改require的模塊,所以script src=""標(biāo)簽可以用來(lái)加載模塊了。還有很多邊界情況和變化的地方來(lái)給程序員增加困難。如果我們創(chuàng)建一個(gè)新的腳本加載器,我們可以做的更好。
腳本載入:Web Workers
web worker可能是另一個(gè)加載腳本的方法,但是:它的跨平臺(tái)性不好
它是一個(gè)消息傳遞API,并且該腳本可能要與DOM交互,它只是使用worker獲取腳本的文本,然后將文本回傳給主窗口,再用eval/script來(lái)執(zhí)行腳本。這種方法帶有上面提到的XHR的全部問(wèn)題。
腳本載入:document.write()
document.write()可以用來(lái)載入腳本,它可以從其他的域載入腳本并且映射了瀏覽器通常是如何使用腳本的,因此它可以用來(lái)進(jìn)行簡(jiǎn)單的調(diào)試。但是,在異步VS同步的例子中,我們不能直接執(zhí)行腳本。理想情況下,在執(zhí)行腳本前我們能夠通過(guò)require()知道相關(guān)依賴項(xiàng),并且確保這些依賴項(xiàng)被首先載入。但是我們不能在腳本執(zhí)行前訪問(wèn)它。而且,document.write()在頁(yè)面載入后就不工作了。對(duì)于你的網(wǎng)站,一個(gè)好的方法是在用戶需要進(jìn)行下一步操作時(shí)來(lái)載入腳本。最后,通過(guò)document.write()載入腳本或阻塞頁(yè)面的渲染。要讓你的網(wǎng)站有最佳表現(xiàn),這個(gè)方法是不可取的。
腳本載入:head.appendChild(script)§
我們可以在需要時(shí)創(chuàng)建腳本并將它們添加到頭部:
var head = document.getElementsByTagName('head')[0], script = document.createElement('script'); script.src = url; head.appendChild(script);
上面的腳本片段多了一點(diǎn)東西,不過(guò)那正是基本的思想。這種方法比document.write要好,因?yàn)樗粫?huì)阻塞頁(yè)面的渲染并且在頁(yè)面載入后仍能工作。但是,它仍然有同步VS異步例子的問(wèn)題:理想情況下,在執(zhí)行腳本前我們能夠通過(guò)require()知道相關(guān)依賴項(xiàng),并且確保這些依賴項(xiàng)被首先載入。
函數(shù)封裝
在執(zhí)行我們的腳本前,我們需要知道相關(guān)依賴項(xiàng)并確保已經(jīng)將其載入。做這件事的最好方法是通過(guò)函數(shù)封裝來(lái)構(gòu)造我們的模塊載入API。像這樣:
define( //The name of this module "types/Manager", //The array of dependencies ["types/Employee"], //The function to execute when all dependencies have loaded. The //arguments to this function are the array of dependencies mentioned //above. function (Employee) { function Manager () { this.reports = []; } //This will now work Manager.prototype = new Employee(); //return the Manager constructor function so it can be used by //other modules. return Manager; } );
這是ReguireJS的句法。如果你想載入沒(méi)有定義成模塊的純文本的JavaScript的話,有一種簡(jiǎn)單的句法:
require(["some/script.js"], function() { //This function is called after some/script.js has loaded. });
選擇這種句法是因?yàn)?,它足夠?jiǎn)潔并且允許載入者使用head.appendChild(script)載入類型。出于在瀏覽器中良好工作的需要,它有不同于普通的CommonJS句法。有建議說(shuō)普通的CommonJS句法可以使用head.appendChild(script)的載入類型,如果服務(wù)器進(jìn)程有封裝的函數(shù)可以將模塊轉(zhuǎn)換成傳輸格式的話。
我相信不強(qiáng)制使用一個(gè)運(yùn)行時(shí)服務(wù)器進(jìn)程來(lái)轉(zhuǎn)換代碼是很重要的事:
一是調(diào)試變的很怪異,因?yàn)榉?wù)器在注入封裝函數(shù)時(shí)會(huì)導(dǎo)致源文件的行號(hào)關(guān)閉。
二是需要做更多的工作。前端開(kāi)發(fā)應(yīng)該盡可能的使用靜態(tài)文件。
上述就是小編為大家分享的web網(wǎng)頁(yè)模塊化的原因,如果您也有類似的疑惑,不妨參照上述分析內(nèi)容進(jìn)行理解。如果想了解更多相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享名稱:web網(wǎng)頁(yè)模塊化的原因是什么-創(chuàng)新互聯(lián)
分享路徑:http://aaarwkj.com/article16/cojhgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、外貿(mào)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容