基于webpack 3 打包性能优化

基于webpack 3 打包性能优化

source

Scope Hoisting.


过去 webpack 打包时的一个取舍是将 bundle 中各个模块单独打包成闭包。这些打包函数使你的 JavaScript 在浏览器中处理的更慢。相比之下,一些工具像 Closure Compiler 和 RollupJS 可以提升(hoist)或者预编译所有模块到一个闭包中,提升你的代码在浏览器中的执行速度。

打开方法:

module.exports = {
    plugins: [
        new webpack.optimize.ModuleConcatenationPlugin(),
    ],
};

--display-optimization-bailout 将显示绑定失败的原因。

Minification and Uglification.


这个应该都会用吧. 去掉空格,换行,注释及一些不必要在生产环境中的东东。

    webpack -p // -p is short for "production"

如果没有给node设置production环境变量的话,还需要设置

    NODE_ENV=production PLATFORM=web webpack -p

还有一些第三方库在生产环境中会去掉一些在开发或测试环境中才能用到的功能,使其提升性能和减少体积.
一般来说 -p 已经够用了, 如果还想再进一步减少体积的话可以使用 webpack.optimize.UglifyJsPlugin.

Dynamic Imports for Lazy-loaded Modules.


  • step 1: Babel setup
    yarn add babel-loader babel-core babel-preset-env
// update your webpack.config.js
module: {
    rules: [
        {
        test: /\.js$/,
        use: 'babel-loader',
        exclude: /node_modules/,
        },
    ],
},
  • step 2: update babelrc
    yarn add babel-plugin-syntax-dynamic-import
// update .babelrc
{
    "presets": ["env"],
    "plugins": ["syntax-dynamic-import", "transform-react-jsx"]
}

如果你是使用 es2015 作为preset,那么建议你�换到 env.

  • step 3: use import()
//old
import Home from './components/Home';

//now
const Home = import('./components/Home');
// 原来的require.ensure 已经被import()取代.

目前vue �已经可以做到开箱即用,但是react还不可以。我们可以使用 react-code-split 这个库,实现原理就是使用import().

import React from 'react';
import Async from 'react-code-splitting';

const Nav = () => (<Async load={import('./components/Nav')} />);
const Home = () => (<Async load={import('./views/home')} />);
const Countdown = () => (<Async load={import('./views/countdown')} />);

Deterministic Hashes for Caching



增加hash方便缓存。下面�这种增加hash的方式,只有当文件改变了hash值才会变。这种就避免了用户不必要的下载。

  • yarn add chunk-manifest-webpack-plugin webpack-chunk-hash
  • update config.js
const webpack = require('webpack');
const ChunkManifestPlugin = require('chunk-manifest-webpack-plugin');
const WebpackChunkHash = require('webpack-chunk-hash');
const HtmlWebpackPlugin = require('html-webpack-plugin');

/* Shared Dev & Production */

const config = {
/* … our webpack config up until now */

plugins: [
    // /* other plugins here */
    // 
    // /* Uncomment to enable automatic HTML generation */
    // new HtmlWebpackPlugin({
    //   inlineManifestWebpackName: 'webpackManifest',
    //   template: require('html-webpack-template'),
    // }),
],
};

/* Production */

if (process.env.NODE_ENV === 'production') {
config.output.filename = '[name].[chunkhash].js';
config.plugins = [
    ...config.plugins, // ES6 array destructuring, available in Node 5+
    new webpack.HashedModuleIdsPlugin(),
    new WebpackChunkHash(),
    new ChunkManifestPlugin({
    filename: 'chunk-manifest.json',
    manifestVariable: 'webpackManifest',
    inlineManifest: true,
    }),
];
}

module.exports = config;

CommonsChunkPlugin for Vendor Caching


将第三依赖打包到vendor.js里,这样你升级时,这些第三方依赖就不会重新下载.使用 CommonsChunkPlugin

const webpack = require('webpack');
entry: {
    app: './app.js',
    vendor: ['react', 'react-dom', 'react-router'],
},

// 注意这里的name要和entry相同。否则这些�第三方依赖会打包到所有的入口文件
plugins: [
  new webpack.optimize.CommonsChunkPlugin({
    name: 'vendor',
  }),
],

Tips:

  • �全局使用的modules
  • 更新频率很低的modules
  • 频繁使用的子modules Only load commonly-used submodules. For example, if the app uses 'rxjs/Observable' frequently, but 'rxjs/Scheduler' rarely, then only load the former. And whatever you do, don’t load all of 'rxjs'!

Offline Plugin for webpack


�一个离线可访问的webapp. 插件 OfflinePlugin .使用也很简单,自己�去看吧。自己试了一下,ios10 微信�内浏览器不行,Safari� 可以�离线访问

webpack Bundle Analyzer


分析��bundle.js的�工具🔧
yarn add --dev webpack-bundle-analyzer

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

config = { /* shared webpack config */ };

if (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test') {
  config.plugins = [
    ...config.plugins,
    new BundleAnalyzerPlugin(),
  ];
}

how to use:
node_module/.bin/webpack --profile --json > stats.json

原本提到了关于�优化moment打包大小的问题,solution, �这里提一下如果你使用 roadhog 脚手架的话,在 .roadhogrc.js中加上 "ignoreMomentLocale": true 就可以实现(隐藏func).

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容

  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,171评论 7 35
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,292评论 4 31
  • webpack 介绍 webpack 是什么 为什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert阅读 6,470评论 2 71
  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,697评论 7 110
  • 第一次高考失利,一个人窝在卧室发呆,看着窗外天亮天黑,你选择坚强,即便内心迷惘。 第一次报考志愿,一个人在电脑思考...
    吾之言阅读 347评论 0 0