自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:與Webpack類(lèi)似的工具還有哪些?區(qū)別?

開(kāi)發(fā) 前端
在前端領(lǐng)域中,并非只有webpack這一款優(yōu)秀的模塊打包工具,還有其他類(lèi)似的工具,例如Rollup、Parcel、snowpack,以及最近風(fēng)頭無(wú)兩的Vite。

[[398735]]

本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題」,作者灰灰 。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。

 

一、模塊化工具

模塊化是一種處理復(fù)雜系統(tǒng)分解為更好的可管理模塊的方式

可以用來(lái)分割,組織和打包應(yīng)用。每個(gè)模塊完成一個(gè)特定的子功能,所有的模塊按某種方法組裝起來(lái),成為一個(gè)整體(bundle)

在前端領(lǐng)域中,并非只有webpack這一款優(yōu)秀的模塊打包工具,還有其他類(lèi)似的工具,例如Rollup、Parcel、snowpack,以及最近風(fēng)頭無(wú)兩的Vite

通過(guò)這些模塊打包工具,能夠提高我們的開(kāi)發(fā)效率,減少開(kāi)發(fā)成本

這里沒(méi)有提及gulp、grunt是因?yàn)樗鼈冎皇嵌x為構(gòu)建工具,不能類(lèi)比

Rollup

Rollup 是一款 ES Modules 打包器,從作用上來(lái)看,Rollup 與 Webpack 非常類(lèi)似。不過(guò)相比于 Webpack,Rollup要小巧的多

現(xiàn)在很多我們熟知的庫(kù)都都使用它進(jìn)行打包,比如:Vue、React和three.js等

