我已經從事過好多年的SPA開發工作,我發現很多的程序猿都從來不往 bundle.js 文件的體積上動腦筋,這讓我有點懵逼。
“安心洗路,等俺把代碼混淆壓縮后就一切666了”,若是有人這么說,我會翻白眼。
其實當我們壓縮 bundle.js 的時候,我們可能會憑空折騰出一個龐大的應用,導致其加載時間抑或在移動端的連接時間變慢。那么問題就來了——我們是否有辦法給 bundle 顯著地瘦瘦身?
其實一切都很簡單——使用相對文件路徑即可。我們來倆個示例看看它們的區別。
示例1
首先,我們使用ES6的解構賦值(destructuring assignment)來加載一些 lodash 模塊:
# src/example.js import { concat, sortBy, map, sample } from 'lodash'; // Example: sortBy const users = [ { 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 42 }, { 'user': 'barney', 'age': 34 } ]; const exampleSortBy = sortBy(users, function(o) { return o.user; }); console.log(exampleSortBy); // Example: map const exampleMap = map(users, 'user'); console.log(exampleMap); // Example: concat const array = [1]; const exampleConcat = concat(array, 2, [3], [[4]]); console.log(exampleConcat); // Example: sample const exampleSample = sample([1, 2, 3, 4]); console.log(exampleSample);
接着咱用 browserify 來編譯和打包該應用:
browserify src/example.js -o dist/bundle.js -t [ babelify --presets [ es2015 ] ] -v -d -g uglifyify
到目前為止感覺還不錯,我們來寫第二個示例,然后對比它們的文件大小~
示例2
我們來寫一個完全一樣的應用,不過這次我們將使用文件路徑來引入所需模塊,而非直接引入整個 lodash:
# src/example-2.js import concat from 'lodash/concat'; import sortBy from 'lodash/sortBy'; import map from 'lodash/map'; import sample from 'lodash/sample'; // Example: sortBy const users = [ { 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 42 }, { 'user': 'barney', 'age': 34 } ]; const exampleSortBy = sortBy(users, function(o) { return o.user; }); console.log(exampleSortBy); // Example: map const exampleMap = map(users, 'user'); console.log(exampleMap); // Example: concat const array = [1]; const exampleConcat = concat(array, 2, [3], [[4]]); console.log(exampleConcat); // Example: sample const exampleSample = sample([1, 2, 3, 4]); console.log(exampleSample);
然后我們對其也進行編譯打包:
browserify src/example-2.js -o dist/bundle-2.js -t [ babelify --presets [ es2015 ] ] -v -d -g uglifyify
問題來了—— 這兩個示例最終打包后的 bundle.js,哪一個文件更小呢?
比較
上述的倆個應用其實做了一樣的事情,它們幾乎寫的一模一樣的代碼。但當我面比較這倆個打包后的文件,你會發現示例2要明顯小得多:
$ ls -lha dist/ bundle-2.js (84K) bundle.js (204K)
原因其實在前面已經提到了——我們不再引入整個 lodash 模塊,而是只引入那些我們所指定需要的模塊。
這個方法也能在幾乎全部的node模塊中奏效。簡單地把解構指派的 import 聲明形式替換為本地路徑的 import 聲明形式,就能顯而易見地減少文件體積。
資源
如果你想跑一跑本文的示例代碼,可以到下面的github倉庫獲得資源:
https://github.com/tlackemann/minimize-bundle-js-size
注:原文地址 https://lacke.mn/reduce-your-bundle-js-file-size/