前端模塊化的那些事兒

一丹壕、什么是模塊漫仆?

定義:具有相同屬性和行為的事物的集合

在前端中:將一些屬性比較類似和行為比較類似的內(nèi)容放在同一個js文件里面,把這個js文件稱為模塊

目的:為了每個js文件只關(guān)注與自身有關(guān)的事情,讓每個js文件各行其職

二、什么是模塊化烘苹?CommonJS是什么?AMD和CMD又是什么蝇刀?

①模塊化:指的就是遵守commonjs規(guī)范螟加,解決不同js模塊之間相互調(diào)用問題

②CommonJS:

  1. A.js文件中調(diào)用另一個B.js文件徘溢,一定要在A.js中引入B.js

require("B.js");

  1. 另一個被調(diào)用的js吞琐,也就是B.js一定要對外提供接口。

module.exports=B;
過程如下:

B.js

javascript
var b = "Hello,I'm module B.";
module.exports = b;//暴露一個接口然爆,與b對接站粟。這個接口既可以是函數(shù),也可以是對象曾雕,甚至是數(shù)組奴烙。
A.js

javascript
var _b = require("./B.js");//實際過程中應(yīng)當(dāng)是B.js相對于A.js的路徑,這比使用絕對路徑去獲取要規(guī)范得多
//此時_b獲得了B.js的接口,這個接口指向B.js中的變量b
console.log( _b );//"Hello,I'm module B.";
這就實現(xiàn)了一個簡單的模塊化工作方式切诀,即:

模塊間相互調(diào)用揩环,協(xié)同工作,實現(xiàn)某特定功能幅虑。

④AMD規(guī)范:Async Module Define 異步模塊聲明

⑤CMD規(guī)范:Common Module Define 公共模塊聲明

⑥模塊化的核心價值:模塊化最核心的價值在于解決不同文件之間的分工和調(diào)用問題丰滑,即依賴關(guān)系。

三倒庵、模塊化的一些工具

gulp + browerify
構(gòu)建步驟:

  1. 安裝gulp

npm install gulp --save-dev //要安裝全局還是本地依賴根據(jù)實際情況來

  1. 安裝browserify --save--dev

npm install browserify --save--dev

  1. 安裝文件輸出流工具

npm install vinyl-source-stream --save-dev

  1. 在gulpfile里編寫任務(wù)實現(xiàn)模塊化

gulpfile.js

//基本模塊引入
var gulp = require('gulp');
var brow = require('browerify');
var source = require('vinyl-source-stream');
//任務(wù)編寫
gulp.task('bundle', function() {
//將任務(wù)交付給browserify
//brow讀取入口文件后褒墨,能自動查找相互之間有依賴的關(guān)系的模塊
return brow('./entry.js')
.bundle()//輸出一個文件流變量(gulp的工作機制)
.pipe(source('bundle.js'))//將文件流變量輸出為文件
.pipe(gulp.dest('js'));//將文件最終輸出
}

webpack
參考[webpack的配置及使用][1]

requireJS
模塊聲明規(guī)范:AMD
聲明模塊
參數(shù)1:id 是這個模塊的名稱,它是一個可選參數(shù)擎宝,默認(rèn)為require加載此模塊時指定的名稱郁妈,若定義這個參數(shù),那么這個模塊名應(yīng)當(dāng)為“頂級”的绍申,不允許相對名稱噩咪。
參數(shù)2:數(shù)組,為這個模塊所依賴的其他模塊
匿名函數(shù)參數(shù):為依賴模塊在這個模塊中的接口失晴,它們是一一對應(yīng)的剧腻,因此即便不需要某個模塊的接口,但若是需要它后面模塊的接口涂屁,那也必須給它增加一個用于占位的參數(shù)书在。
define( 'id', [ 'module1', 'module2' ], function( m1, m2 ) {
return {
arg1: m1,
arg2: m2
}
//返回值即是module3的接口
});
使用步驟

  1. 下載requireJS

bower install requirejs//根據(jù)個人習(xí)慣選擇下載方式,只要保證后續(xù)引入的路徑正確

  1. 配置config文件和main.js

config.js
require.config( {
base: '',//引入模塊的起始路徑
//paths對象為要引入的模塊的名稱及路徑拆又,且不需.js后綴儒旬,require默認(rèn)會為文件添加.js后綴
paths: {
'jquery': './jquery-1.11.0'//這就引入了juery作為一個模塊。 PS:jquery自己已經(jīng)實現(xiàn)了AMD帖族,并且'jquery'是一個頂級模塊名栈源。
}
} );
main.js

require(['jquery'], function( $ ) {
$(document).css("background", "#000");//這就實現(xiàn)了引入使用jquery模塊,并用它進行dom操作
});

  1. 在頁面中引入

<script data-main="./main.js" src="./bower-components/requirejs/dist/require.js></script>
//main即是主邏輯入口文件
SeaJS
模塊聲明規(guī)范:CMD
聲明模塊
define( function( require, exports, module ) {
var c = require('./Controller.js');
c();
})
使用步驟

  1. 下載seajs

bower install seajs//這里根據(jù)個人習(xí)慣下載seajs的包竖般,只要引入時路徑正確就行

  1. 配置seajs.config

seajs.config({
base: './', //模塊起始路徑
})
seajs.use('./main');//使用主邏輯入口文件甚垦,相當(dāng)于requirejs中的data-main文件
requireJS和SeaJS都是在前端實現(xiàn)模塊化,相當(dāng)于一個前端的js模塊化加載器涣雕,和webpack不一樣艰亮,webpack是通過nodejs將文件打包的。

四挣郭、模塊化案例

前端mvc架構(gòu)

Vue 組件化&模塊化
React 組件化&模塊化
node.js 每個文件都是模塊

什么是MVC

后端開發(fā)的一種概念
即view( html + js + css + img ) + controller( 控制層 ) + model( 數(shù)據(jù)模型 )

前端演變了一套MVC體系:
veiw( html + css + js )
寫靜態(tài)頁面 css迄埃、js、img及效果
controller( 專注于實現(xiàn)服務(wù)和邏輯控制的層面叫做控制器 )
監(jiān)聽頁面中請求和事件兑障,處理請求和事件侄非;向model請求數(shù)據(jù)蕉汪,得到數(shù)據(jù)后綁定到頁面
model ( 數(shù)據(jù)變量 || ajax從服務(wù)端取回的數(shù)據(jù) )
對外提供一些數(shù)據(jù)

體現(xiàn)了一種分層的概念,讓每個層面只做自己該做的行為逞怨,減少代碼耦合和冗余

為什么使用MVC者疤?

低耦合:

MVC將業(yè)務(wù)分為三層,減少了數(shù)據(jù)與業(yè)務(wù)的耦合性叠赦,增強了各層次功能的獨立性宛渐,使得在需求改變時可能只需要改變其中一層就能完成服務(wù);

復(fù)用性高:

三層業(yè)務(wù)功能分明眯搭,耦合度低窥翩,使各模塊可以獨立完成自身功能,降低了依賴性鳞仙,具有很高的復(fù)用性寇蚊。

利于批量生產(chǎn)和擴展:

復(fù)用性高使得在批量生產(chǎn)的時候可以根據(jù)需求進行模塊的重用,加快了生產(chǎn)效率棍好。并且模塊化使得擴展也非常方便仗岸,模塊只需根據(jù)規(guī)范進行編寫,經(jīng)審核后引入便可以實現(xiàn)擴展借笙。

利于協(xié)作開發(fā):

擴展性強使協(xié)作開發(fā)也變得非常方便扒怖,每個人根據(jù)自己的分工設(shè)計自己的模塊,不與他人沖突业稼,引入時也各行其職盗痒。

推廣普及度高:

由于對協(xié)作開發(fā)的友好,使得MVC模式大受開發(fā)者的歡迎低散,使用這個模式的產(chǎn)品的推廣和普及變得容易得多俯邓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市熔号,隨后出現(xiàn)的幾起案子稽鞭,更是在濱河造成了極大的恐慌,老刑警劉巖引镊,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朦蕴,死亡現(xiàn)場離奇詭異,居然都是意外死亡弟头,警方通過查閱死者的電腦和手機吩抓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亮瓷,“玉大人琴拧,你說我怎么就攤上這事降瞳≈鲋В” “怎么了蚓胸?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長除师。 經(jīng)常有香客問我沛膳,道長,這世上最難降的妖魔是什么汛聚? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任锹安,我火速辦了婚禮,結(jié)果婚禮上倚舀,老公的妹妹穿的比我還像新娘叹哭。我一直安慰自己,他們只是感情好痕貌,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布风罩。 她就那樣靜靜地躺著,像睡著了一般舵稠。 火紅的嫁衣襯著肌膚如雪超升。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天哺徊,我揣著相機與錄音室琢,去河邊找鬼。 笑死落追,一個胖子當(dāng)著我的面吹牛盈滴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轿钠,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼雹熬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谣膳?” 一聲冷哼從身側(cè)響起竿报,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎继谚,沒想到半個月后烈菌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡花履,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年芽世,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诡壁。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡济瓢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妹卿,到底是詐尸還是另有隱情旺矾,我是刑警寧澤蔑鹦,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站箕宙,受9級特大地震影響嚎朽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柬帕,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一哟忍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陷寝,春花似錦锅很、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饶火,卻和暖如春鹏控,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肤寝。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工当辐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲤看。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓缘揪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親义桂。 傳聞我的和親對象是個殘疾皇子找筝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容