舉個(gè)例子:

  1. // ./src/messages.js 
  2. export default { 
  3.   hi: 'Hey Guys, I am zce~' 
  4.  
  5. // ./src/logger.js 
  6. export const log = msg => { 
  7.   console.log('---------- INFO ----------'
  8.   console.log(msg) 
  9.   console.log('--------------------------'
  10.  
  11. export const error = msg => { 
  12.   console.error('---------- ERROR ----------'
  13.   console.error(msg) 
  14.   console.error('---------------------------'
  15.  
  16. // ./src/index.js 
  17. import { log } from './logger' 
  18. import messages from './messages' 
  19. log(messages.hi) 

然后通過(guò)rollup進(jìn)行打包

  1. $ npx rollup ./src/index.js --file ./dist/bundle.js 

打包結(jié)果如下圖

可以看到,代碼非常簡(jiǎn)潔,完成不像webpack那樣存在大量引導(dǎo)代碼和模塊函數(shù)

并且error方法由于沒(méi)有被使用,輸出的結(jié)果中并無(wú)error方法,可以看到,rollup默認(rèn)開(kāi)始Tree-shaking 優(yōu)化輸出結(jié)果

因此,可以看到Rollup的優(yōu)點(diǎn):

  • 代碼效率更簡(jiǎn)潔、效率更高
  • 默認(rèn)支持 Tree-shaking

但缺點(diǎn)也十分明顯,加載其他類(lèi)型的資源文件或者支持導(dǎo)入 CommonJS 模塊,又或是編譯 ES 新特性,這些額外的需求 Rollup需要使用插件去完成

綜合來(lái)看,rollup并不適合開(kāi)發(fā)應(yīng)用使用,因?yàn)樾枰褂玫谌侥K,而目前第三方模塊大多數(shù)使用CommonJs方式導(dǎo)出成員,并且rollup不支持HMR,使開(kāi)發(fā)效率降低

但是在用于打包JavaScript 庫(kù)時(shí),rollup比 webpack 更有優(yōu)勢(shì),因?yàn)槠浯虬鰜?lái)的代碼更小、更快,其存在的缺點(diǎn)可以忽略

Parcel

Parcel ,是一款完全零配置的前端打包器,它提供了 “傻瓜式” 的使用體驗(yàn),只需了解簡(jiǎn)單的命令,就能構(gòu)建前端應(yīng)用程序

Parcel 跟 Webpack 一樣都支持以任意類(lèi)型文件作為打包入口,但建議使用HTML文件作為入口,該HTML文件像平時(shí)一樣正常編寫(xiě)代碼、引用資源。如下所示:

  1. <!-- ./src/index.html --> 
  2. <!DOCTYPE html> 
  3. <html lang="en"
  4. <head> 
  5.   <meta charset="UTF-8"
  6.   <title>Parcel Tutorials</title> 
  7. </head> 
  8. <body> 
  9.   <script src="main.js"></script> 
  10. </body> 
  11. </html> 

 

 

 

 

 

 

 

 

 

 

main.js文件通過(guò)ES Moudle方法導(dǎo)入其他模塊成員

  1. // ./src/main.js 
  2. import { log } from './logger' 
  3. log('hello parcel'
  4. // ./src/logger.js 
  5. export const log = msg => { 
  6.   console.log('---------- INFO ----------'
  7.   console.log(msg) 

運(yùn)行之后,使用命令打包

  1. npx parcel src/index.html 

執(zhí)行命令后,Parcel不僅打包了應(yīng)用,同時(shí)也啟動(dòng)了一個(gè)開(kāi)發(fā)服務(wù)器,跟webpack Dev Server一樣

跟webpack類(lèi)似,也支持模塊熱替換,但用法更簡(jiǎn)單

同時(shí),Parcel有個(gè)十分好用的功能:支持自動(dòng)安裝依賴,像webpack開(kāi)發(fā)階段突然使用安裝某個(gè)第三方依賴,必然會(huì)終止dev server然后安裝再啟動(dòng)。而Parcel則免了這繁瑣的工作流程

同時(shí),Parcel能夠零配置加載其他類(lèi)型的資源文件,無(wú)須像webpack那樣配置對(duì)應(yīng)的loader

打包命令如下:

  1. npx parcel src/index.html 

由于打包過(guò)程是多進(jìn)程同時(shí)工作,構(gòu)建速度會(huì)比Webpack 快,輸出文件也會(huì)被壓縮,并且樣式代碼也會(huì)被單獨(dú)提取到單個(gè)文件中

可以感受到,Parcel給開(kāi)發(fā)者一種很大的自由度,只管去實(shí)現(xiàn)業(yè)務(wù)代碼,其他事情用Parcel解決

Snowpack

Snowpack,是一種閃電般快速的前端構(gòu)建工具,專為現(xiàn)代Web設(shè)計(jì),較復(fù)雜的打包工具(如Webpack或Parcel)的替代方案,利用JavaScript的本機(jī)模塊系統(tǒng),避免不必要的工作并保持流暢的開(kāi)發(fā)體驗(yàn)

開(kāi)發(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í)沒(méi)有任何的時(shí)間浪費(fèi),只需要在瀏覽器中進(jìn)行HMR更新

Vite

vite ,是一種新型前端構(gòu)建工具,能夠顯著提升前端開(kāi)發(fā)體驗(yàn)

它主要由兩部分組成:

  • 一個(gè)開(kāi)發(fā)服務(wù)器,它基于 原生 ES 模塊 提供了豐富的內(nèi)建功能,如速度快到驚人的 [模塊熱更新HMR
  • 一套構(gòu)建指令,它使用 Rollup打包你的代碼,并且它是預(yù)配置的,可以輸出用于生產(chǎn)環(huán)境的優(yōu)化過(guò)的靜態(tài)資源

其作用類(lèi)似webpack+ webpack-dev-server,其特點(diǎn)如下:

  • 快速的冷啟動(dòng)
  • 即時(shí)的模塊熱更新
  • 真正的按需編譯

vite會(huì)直接啟動(dòng)開(kāi)發(fā)服務(wù)器,不需要進(jìn)行打包操作,也就意味著不需要分析模塊的依賴、不需要編譯,因此啟動(dòng)速度非常快

利用現(xiàn)代瀏覽器支持ES Module的特性,當(dāng)瀏覽器請(qǐng)求某個(gè)模塊的時(shí)候,再根據(jù)需要對(duì)模塊的內(nèi)容進(jìn)行編譯,這種方式大大縮短了編譯時(shí)間

原理圖如下所示:

在熱模塊HMR方面,當(dāng)修改一個(gè)模塊的時(shí)候,僅需讓瀏覽器重新請(qǐng)求該模塊即可,無(wú)須像webpack那樣需要把該模塊的相關(guān)依賴模塊全部編譯一次,效率更高

webpack

相比上述的模塊化工具,webpack大而全,很多常用的功能做到開(kāi)箱即用。有兩大最核心的特點(diǎn):「一切皆模塊」和「按需加載」

與其他構(gòu)建工具相比,有如下優(yōu)勢(shì):

  • 智能解析:對(duì) CommonJS 、 AMD 、ES6 的語(yǔ)法做了兼容
  • 萬(wàn)物模塊:對(duì) js、css、圖片等資源文件都支持打包
  • 開(kāi)箱即用:HRM、Tree-shaking等功能
  • 代碼分割:可以將代碼切割成不同的 chunk,實(shí)現(xiàn)按需加載,降低了初始化時(shí)間
  • 插件系統(tǒng),具有強(qiáng)大的 Plugin 接口,具有更好的靈活性和擴(kuò)展性
  • 易于調(diào)試:支持 SourceUrls 和 SourceMaps
  • 快速運(yùn)行:webpack 使用異步 IO 并具有多級(jí)緩存,這使得 webpack 很快且在增量編譯上更加快
  • 生態(tài)環(huán)境好:社區(qū)更豐富,出現(xiàn)的問(wèn)題更容易解決

參考文獻(xiàn)

https://zhuanlan.zhihu.com/p/95684686

https://cn.vitejs.dev/guide/

https://segmentfault.com/a/1190000039370642

 

責(zé)任編輯:武曉燕 來(lái)源: JS每日一題
相關(guān)推薦

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2021-09-30 07:57:13

排序算法面試

2021-07-01 07:51:45

React事件綁定

2023-02-20 08:08:48

限流算法計(jì)數(shù)器算法令牌桶算法

2025-03-07 08:44:47

Typescriptiinterfacetype

2025-03-26 01:25:00

MySQL優(yōu)化事務(wù)

2024-03-07 17:21:12

HotSpotJVMHot Code

2025-03-10 00:00:00

property?attributeHTML

2025-03-10 11:40:00

前端開(kāi)發(fā)HTML

2021-04-30 08:28:15

WebpackLoaderPlugin

2024-02-26 14:07:18

2024-03-12 14:36:44

微服務(wù)HTTPRPC

2024-04-19 00:00:00

計(jì)數(shù)器算法限流算法

2021-07-02 07:06:20

React組件方式

2025-02-21 08:11:48

2022-05-23 08:43:02

BigIntJavaScript內(nèi)置對(duì)象

2024-08-19 09:13:02

2024-02-01 08:08:53

Spring過(guò)濾器類(lèi)型Gateway

2024-06-04 07:38:10

2024-08-16 13:59:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)