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