(webpack系列二)webpack打包优化探索
虽然webpack的已经升级到了webpack4,而我们目前还在使用webpack3,但其中的优化点都大同小异,升级后同样适用。
性能优化初步原则
减小代码量
减小请求数
最大化利用浏览器缓存
这三条原则永远是一切优化的前提
优化配置
升级
webpack 3,优化js的编译能力(Scope Hoisting)
1// 主要配置
2plugins:[
3 new webpack.optimize.ModuleConcatenationPlugin()
4]
合理规划
entry入口配置(平衡vendor.js, app.js文件的大小)
1// main.js中第三方公共库提出,作为公共vendor.js, 配合package.json固定第三方库版本,最大化利用浏览器缓存加载js
2entry: {
3 vendor:['vue', 'vue-router', 'vue-resource'],
4 app: './src/main.js'
5}
6// ...
7plugins:[
8 new webpack.optimize.CommonsChunkPlugin({
9 name: ['manifest','vendor'].reverse(),
10 minChunks:Infinity
11 })
12]
打包后文件大小限制,首次加载js+css超过
400k,单个文件大小超过300k将会报错,打包不通过,该配置在build中使用
1performance: {
2 hints: 'error',
3 maxEntrypointSize: 400000,
4 maxAssetSize: 300000
5}
减小代码量
提取
chunk中使用的公共库(能为chunk代码节约近1/3的代码量)
1new webpack.optimize.CommonsChunkPlugin({
2 name: 'app',
3 async: 'vendor-async',
4 children: true,
5 minChunks: (module, count) => {
6 // 被 2 个及以上 chunk 使用的共用模块提取出来
7 return count >= 2
8 }
9})
减少图片base64的使用,降低限制,限制2k(vue官方配置是10k,会大大增加js文件体积,移动端对base64的解析成本高)
1 {
2 test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
3 loader: 'url-loader',
4 options: {
5 limit: 2048,
6 name: utils.assetsPath('img/[name].[hash:7].[ext]')
7 }
8 }
生产模式(pro)下第三方库使用已压缩版本,能节约近20k文件大小
1// 开发模式
2resolve: {
3 alias: {
4 'vue': 'vue/dist/vue.esm.js'
5 }
6}
7// 生产模式
8resolve: {
9 alias: {
10 'vue': 'vue/dist/vue.min.js'
11 }
12}
优化
babel-ployfill,结合babel-preset-env实现兼容按需加载,比使用es2015能节约近半的大小
1entry: {
2 vendor:['babel-polyfill', 'vue', 'vue-router', 'axios'],
3 app: './src/main.js'
4}
1// .babelrc
2{
3 "presets": [
4 ["env", {
5 "modules": false,
6 "targets": {
7 "browsers": [
8 "> 1%",
9 "last 3 versions",
10 "Firefox ESR",
11 "not ie < 10"
12 ]
13 },
14 "debug": false,
15 "useBuiltIns": true
16 }],
17 "react",
18 "stage-2"
19 ]
20}
极致压缩js,css代码
1var os = require('os')
2var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
3
4plugins: [
5 new webpack.optimize.UglifyJsPlugin({
6 // 利用多核能力压缩
7 beautify: {
8 cache: true,
9 workers: os.cpus().length
10 },
11 // 最紧凑的输出
12 beautify: false,
13 // 删除所有的注释
14 comments: false,
15 compress: {
16 // 在UglifyJs删除没有用到的代码时不输出警告
17 warnings: false,
18 // 删除所有的 `console` 语句
19 drop_console: true,
20 // 内嵌定义了但是只用到一次的变量
21 collapse_vars: true,
22 // 提取出出现多次但是没有定义成变量去引用的静态值
23 reduce_vars: true,
24 },
25 sourceMap: true
26 }),
27 new OptimizeCSSPlugin({
28 cssProcessor: require('cssnano')({ zindex: false }),
29 cssProcessorOptions: {
30 safe: true,
31 discardComments: {removeAll: true }
32 }
33 })
34]
第三方库的依赖过滤,如下:
1// 此插件默认全部引入语言库,但我们只用到了中文,最多英文,所以进行了过滤,大大减少了总体代码量
2plugins: [
3 new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /zh|en/)
4]
减少请求数
manifest.js文件内联(app.css可以自行选择,当小于10k是最好内联),webpack推荐配置如下:
1// 引入内联插件
2var HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin')
3
4plugins:[
5 // ...
6 new HtmlWebpackPlugin({
7 // ... 其他不相关配置省略
8 inlineSource:/(app\.(.+)?\.css|manifest\.(.+)?\.js)$/,
9 // ...
10 }),
11 new HtmlWebpackInlineSourcePlugin()
12]
最大化利用浏览器缓存
这样能最大化利用浏览器缓存
1// 不固定版本,会造成打包后 hash 值变化,浏览器没办法利用本身的缓存加载js,每次上线都会使本地缓存失效,页面加载变慢
2"dependencies": {
3 "moment": "2.17.1",
4 "querystring": "0.2.0",
5 "sprite-cli": "0.1.5",
6 "sticky-state": "2.4.1",
7 "superagent-jsonp": "0.1.1",
8 "underscore": "1.8.3",
9 "vue": "2.0.0",
10 "vue-lazyload": "0.8.3",
11 "vue-router": "2.0.0",
12 "vuex": "2.0.0"
13}
其他优化
zindex被重置问题
由于cssnano默认配置,是自动会把z-index重置为1,例如:
1classname {
2 z-index:1000;
3}
4
5after
6
7classname {
8 z-index:1;
9}
这时候需要优化cssnano的配置,.postcssrc 如下:
1/* eslint-disable no-unused-vars */
2module.exports = {
3 plugins: {
4 cssnano: {
5 preset: [
6 'advanced',
7 {
8 zindex: false,
9 }
10 ]
11 }
12 }
13}
使用按需加载js后,打包代码特别大
需要注意的是,当使用按需加载的功能,然后没有提取所有chunk包里的css,同时又开启了sourcemap功能,那么就会造成这种情况
最简单的办法就是,对css不使用sourcemap功能,例如:
1rules: [
2 {
3 loader: 'postcss-loader',
4 options: {
5 sourceMap: false
6 }
7 }
8]
广告
以下是笔者基于 vue-cli 的模版优化后的vue和react的打包工具,用法一致。
以下包集成了以上所有优化,支持单页面及多页面应用,完全兼容vue-cli生成的模版项目
zz-webpack-vue
zz-webpack-react
以下是使用本组一个vue-cli生成的项目做的一个优化对比:
优化前:
打包
分析
优化后:
打包
分析
可以查看具体的优化配置,或者直接在项目中尝试使用,有任何问题欢迎随时反馈,目前正在筹划统一升级webpack4
(webpack系列二)webpack打包优化探索的更多相关文章
- webpack系列--浅析webpack的原理
一.前言 现在随着前端开发的复杂度和规模越来越大,鹰不能抛开工程化来独立开发,比如:react的jsx代码必须编译后才能在浏览器中使用,比如sass和less代码浏览器是不支持的.如果摒弃这些开发框架 ...
- Vue+Webpack之 代码及打包优化
本文重点介绍Vue单页面应用的优化手段: 异步加载 面切换时加loading特效 点击延迟 inline manifest 逻辑代码优化 依赖包体积优化 cdn引用 Vue代码优化 异步加载 所谓的异 ...
- webpack系列:webpack小老弟接了个简单活
webpack深入浅出系列:进阶篇 前沿,本篇文章的讲解思路是以webpack的五大核心为线索,以webpack对象为第一视角来讲述(以前记得看过一个文笔非常厉害的技术啊婆写的,非常有趣.然后我就想着 ...
- webpack教程(二)——webpack.config.js文件
首先我们需要安装一个webpack插件html-webpack-plugin,该插件的作用是帮助我们生成创建html入口文件.执行如下命令 npm install html-webpack-plugi ...
- WebPack系列:Webpack编译的代码如何在tomcat中使用时静态资源路径不对的问题如何解决
问题: 使用webpack+vue做前端,使用tomcat提供api,然后npm run build之后需要将编译,生成如下文件: | index.html \---appserver ...
- webpack 打包优化的四种方法(多进程打包,多进程压缩,资源 CDN,动态 polyfill)
如今,webpack 毫无疑问是前端构建领域里最耀眼的一颗星,无论你前端走哪条路线,都需要有很强的webpack 知识.webpack 的基本用法这里就不展开讲了.主要探讨一下如何提高 webpack ...
- 记一次webpack打包优化
未进行打包优化的痛点: 随着项目的不断扩大,引入的第三方库会越来越多,我们每次build的时候会对所有的文件进行打包,耗时必定很长,不利于日常开发. 解决思路: 第三方库我们只是引入到项目里来,一般不 ...
- vue-cli内部webpack的打包优化
在此之前,我们先谈谈前端项目的性能优化. 优化前端项目无非就是2方面的优化: 一.网络性能优化(重点) 减少请求数量(webpack的天职就是打包) 减少请求资源大小(压缩gzip,后端会完成) CD ...
- webpack原理探究 && 打包优化
在做vue项目和react项目时,都用到了webpack.webpack帮助我们很好地提高了工作效率,但是一直以来没有对其原理进行探究,略有遗憾. 因为使用一个工具,能够深入了解其原理才能更好地使用. ...
随机推荐
- 20170506计划-----(基于python查询oracle语句)
在日常的工作中,经常接到开发同事查询生产SQL的请求,公司又不允许对开发开放查询SQL的权限,并且查询的堡垒机又很慢,计划做一个可以自动查询SQL的小工具,一周内完成吧. 大概功能实现了,一些涉及敏感 ...
- Python+Selenium 利用ID,XPath,tag name,link text,partial link text,class name,css,name定位元素
使用firefox浏览器,查看页面元素,我们以“百度网页”为示例 一.ID定位元素 利用find_element_by_id()方法来定位网页元素对象 ①.定位百度首页,输入框的元素 ②.编写示 ...
- Scrum冲刺阶段3
成员今日完成的任务 人员 任务 何承华 美化主界面 陈宇 后端设计 丁培辉 美化主界面 温志铭 主页面的设计 杨宇潇 主页面的设计 张主强 服务器构建 成员遇到的问题 人员 问题 何承华 主页面美化意 ...
- 谷歌浏览器运行Flash
最近有人问我谷歌浏览器的flash总是要点击手动运行才可以使用.看了很多网上很多教程,并没有比较好的解决方案. 自己找了相关资料后,找到了一个比较好的完整的.特此在这边放出来给大家使用. 新建记事本, ...
- oracle 中如何查看某个表所涉及的存储过程
SELECT DISTINCT * FROM user_source WHERE TYPE = 'PROCEDURE' AND upper(text) LIKE '%PS_KL_ABS_002_DAT ...
- php数组排序sort
php的数组分为数字索引型的数组,和关键字索引的数组.如果是数字索引的,可以这样使用:$names = ['Tom', 'Rocco','amiona'];sort($names);sort()函数只 ...
- Codeforces Round #532 (Div. 2) F 线性基(新坑) + 贪心 + 离线处理
https://codeforces.com/contest/1100/problem/F 题意 一个有n个数组c[],q次询问,每次询问一个区间的子集最大异或和 题解 单问区间子集最大异或和,线性基 ...
- Note | Git
目录 1. 出发 A. 安装 B. 设置机器身份 C. 创建版本(仓)库 repository D. 可管理文件 2. 基础操作 A. 添加文件至仓库 B. 修改文件并查看修改 C. 查看历史变动 D ...
- 使用tcpdump探测TCP/IP三次握手
读计算机应该就同说过TCP/IP三次握手,但是都没有去验证过,今天心血来潮,去验证了一下,于是乎写下了这篇博客,可能写的可能有问题,还请多多指教 包括我学习,还有从很多资料来看资料,第三次握手,应该会 ...
- scrum冲刺
小组第一次冲刺任务及其完成情况描述: 这次主要是先构建一个框架,然后就是完成首页的一些代码编写,能够基本实现首页的注册.登陆以及一些之后完成的内部构建. 在第一次冲刺任务中的收获和体会,以后如何改进的 ...