国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - Webpack原理與實踐:關于如何選擇合適的打包工具Rollup和Webpack?

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

2021-12-26 22:15前端萬有引力一川 編程技術

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

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

寫在前面

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

Rollup的使用

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

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

  1. $ npm i rollup -D

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

  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. //rollup.config.js
  9. export default {
  10. input:"src/index.js",//打包入口
  11. output:{//文件輸出配置
  12. file:"dist/bundle.cjs.js",//打包后生成的文件位置和文件名
  13. format:"cjs",//文件的輸出格式,遵循cjs規范,這也是官方模塊化規范
  14. name:"bundleName"//包的全局變量名
  15. }
  16. }

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

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

接下來,我們就詳細談談rollup的相關配置問題,我們知道rollup默認采用的是ESM規范,但是如果你想使用CommonJS規范,你可以使用.cjs后綴進行區分:

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

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

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

這樣,執行npm run build命令進行打包,生成的文件是:

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

當然,一些特殊的插件依賴于一些輸出,有關特定于輸出的插件可以做什么的技術細節,請參閱插件鉤子。如果一個不兼容的插件被用作特定于輸出的插件,那么 Rollup 會發出警告。

為了實踐那些依賴于輸出的插件,我們基于前面簡單的項目打包進行相關的配置,先執行命令行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. export default {
  5. input: 'src/main.js',
  6. output: [
  7. {
  8. file: 'bundle.js',
  9. format: 'cjs'
  10. },
  11. {
  12. file: 'bundle.min.js',
  13. format: 'iife',
  14. name: 'version',
  15. plugins: [terser()]
  16. }
  17. ],
  18. plugins: [json()]
  19. };

此時打包得到:

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

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

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

Rollup將會使用動態導入去創建一個分割的chunk文件,只在需要的時候進行加載。為了rollup能夠知道哪里是第二個chunk塊,可以通過設置--file設定規范,通過--dir創建導出目錄。

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

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

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

Rollup的優勢是:

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

Rollup的缺點是:

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

寫在最后

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

原文鏈接:https://mp.weixin.qq.com/s/-EGC59TKIwsNLwvBN2MXiw

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 快色视频在线观看 | 国内成人免费视频 | 色综合社区 | 午夜免费福利视频 | 欧美日韩国产一级片 | 亚洲国产视频一区 | 成人爱情偷拍视频在线观看 | 国产激情在线 | 中文在线一区二区 | 中文字字幕一区二区三区四区五区 | 亚洲欧美日韩一区二区 | theporn国产在线精品 | 精品伊人久久 | 亚洲日韩成人 | 国产视频一区在线 | 成人午夜网 | 亚洲成人一区二区三区 | 亚洲国产精品一区久久av篠田 | 成人在线视频观看 | 日韩在线电影 | 国产在线一区二区 | 国产91看片 | 亚洲国产成人精品久久 | 91视频.com | 国产成人精品一区二 | 成人h视频在线观看 | 日韩午夜电影 | 久久久久久人 | 青青av | 中文字幕天堂 | 中国一级特黄毛片大片 | 网站黄色在线观看免费 | 国产激情偷乱视频一区二区三区 | 久久亚洲国产精品日日av夜夜 | 99精品视频网 | 日韩在线播放一区二区三区 | 久久青| 亚洲高清在线观看 | 国产午夜精品久久 | 黄色视屏免费在线观看 | 久久久亚洲国产美女国产盗摄 |