小小改動幫你減少bundle.js文件體積(翻譯)


我已經從事過好多年的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/

donate


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM