性能分析(一)前戲:用`rollup`打包一個`js-sdk`

在開啟這個篇章之前存捺,我決定先開一篇來講一下rollup姥饰,畢竟干活嘛蒲障,前戲要足闷沥。

做一個抉擇萎战,rollup vs webpack

webpack 于 2012 年由 Tobias Koppers 創(chuàng)立,旨在解決現(xiàn)有工具無法解決的難題:構(gòu)建復(fù)雜的單頁應(yīng)用程序(SPA)舆逃。特別是兩個功能對后期產(chǎn)生了很大的影響:

  1. Code-splitting蚂维,通過代碼拆分戳粒,可以將您的應(yīng)用程序拆分為可管理的塊,這些塊可以按需加載虫啥。這意味著您的用戶獲得交互式站點的速度要比等待整個應(yīng)用程序下載和解析的速度快得多蔚约。

  2. Static assets,可以將靜態(tài)資產(chǎn)(例如圖像和 CSS)導(dǎo)入到您的應(yīng)用中涂籽,并僅將其視為依賴關(guān)系圖中的另一個節(jié)點苹祟。

rollup 的創(chuàng)立確實因為另外的原因,利用 ES2015 模塊的巧妙設(shè)計评雌,盡可能高效地構(gòu)建 JavaScript 庫的統(tǒng)一可分發(fā)版本树枫。

讓我們逐個功能看看對比兩者之間的不同

以下內(nèi)容來自 webpack 官網(wǎng): https://webpack.js.org/comparison

功能 webpack rollup
按需加載 Yes No
AMD define Yes rollup-plugin-amd
AMD require Yes No(個人使用發(fā)現(xiàn)是支持)
AMD require 按需加載 Yes No
CommonJS exports Yes commonjs-plugin
CommonJS require Yes commonjs-plugin
CommonJS require.resolve Yes No
Concat in require require("./fi" + "le") Yes No
Debugging support SourceUrl, SourceMaps SourceUrl, SourceMaps
Dependencies 19MB / 127 packages ?MB / 3 packages
ES2015 import/export Yes Yes
Plugins Yes Yes

大概放出來這么多,其他的大家可以去鏈接地址去看看景东。

從這個對比砂轻,我們可以看出,webpack簡直是完勝斤吐,甚至rollup感覺很丟人搔涝,什么都不行,你活在這個世上還有什么意義和措?

存在即合理 —— 黑格爾

讓我們拿出來一行有趣的對比:

功能 webpack rollup
Dependencies 19MB / 127 packages ?MB / 3 packages

19MB庄呈?意味著什么?意味著一個用戶如果以 1m/s 的速度派阱,需要 19s 才能下載完這個 js诬留。很可怕不是嗎?這個時候颁褂,你突然想到故响,我可以壓縮啊,是的颁独,我們可以利用uglify或者Terser進行壓縮彩届,但是,仍然誓酒,我們不可避免的樟蠕,19M 就算利用了壓縮,也僅可以壓縮在 6M 左右靠柑,如果再利用分chunk的形式寨辩,我們可以將主包降低到 2M 左右,但是這仍然是一個可怕的數(shù)字歼冰,空白的項目靡狞,都是這個大小,更何況我們會引入其他的包呢隔嫡?

反之rollup注意到了這點甸怕,所以我們用 rollup 打包的空白項目甘穿,僅有幾 kb。

Use webpack for apps, and Rollup for libraries

沒錯梢杭,webpack確實很強大温兼,但是也是有應(yīng)用范圍的,應(yīng)用是他的立足之地武契,如果是一個 libraries募判,則可以使用rollup

2. 使用并且打包一個js-sdk

首先咒唆,我們定一個需求: 我們要收集用戶的性能數(shù)據(jù)届垫。

打開掘金的推薦頁面https://juejin.im/timeline/recommended,在 chrome 的控制臺我們可以輸入如下代碼钧排,得到數(shù)據(jù)如圖 1 所示:

console.log(performance.getEntries());
掘金推薦頁面

準備數(shù)據(jù)

我們現(xiàn)在的需求是收集這條數(shù)據(jù)之前的數(shù)據(jù)上報到后端進行數(shù)據(jù)分析敦腔。

