摘要:模塊化編程首先,我想說(shuō)說(shuō)模塊化編程這個(gè)概念當(dāng)我不清楚這個(gè)概念的時(shí)候,其實(shí)說(shuō)什么模塊化編程多好多好都是懵逼的而我一直不覺(jué)得有多好,其實(shí)也是因?yàn)槲覐拈_(kāi)始寫(xiě),就一直都在模塊化編程啊我們寫(xiě)一個(gè)文件然后我們?cè)谖募幸肴缓笳{(diào)用方法哈哈這樣已經(jīng)是模塊化
模塊化編程
首先,我想說(shuō)說(shuō)模塊化編程這個(gè)概念
當(dāng)我不清楚這個(gè)概念的時(shí)候,其實(shí)說(shuō)什么模塊化編程多好多好都是懵逼的
而我一直不覺(jué)得有多好,其實(shí)也是因?yàn)槲覐拈_(kāi)始寫(xiě)js,就一直都在模塊化編程啊
//我們寫(xiě)一個(gè)文件check.js function check(){ return true; } //然后我們?cè)趆tml文件中引入//然后調(diào)用方法
這樣已經(jīng)是模塊化編程了
其實(shí)我今天要探討的并不是如何模塊化編程
因?yàn)榛蚨嗷蛏傥覀兌际窃谀K化編程
但想要把一個(gè)項(xiàng)目
用模塊化編程的思想去處理
讓它變得易擴(kuò)展易維護(hù)
需要長(zhǎng)期的撲街爬起撲街爬起
今天想講的其實(shí)應(yīng)該是如何更有效的處理劃分引入js文件
CommonJS像上述最原始的模塊化編程引入的方法
我們可以看到會(huì)有多行
但凡是有點(diǎn)追求的程序員,是不會(huì)允許一個(gè)頁(yè)面里面有多行重復(fù)的內(nèi)容的
而且主要引入文件的時(shí)候會(huì)有過(guò)多的全局變量暴露在外
平時(shí)寫(xiě)寫(xiě)小項(xiàng)目 就算有bug 找出原因也是容易的
但項(xiàng)目一大 開(kāi)發(fā)人員一多
就會(huì)出現(xiàn)我放在客廳里的點(diǎn)心被偷吃了一塊,那么怪誰(shuí)呢,誰(shuí)叫你放在客廳里
先舉個(gè)CommonJS 的寫(xiě)法的例子
//先創(chuàng)建一個(gè) check_commonjs.js 的文件 var flag = true; function check(){ return flag; } module.exports = { check: check, } //在我們需要用到的頁(yè)面加載模塊 var module = require("./check_commonjs.js"); if(module.check()){ console.log("哈哈哈"); }
在CommonJS里面,被var定義的,在文件中作為全局存在的,在引入后,都還是私有的。當(dāng)然,設(shè)計(jì)者們不是傻瓜
在定義內(nèi)容前 加入 global 那也還是全局的
CommonJS的用法 在Node里面被應(yīng)用的很溜
然而平時(shí)我們?cè)谧鰓eb開(kāi)發(fā)的時(shí)候并不被前端開(kāi)發(fā)人員所追逐
那是為什么呢?
Node作為服務(wù)端應(yīng)用,加載一個(gè)文件,速度就是真的是可以忽略不計(jì)的
然而瀏覽器作為一個(gè)客戶端,在這個(gè)大框框下面,想要加載完一個(gè)js文件
再執(zhí)行下面的js語(yǔ)句
起碼現(xiàn)在速度真沒(méi)那么快
所以就有了我們常用的AMD和CMD
AMD:異步模塊定義
最常見(jiàn)的應(yīng)用例子就是RequireJS
先舉一個(gè)RequireJS的例子
// 先創(chuàng)建一個(gè) check_amd.js 的文件 define(["check"], function(){ var flag = true; function check(){ return flag; } return { check: check }; }); // 在我們需要用到的頁(yè)面加載模塊 require(["check_amd"], function (check){ if(check.check()){ console.log("哈哈哈"); } });
從代碼的整潔性和可讀性來(lái)講
CommonJS 要好很多
但AMD定義下的RequireJS 解決了上述同步加載文件導(dǎo)致的問(wèn)題
與AMD對(duì)應(yīng)的就有CMD
CMDCMD:通用模塊定義
最常見(jiàn)的應(yīng)用例子就是SeaJS
有些人把RequireJS 與 SeaJS做比較的時(shí)候
會(huì)簡(jiǎn)單的認(rèn)為異步與同步的區(qū)別
這明顯不太對(duì)是不是
加載文件的時(shí)候首先一定是異步的
先舉一個(gè)SeaJS的例子
// 先創(chuàng)建一個(gè) check_cmd.js 的文件 define(function(require, exports, module) { var a = require("a");//這里就不舉例再創(chuàng)建a文件了 function check(){ return a.flag; } exports.check = check; }); // 在我們需要用到的頁(yè)面加載模塊 seajs.use(["check_cmd.js"], function(check){ if(check.check()){ console.log("哈哈哈"); } });
可以看出來(lái)AMD與CMD的本質(zhì)區(qū)別就是
AMD是加載完全部你所需要的文件
CMD是當(dāng)你需要那個(gè)文件的時(shí)候他才加載
兩個(gè)比較下來(lái)就是說(shuō)AMD用戶體驗(yàn)好,因?yàn)闆](méi)有延遲,依賴(lài)模塊提前執(zhí)行了,CMD性能好,因?yàn)橹挥杏脩粜枰臅r(shí)候才執(zhí)行
其實(shí)AMD與CMD的模式比較下來(lái)還是很繁瑣
最喜歡的還是CommonJS的模式
那么如何利用CommonJS來(lái)編寫(xiě)JavaScripts,并沒(méi)有最上述提到的由于瀏覽器加載文件需要時(shí)間,傳統(tǒng)CommonJS模塊在瀏覽器環(huán)境中無(wú)法正常運(yùn)行的問(wèn)題呢
且聽(tīng)下回分解
附上我的訂閱號(hào),歡迎關(guān)注,一起學(xué)前端
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/90842.html
摘要:所有依賴(lài)這個(gè)模塊的語(yǔ)句,都定義在一個(gè)回調(diào)函數(shù)中,等到加載完成之后,這個(gè)回調(diào)函數(shù)才會(huì)運(yùn)行。也采用語(yǔ)句加載模塊,但是不同于,它要求兩個(gè)參數(shù)第一個(gè)參數(shù),是一個(gè)數(shù)組,里面的成員就是要加載的模塊第二個(gè)參數(shù),則是加載成功之后的回調(diào)函數(shù)。 本篇文章來(lái)自對(duì)文章《js模塊化編程之徹底弄懂CommonJS和AMD/CMD!》的總結(jié),大部分摘自文章原話,本人只是為了學(xué)習(xí)方便做的筆記,之后有新的體會(huì)會(huì)及時(shí)補(bǔ)充...
摘要:與在模塊化編程的世界中,有兩個(gè)規(guī)范不得不提,它們分別是和。所有依賴(lài)于某個(gè)模塊的代碼全部移到模塊加載語(yǔ)句的回調(diào)函數(shù)中去。的語(yǔ)句接受兩個(gè)參數(shù)在回調(diào)函數(shù)中,可以通過(guò)變量引用模塊。回調(diào)函數(shù)的返回值就是當(dāng)前對(duì)象的導(dǎo)出值。 JavaScript本身不是一種模塊化語(yǔ)言,設(shè)計(jì)者在創(chuàng)造JavaScript之初應(yīng)該也沒(méi)有想到這么一個(gè)腳本語(yǔ)言的作用領(lǐng)域會(huì)越來(lái)越大。以前一個(gè)頁(yè)面的JS代碼再多也不會(huì)多到哪兒去,...
摘要:我想自己可以嘗試一下寫(xiě)一個(gè)低配版的模塊加載器來(lái)應(yīng)付一下我這個(gè)單頁(yè)網(wǎng)站,當(dāng)然只是大致模仿了主要功能。是這樣處理的模塊依賴(lài),同時(shí)依賴(lài),這種情況下的模塊函數(shù)被調(diào)用時(shí),被傳入的是,所以需要自己在里面手動(dòng)一下。 Contents 前言 回顧RequireJs的基本用法 實(shí)現(xiàn)原理 使用方法 總結(jié) 前言 前段時(shí)間一直想用單頁(yè)開(kāi)發(fā)技術(shù)寫(xiě)一個(gè)自己的個(gè)人網(wǎng)站(使用es2015),寫(xiě)了一部分之后,發(fā)現(xiàn)單...
摘要:在開(kāi)發(fā)大型的項(xiàng)目中,可能會(huì)使用到管理的模塊化工具。說(shuō)道,學(xué)習(xí)過(guò)的同學(xué)會(huì)比較熟悉,是服務(wù)器模塊的規(guī)范,采用了這個(gè)規(guī)范。可能是未來(lái)模塊化解決方案的首選。 本文章記錄本人在學(xué)習(xí) JavaScript 中理解到的一些東西,加深記憶和并且整理記錄下來(lái),方便之后的復(fù)習(xí)。 在開(kāi)發(fā)大型的web項(xiàng)目中,可能會(huì)使用到管理js的模塊化工具。但是在前端輪子漫天飛的時(shí)代。那一款js模塊化工具真正適合我...
摘要:依賴(lài)全部加載完成后,調(diào)用回調(diào)函數(shù)規(guī)范異步加載模塊規(guī)范和很相似,簡(jiǎn)單,并與和的規(guī)范保持了很大的兼容性在規(guī)范中,一個(gè)模塊就是一個(gè)文件。 拋出問(wèn)題: 在開(kāi)發(fā)中在導(dǎo)入模塊時(shí)經(jīng)常使用require和import; 導(dǎo)出模塊時(shí)使用module.exports/exports或者export/export default; 有時(shí)候?yàn)榱艘靡粋€(gè)模塊會(huì)使用require奇怪的是也可以使用import?...
閱讀 3403·2021-11-24 09:38
閱讀 3189·2021-11-22 09:34
閱讀 2098·2021-09-22 16:03
閱讀 2349·2019-08-29 18:37
閱讀 371·2019-08-29 16:15
閱讀 1761·2019-08-26 13:56
閱讀 853·2019-08-26 12:21
閱讀 2198·2019-08-26 12:15