前不久有個(gè)網(wǎng)友問我在前端使用requireJs和seajs的問題,我當(dāng)時(shí)問他你們公司以前有沒有自己編寫的javascript庫,或者javascript框架,他的回答是什么都沒有,他只是聽說像requirejs和seajs是新東西新技術(shù),很有價(jià)值所以想用它。
這位網(wǎng)友的問題引起了我對(duì)javascript模塊加載技術(shù)的思考,上篇文章我給出了自己寫的一個(gè)javascript庫的基本結(jié)構(gòu),其實(shí)寫這篇文章的一個(gè)起因就是因?yàn)槲蚁胧褂胷equirejs或者seajs這樣的技術(shù)來重新設(shè)計(jì)我寫javascript庫的基本模型,當(dāng)我深入了解這個(gè)技術(shù)后,我發(fā)現(xiàn)使用模塊加載系統(tǒng)來解決把javascript庫里通用代碼和業(yè)務(wù)代碼解耦的問題,是不正確的,模塊加載系統(tǒng)的作用范圍是解決不同javascript庫之間的依賴問題,而不是幫助你去如何開發(fā)一個(gè)javascript庫。
那么什么是javascript的模塊加載系統(tǒng)呢?
模塊系統(tǒng)主要為了解決不同javascript庫里操作對(duì)象的命名沖突問題以及不同javascript庫之間依賴的問題,模塊加載系統(tǒng)是針對(duì)大型web前端應(yīng)用或者說是巨型的web前端應(yīng)用。
一般巨型的web前端應(yīng)用頁面里,該頁面的功能非常豐富,業(yè)務(wù)非常龐雜,而且隨著時(shí)間推移,頁面的功能經(jīng)常會(huì)發(fā)生變遷,所以導(dǎo)致前端開發(fā)人員經(jīng)常要開發(fā)出針對(duì)新功能的功能模塊,但是實(shí)際業(yè)務(wù)里各個(gè)功能模塊之間的功能還有可能相互滲透,相互依賴的,關(guān)系錯(cuò)綜復(fù)雜,當(dāng)頁面復(fù)雜后,各個(gè)前端庫之間的關(guān)系就出現(xiàn)很難管理和控制的問題,這個(gè)時(shí)候模塊加載系統(tǒng)才會(huì)派上用場(chǎng)。
對(duì)于大多數(shù)程序員而言,能獨(dú)立承擔(dān)這么大web前端應(yīng)用的機(jī)會(huì)并不是太多,而開發(fā)中小型web前端應(yīng)用的機(jī)會(huì)會(huì)多的多,例如企業(yè)級(jí)的web項(xiàng)目,這樣的項(xiàng)目使用到的javascript庫的種類很少,各個(gè)庫的依賴關(guān)系很好控制,是沒有必要引入什么模塊管理系統(tǒng)的必要,就算很多中小型互聯(lián)網(wǎng)公司的網(wǎng)頁,估計(jì)也不會(huì)比企業(yè)級(jí)web應(yīng)用前端那么復(fù)雜,所以它的模塊之間或者說javascript庫之間的關(guān)系很好管理的。其實(shí)像上面這些中小應(yīng)用都是針對(duì)某些或某一個(gè)具體場(chǎng)景進(jìn)行的,因此我個(gè)人覺得面對(duì)這樣的web前端項(xiàng)目我們最后能自己形成一個(gè)獨(dú)立的javascript庫,這個(gè)庫的特點(diǎn)應(yīng)該和jQuery這種類型的庫類似:一個(gè)主庫加上若干個(gè)插件庫的模式,主庫的目的是解決通用性的問題,它應(yīng)該是可以進(jìn)行復(fù)用和遷移的,而插件庫的目的往往和業(yè)務(wù)代碼相關(guān)的,不過為了區(qū)別主庫和插件庫的作用域問題,所以我在庫里加上了命名空間的功能。
Javascript模塊加載技術(shù)和hadoop的技術(shù)有些相同點(diǎn),那就是它們都是針對(duì)超大型系統(tǒng)的技術(shù),它們只有在一定條件下才能發(fā)揮它們的作用,所以這些技術(shù)都是從大型互聯(lián)網(wǎng)公司推出出來,因?yàn)榇笮突ヂ?lián)網(wǎng)公司隨著應(yīng)用變大變復(fù)雜后必須要去解決的問題,當(dāng)你系統(tǒng)還是處于起步階段,這些技術(shù)的運(yùn)用往往要謹(jǐn)慎,我們應(yīng)該找出最簡(jiǎn)單最有效的方法解決我們實(shí)際問題,如果你覺得這個(gè)系統(tǒng)以后會(huì)越來越大,那么你應(yīng)該保留以后使用這些技術(shù)的接口,如果使用太早了,很有可能當(dāng)系統(tǒng)規(guī)模擴(kuò)大后,你重構(gòu)代碼的代價(jià)會(huì)更高。
對(duì)于模塊加載系統(tǒng),它最適合的場(chǎng)景是解決大型web前端應(yīng)用模塊之間的解耦的問題,如果我們只要新寫一個(gè)javascript文件就馬上使用模塊加載技術(shù),這個(gè)不是有點(diǎn)濫用技術(shù)的嫌疑了,我們運(yùn)用某個(gè)技術(shù)之前不應(yīng)該只是考慮它怎么用,如何用,應(yīng)該還要想想使用它有沒有價(jià)值的問題。
最后我想說的是,我覺得中小型web前端應(yīng)用到了生產(chǎn)部署,因?yàn)閖avascript并非最復(fù)雜,所以所有外部javascript文件都打包成一個(gè)javascript外部文件最好,這樣的好處就是減少了http請(qǐng)求個(gè)數(shù),使用模塊加載技術(shù)會(huì)讓你打包文件操作很麻煩,甚至無法做到(像requirejs和seajs的模塊都是以文件為單位的,每個(gè)模塊就是一個(gè)獨(dú)立文件),這和解決減少http目的是相悖的。
聯(lián)系客服