// lib/PerformanceEntries.js
export default class {
  constructor() {
    this.entries = this._handleEntries();
  }

  _handleEntries() {
    const entries = window.performance.getEntries();
    const fptIndex = entries.findIndex(entry => entry.entryType === 'paint');
    return entries.slice(0, fptIndex);
  }

  getEntries() {
    return this.entries;
  }
}

解下來我們需要把這個數(shù)據(jù)上報上去

import PerformanceEntries from './lib/PerformanceEntries';

(async () => {
  const performanceEntries = new PerformanceEntries();
  const entries = performanceEntries.getEntries();
  try {
    const res = await fetch('https://server.save.data/api/v1/entries', {
      method: 'POST',
      body: JSON.stringify(entries),
    });
    // some code...
  } catch {}
})();

寫一個rollup.config.js

import babel from 'rollup-plugin-babel';
import commonjs from 'rollup-plugin-commonjs';
import resolve from 'rollup-plugin-node-resolve';
import { terser } from 'rollup-plugin-terser';

import { version } from './package.json';

export default {
  input: 'index.js',                              // 入口文件
  output: {
    file: 'dist/performance.{version}.js',        // 打包之后的文件名以及存放位置
    format: 'umd',                                // 以什么模式打包,支持umd,cmd,esm...
    name: 'ihap',                                 // 導(dǎo)出文件的名字
    exports: 'named',
  },
  plugins: {
    babel({
      exclude: ['node_modules'],                  // 忽略 node_modules
      runtimeHelpers: true,                       // 開啟體積優(yōu)化
    }),
    commonjs(),
    resolve({
      mainField: ['jsnext', 'main'],
      browser: true,
    }),
    terser(),
  },
}

babelrc還是不可少

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "esmodules": true
        }
      }
    ]
  ],
  "plugins": [
    "@babel/plugin-external-helpers",
    "@babel/plugin-transform-runtime",
    ["@babel/plugin-proposal-class-properties", { "loose": true }]
  ]
}

執(zhí)行恨溜,看看結(jié)果

代碼截圖

ok,沒有什么問題找前,我們執(zhí)行一下rollup -c

執(zhí)行過程

看一下我們打包之后的文件大小

文件大小

僅有772b糟袁,還是很喜人的。

那么問題來了躺盛,可以用嘛项戴?好的,我們稍微寫一個簡單的node槽惫,然后執(zhí)行一下周叮。

執(zhí)行結(jié)果

看,我們的結(jié)果發(fā)出去了界斜。

本集總結(jié)&下集預(yù)告

如何用rollup打包一個很小的文件仿耽,我們已經(jīng)學(xué)會了,下一張各薇,我們就要針對如何進行性能分析來研究了项贺。好的,大家下次見峭判,我是 ihap 技術(shù)黑洞的肥少开缎,喜歡我的話,記得關(guān)注點贊收藏林螃,愛我的可以微信支持我給我贊賞稗壬尽!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疗认,一起剝皮案震驚了整個濱河市完残,隨后出現(xiàn)的幾起案子伏钠,更是在濱河造成了極大的恐慌,老刑警劉巖坏怪,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贝润,死亡現(xiàn)場離奇詭異,居然都是意外死亡铝宵,警方通過查閱死者的電腦和手機打掘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹏秋,“玉大人尊蚁,你說我怎么就攤上這事÷乱模” “怎么了横朋?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長百拓。 經(jīng)常有香客問我琴锭,道長,這世上最難降的妖魔是什么决帖? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上细睡,老公的妹妹穿的比我還像新娘。我一直安慰自己萌京,他們只是感情好知残,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著父能,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黔酥,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天熄求,我揣著相機與錄音,去河邊找鬼。 笑死藻雪,一個胖子當(dāng)著我的面吹牛蹋偏,可吹牛的內(nèi)容都是我干的威始。 我是一名探鬼主播晋渺,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吗讶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纵寝,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤室奏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體南蹂,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年秃嗜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡锅锨,死狀恐怖叽赊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情必搞,我是刑警寧澤必指,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站恕洲,受9級特大地震影響塔橡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霜第,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一葛家、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泌类,春花似錦癞谒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枢希,卻和暖如春桌吃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苞轿。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工茅诱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搬卒。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓让簿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秀睛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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