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

Webpack原理與實踐:關(guān)于如何選擇合適的打包工具Rollup和Webpack?

開發(fā) 前端
Rollup是一款ES Modules打包器,它也可以將項目中散落的細(xì)小模塊打包成整塊代碼,從而使得這些劃分的模塊可以更好地運行在瀏覽器或node.js環(huán)境。

[[441993]]

寫在前面

Rollup是一款ES Modules打包器,它也可以將項目中散落的細(xì)小模塊打包成整塊代碼,從而使得這些劃分的模塊可以更好地運行在瀏覽器或node.js環(huán)境。Rollup與webpack的作用非常類似,但是小巧的多,誕生的初衷就是希望能夠提供一個高效地ES Modules打包器,充分利用ES Modules的各項特性。

Rollup的使用

Rollup 對代碼模塊使用新的標(biāo)準(zhǔn)化格式,這些標(biāo)準(zhǔn)都包含在 JavaScript 的 ES6 版本中,而不是以前的特殊解決方案,如 CommonJS 和 AMD。ES6 模塊可以使你自由、無縫地使用你最喜愛的 library 中那些最有用獨立函數(shù),而你的項目不必攜帶其他未使用的代碼。ES6 模塊最終還是要由瀏覽器原生實現(xiàn),但當(dāng)前 Rollup 可以使你提前體驗。

首先當(dāng)然是需要執(zhí)行安裝命令進(jìn)行安裝rollup,接著就和webpack一樣需要配置相關(guān)的config文件。我們可以配置不同的配置文件直接用cli進(jìn)行打包,但是如果添加更多地選項,這種命令行的方式就變得很麻煩。為此我們需要創(chuàng)建配置文件來囊括所需的選項,配置文件以rollup.config.js形式命名,比cli更加靈活。

  1. $ npm i rollup -D 

我們看到其實rollup配置和webpack大同小異,想要更詳細(xì)的配置項信息可以異步rollup官網(wǎng)。

  1. //src/helloWorld.js 
  2. export default function sayHello(){ 
  3.   console.log("nihao"); 
  4.  
  5. //src/index.js 
  6. import sayHello from "./helloWorld" 
  7. sayHello() 
  8.  
  9. //rollup.config.js 
  10. export default { 
  11.   input:"src/index.js",//打包入口 
  12.   output:{//文件輸出配置 
  13.     file:"dist/bundle.cjs.js",//打包后生成的文件位置和文件名 
  14.     format:"cjs",//文件的輸出格式,遵循cjs規(guī)范,這也是官方模塊化規(guī)范 
  15.     name:"bundleName"//包的全局變量名 
  16.   } 

我們在package.json文件中配置的打包命令是"build":"rollup -c",我們在執(zhí)行打包命令npm run build后,看到生成的文件dist/bundle.cjs.js中的代碼是非常簡潔清爽的,可讀性非常強。

  1. //dist/bundle.cjs.js 
  2. 'use strict'
  3.  
  4. function sayHello(){ 
  5.   console.log("nihao"); 
  6.  
  7. sayHello(); 

接下來,我們就詳細(xì)談?wù)剅ollup的相關(guān)配置問題,我們知道rollup默認(rèn)采用的是ESM規(guī)范,但是如果你想使用CommonJS規(guī)范,你可以使用.cjs后綴進(jìn)行區(qū)分:

  1. //rollup.config.cjs 
  2. module.export = { 
  3.   input:"src/index.js"
  4.   output:{ 
  5.     file:"dist/bundle.cjs.js"
  6.     format:"cjs" 
  7.   } 

前面我們已經(jīng)創(chuàng)建了一個簡單的打包配置文件,但是當(dāng)你需要創(chuàng)建更加復(fù)雜的bundles時,你將需要更大的彈性,比如:通過npm安裝導(dǎo)入模塊、通過babel編譯代碼,使用json配置文件等等。對此,我們可以使用plugins插件,通過在捆綁過程的關(guān)鍵點來改變rollup的行為。比如,我們可以使用@rollup/plugin-json插件來允許導(dǎo)入JSON文件,使用命令行npm install --save-dev @rollup/plugin-json安裝。

  1. // src/main.js 
  2. import {version} from "../package.json"
  3.  
  4. export default function(){ 
  5.   console.log('version ' + version); 
  6.  
  7. // rollup.config.js 
  8. import json from '@rollup/plugin-json'
  9.  
  10. export default { 
  11.   input: 'src/main.js'
  12.   output: { 
  13.     file: 'bundle.js'
  14.     format: 'cjs' 
  15.   }, 
  16.   plugins: [json()] 
  17. }; 

這樣,執(zhí)行npm run build命令進(jìn)行打包,生成的文件是:

  1. 'use strict'
  2.  
  3. var version = '1.0.0'
  4.  
  5. function main() { 
  6.   console.log('version ' + version); 
  7.  
  8. module.exports = main; 

當(dāng)然,一些特殊的插件依賴于一些輸出,有關(guān)特定于輸出的插件可以做什么的技術(shù)細(xì)節(jié),請參閱插件鉤子。如果一個不兼容的插件被用作特定于輸出的插件,那么 Rollup 會發(fā)出警告。

為了實踐那些依賴于輸出的插件,我們基于前面簡單的項目打包進(jìn)行相關(guān)的配置,先執(zhí)行命令行npm install --save-dev rollup-plugin-terser,

  1. // rollup.config.js 
  2. import json from '@rollup/plugin-json'
  3. import { terser } from 'rollup-plugin-terser'
  4.  
  5. export default { 
  6.   input: 'src/main.js'
  7.   output: [ 
  8.     { 
  9.       file: 'bundle.js'
  10.       format: 'cjs' 
  11.     }, 
  12.     { 
  13.       file: 'bundle.min.js'
  14.       format: 'iife'
  15.       name'version'
  16.       plugins: [terser()] 
  17.     } 
  18.   ], 
  19.   plugins: [json()] 
  20. }; 

此時打包得到:

  1. var version = (function () { 
  2.   'use strict'
  3.   var n = '1.0.0'
  4.   return function () { 
  5.     console.log('version ' + n); 
  6.   }; 
  7. })(); 

前面我們看到可以將多個文件的代碼打包成一個文件,那么當(dāng)項目比較大的時候就需要對代碼進(jìn)行分割。對于代碼分割,有時候 Rollup 會自動將代碼分割成塊,比如動態(tài)加載或多個入口點,還有一種方法可以通過 output.manualChunks 選項顯式告訴 Rollup 哪些模塊要分割成單獨的塊。

  1. // src/main.js 
  2. export default function () { 
  3.   import('./foo.js').then(({ default: foo }) => console.log(foo)); 

Rollup將會使用動態(tài)導(dǎo)入去創(chuàng)建一個分割的chunk文件,只在需要的時候進(jìn)行加載。為了rollup能夠知道哪里是第二個chunk塊,可以通過設(shè)置--file設(shè)定規(guī)范,通過--dir創(chuàng)建導(dǎo)出目錄。

  1. rollup src/main.js -f cjs -d dist 

接下來將會創(chuàng)建一個包含兩個文件main.js和chunk-[hash].js的目錄dist,此處的[hash]是一個hash字符串。你可以設(shè)置你自己想要的文件命令模式,通過 output.chunkFileNames和output.entryFileNames 進(jìn)行配置。

  1. //→ main.js: 
  2. 'use strict'
  3.  
  4. function main() { 
  5.   Promise.resolve(require('./chunk-b8774ea3.js')).then(({ default: foo }) => console.log(foo)); 
  6.  
  7. module.exports = main; 
  8.  
  9. //→ chunk-b8774ea3.js: 
  10. ('use strict'); 
  11.  
  12. var foo = 'hello world!'
  13.  
  14. exports.default = foo; 

Rollup的優(yōu)勢是:

  • 輸出結(jié)果更加扁平,執(zhí)行效率更高
  • 自動移除未引用代碼
  • 打包結(jié)果依然完全可讀

Rollup的缺點是:

  • 加載非ESM的第三方模塊比較復(fù)雜
  • 因為模塊最終會都被打包到全局中,所以無法實現(xiàn)HMR
  • 瀏覽器環(huán)境中,代碼拆分功能必須使用Require.js這樣的AMD庫

寫在最后

對于Webpack大而全,Rollup小而美,我的選擇基本原則是應(yīng)用開發(fā)優(yōu)先webpack,類庫或框架開發(fā)使用Rollup。這是因為在開發(fā)js庫時,webpack的繁瑣和打包后的文件體積太大,而rollup就是針對js庫和框架開發(fā)的,它只是生成代碼將我們的代碼轉(zhuǎn)為目標(biāo)js。如果你想了解更多關(guān)于rollup的相關(guān)知識,可以閱讀(官方文檔)。

 

責(zé)任編輯:姜華 來源: 前端萬有引力
相關(guān)推薦

2021-12-24 08:01:44

Webpack優(yōu)化打包

2021-12-16 22:02:28

webpack原理模塊化

2021-12-20 00:03:38

Webpack運行機制

2021-12-15 23:42:56

Webpack原理實踐

2018-05-30 15:33:00

打包工具Web

2021-12-19 07:21:48

Webpack 前端插件機制

2017-03-24 10:56:21

Webpack技巧建議

2017-05-02 16:29:11

Webpack技巧建議

2024-05-27 00:00:01

2020-08-05 08:21:41

Webpack

2021-03-09 09:55:02

Vuejs前端代碼

2020-12-31 10:47:03

開發(fā)Vuejs技術(shù)

2022-10-28 08:14:44

rollup打包工具庫?

2021-12-22 22:44:49

Webpack熱替換模塊

2021-06-28 05:59:17

Webpack 前端打包與工程化

2021-12-17 00:02:28

Webpack資源加載

2021-05-11 09:20:38

Webpack工具模塊

2021-05-31 05:36:43

WebpackJavaScript 前端

2022-05-03 20:48:17

Webpackcommonjsesmodule

2022-02-10 14:23:16

WebpackJavaScript
點贊
收藏

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