掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
模塊化是一種處理復(fù)雜系統(tǒng)分解為更好的可管理模塊的方式

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的鎮(zhèn)寧網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
可以用來分割,組織和打包應(yīng)用。每個(gè)模塊完成一個(gè)特定的子功能,所有的模塊按某種方法組裝起來,成為一個(gè)整體(bundle)
在前端領(lǐng)域中,并非只有webpack這一款優(yōu)秀的模塊打包工具,還有其他類似的工具,例如Rollup、Parcel、snowpack,以及最近風(fēng)頭無兩的Vite
通過這些模塊打包工具,能夠提高我們的開發(fā)效率,減少開發(fā)成本
這里沒有提及gulp、grunt是因?yàn)樗鼈冎皇嵌x為構(gòu)建工具,不能類比
Rollup 是一款 ES Modules 打包器,從作用上來看,Rollup 與 Webpack 非常類似。不過相比于 Webpack,Rollup要小巧的多
現(xiàn)在很多我們熟知的庫都都使用它進(jìn)行打包,比如:Vue、React和three.js等
舉個(gè)例子:
- // ./src/messages.js
- export default {
- hi: 'Hey Guys, I am zce~'
- }
- // ./src/logger.js
- export const log = msg => {
- console.log('---------- INFO ----------')
- console.log(msg)
- console.log('--------------------------')
- }
- export const error = msg => {
- console.error('---------- ERROR ----------')
- console.error(msg)
- console.error('---------------------------')
- }
- // ./src/index.js
- import { log } from './logger'
- import messages from './messages'
- log(messages.hi)
然后通過rollup進(jìn)行打包
- $ npx rollup ./src/index.js --file ./dist/bundle.js
打包結(jié)果如下圖
可以看到,代碼非常簡(jiǎn)潔,完成不像webpack那樣存在大量引導(dǎo)代碼和模塊函數(shù)
并且error方法由于沒有被使用,輸出的結(jié)果中并無error方法,可以看到,rollup默認(rèn)開始Tree-shaking 優(yōu)化輸出結(jié)果
因此,可以看到Rollup的優(yōu)點(diǎn):
但缺點(diǎn)也十分明顯,加載其他類型的資源文件或者支持導(dǎo)入 CommonJS 模塊,又或是編譯 ES 新特性,這些額外的需求 Rollup需要使用插件去完成
綜合來看,rollup并不適合開發(fā)應(yīng)用使用,因?yàn)樾枰褂玫谌侥K,而目前第三方模塊大多數(shù)使用CommonJs方式導(dǎo)出成員,并且rollup不支持HMR,使開發(fā)效率降低
但是在用于打包JavaScript 庫時(shí),rollup比 webpack 更有優(yōu)勢(shì),因?yàn)槠浯虬鰜淼拇a更小、更快,其存在的缺點(diǎn)可以忽略
Parcel ,是一款完全零配置的前端打包器,它提供了 “傻瓜式” 的使用體驗(yàn),只需了解簡(jiǎn)單的命令,就能構(gòu)建前端應(yīng)用程序
Parcel 跟 Webpack 一樣都支持以任意類型文件作為打包入口,但建議使用HTML文件作為入口,該HTML文件像平時(shí)一樣正常編寫代碼、引用資源。如下所示:
Parcel Tutorials
main.js文件通過ES Moudle方法導(dǎo)入其他模塊成員
- // ./src/main.js
- import { log } from './logger'
- log('hello parcel')
- // ./src/logger.js
- export const log = msg => {
- console.log('---------- INFO ----------')
- console.log(msg)
- }
運(yùn)行之后,使用命令打包
- npx parcel src/index.html
執(zhí)行命令后,Parcel不僅打包了應(yīng)用,同時(shí)也啟動(dòng)了一個(gè)開發(fā)服務(wù)器,跟webpack Dev Server一樣
跟webpack類似,也支持模塊熱替換,但用法更簡(jiǎn)單
同時(shí),Parcel有個(gè)十分好用的功能:支持自動(dòng)安裝依賴,像webpack開發(fā)階段突然使用安裝某個(gè)第三方依賴,必然會(huì)終止dev server然后安裝再啟動(dòng)。而Parcel則免了這繁瑣的工作流程
同時(shí),Parcel能夠零配置加載其他類型的資源文件,無須像webpack那樣配置對(duì)應(yīng)的loader
打包命令如下:
- npx parcel src/index.html
由于打包過程是多進(jìn)程同時(shí)工作,構(gòu)建速度會(huì)比Webpack 快,輸出文件也會(huì)被壓縮,并且樣式代碼也會(huì)被單獨(dú)提取到單個(gè)文件中
可以感受到,Parcel給開發(fā)者一種很大的自由度,只管去實(shí)現(xiàn)業(yè)務(wù)代碼,其他事情用Parcel解決
Snowpack,是一種閃電般快速的前端構(gòu)建工具,專為現(xiàn)代Web設(shè)計(jì),較復(fù)雜的打包工具(如Webpack或Parcel)的替代方案,利用JavaScript的本機(jī)模塊系統(tǒng),避免不必要的工作并保持流暢的開發(fā)體驗(yàn)
開發(fā)階段,每次保存單個(gè)文件時(shí),Webpack和Parcel都需要重新構(gòu)建和重新打包應(yīng)用程序的整個(gè)bundle。而Snowpack為你的應(yīng)用程序每個(gè)文件構(gòu)建一次,就可以永久緩存,文件更改時(shí),Snowpack會(huì)重新構(gòu)建該單個(gè)文件
下圖給出webpack與snowpack打包區(qū)別:
在重新構(gòu)建每次變更時(shí)沒有任何的時(shí)間浪費(fèi),只需要在瀏覽器中進(jìn)行HMR更新
vite ,是一種新型前端構(gòu)建工具,能夠顯著提升前端開發(fā)體驗(yàn)
它主要由兩部分組成:
其作用類似webpack+ webpack-dev-server,其特點(diǎn)如下:
vite會(huì)直接啟動(dòng)開發(fā)服務(wù)器,不需要進(jìn)行打包操作,也就意味著不需要分析模塊的依賴、不需要編譯,因此啟動(dòng)速度非???/p>
利用現(xiàn)代瀏覽器支持ES Module的特性,當(dāng)瀏覽器請(qǐng)求某個(gè)模塊的時(shí)候,再根據(jù)需要對(duì)模塊的內(nèi)容進(jìn)行編譯,這種方式大大縮短了編譯時(shí)間
原理圖如下所示:
在熱模塊HMR方面,當(dāng)修改一個(gè)模塊的時(shí)候,僅需讓瀏覽器重新請(qǐng)求該模塊即可,無須像webpack那樣需要把該模塊的相關(guān)依賴模塊全部編譯一次,效率更高
相比上述的模塊化工具,webpack大而全,很多常用的功能做到開箱即用。有兩大最核心的特點(diǎn):「一切皆模塊」和「按需加載」
與其他構(gòu)建工具相比,有如下優(yōu)勢(shì):
參考文獻(xiàn)
https://zhuanlan.zhihu.com/p/95684686
https://cn.vitejs.dev/guide/
https://segmentfault.com/a/1190000039370642

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流