(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:Infinity11  })12]
  • 打包后文件大小限制,首次加载js+css超过 400k,单个文件大小超过 300k将会报错,打包不通过,该配置在build中使用
1performance: {2  hints: ‘error‘,3  maxEntrypointSize: 400000,4  maxAssetSize: 3000005}

减小代码量

  • 提取 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 >= 28  }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": true16    }],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().length10    },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: true26  }),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}45after67classname {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: false6    }7  }8]

广告

以下是笔者基于 vue-cli 的模版优化后的vuereact的打包工具,用法一致。

以下包集成了以上所有优化,支持单页面及多页面应用,完全兼容vue-cli生成的模版项目

zz-webpack-vue

zz-webpack-react

以下是使用本组一个vue-cli生成的项目做的一个优化对比:

优化前:

打包

分析

优化后:

打包

分析

可以查看具体的优化配置,或者直接在项目中尝试使用,有任何问题欢迎随时反馈,目前正在筹划统一升级webpack4

原文地址:https://www.cnblogs.com/zhuanzhuanfe/p/9101944.html

时间: 2024-07-30 16:12:30

(webpack系列二)webpack打包优化探索的相关文章

webpack系列--浅析webpack的原理

一.前言 现在随着前端开发的复杂度和规模越来越大,鹰不能抛开工程化来独立开发,比如:react的jsx代码必须编译后才能在浏览器中使用,比如sass和less代码浏览器是不支持的.如果摒弃这些开发框架,开发效率会大幅下降. 在众多前端工程化工具中,webpack脱颖而出成为了当今最流行的前端构建工具. 二.webpack的原理 知其然知其所以然. 1.核心概念 (1)entry:一个可执行模块或者库的入口. (2)chunk:多个文件组成一个代码块.可以将可执行的模块和他所依赖的模块组合成一个c

webpack教程(二)——webpack.config.js文件

首先我们需要安装一个webpack插件html-webpack-plugin,该插件的作用是帮助我们生成创建html入口文件.执行如下命令 npm install html-webpack-plugin --save-dev 在项目app目录下建立component.js文件,写入如下代码 export default (text='hello world')=>{ const element=document.createElement('div'); element.innerHTML=te

[转] Webpack 打包优化之体积篇

谈及如今欣欣向荣的前端圈,不仅有各类框架百花齐放,如Vue, React, Angular等等,就打包工具而言,发展也是如火如荼,百家争鸣:从早期的王者Browserify, Grunt,到后来赢得宝座的 Gulp, 以及独树一帜的 fis3, 以及下一代打包神器 Rollup :在 browserify,grunt,gulp,rollup,webpack 可以一窥其中部分对比.在本文要探究的是,当前打包工具绝对霸者 Webpack. Webpack Package optimization W

Webpack 打包优化之体积篇

谈及如今欣欣向荣的前端圈,不仅有各类框架百花齐放,如Vue, React, Angular等等,就打包工具而言,发展也是如火如荼,百家争鸣:从早期的王者Browserify, Grunt,到后来赢得宝座的 Gulp, 以及独树一帜的 fis3, 以及下一代打包神器 Rollup :在 browserify,grunt,gulp,rollup,webpack 可以一窥其中部分对比.在本文要探究的是,当前打包工具绝对霸者 Webpack. Webpack Package optimization W

Webpack + Vue 多页面项目升级 Webpack 4 以及打包优化

0. 前言 早在 2016 年我就发布过一篇关于在多页面下使用 Webpack + Vue 的配置的文章,当时也是我在做自己一个个人项目时遇到的配置问题,想到别人也可能遇到跟我同样的问题,就把配置的思路分享出来了,传送门在这里. 因为那份配置直到现在还有人在关注,同时最近公司帮助项目升级了 Webpack 4,趁机也把之前的配置也升级了一下,而且博客荒废了这么久,都快 9102 年了,不能连年均一篇博文都不到,所以有了下面的分享. 下面的配置主要是给在多页面下使用 Webpack 的同学在升级

[js高手之路]深入浅出webpack系列1-安装与基本打包用法和命令参数

webpack,我想大家应该都知道或者听过,Webpack是前端一个工具,可以让各个模块进行加载,预处理,再进行打包.现代的前端开发很多环境都依赖webpack构建,比如vue官方就推荐使用webpack.废话不多说,我们赶紧开始吧. 第一步.安装webpack 新建文件夹webpack->再在webpack下面新建demo->命令行切换到demo目录,使用npm init --yes 初始化项目的package.json文件,然后执行npm install webpack --save-de

WebPack实例与前端性能优化

[前端构建]WebPack实例与前端性能优化 计划把微信的文章也搬一份上来. 这篇主要介绍一下我在玩Webpack过程中的心得.通过实例介绍WebPack的安装,插件使用及加载策略.感受构建工具给前端优化工作带来的便利. 壹 | Fisrt 曾几何时,我们是如上图的方式引入JS资源的,相信现在很少遇见了.近年来Web前端开发领域朝着规范开发的方向演进.体现在以下两点: MVC研发构架.多多益处(逻辑清晰,程序注重数据与表现分离,可读性强,利于规避和排查问题...) 构建工具层出不穷.多多益处(提

The way of Webpack learning (VI.) -- 长缓存优化

使用commonChunkPlugin的都是基于webpack3.10.0,在webpack4中直接配置optimization就可以了. 一:什么是长缓存? 浏览器在用户访问页面的时候,为了加快加载速度,对用户请求的静态资源都会进行存储,但是每次代码更新或者升级的时候,我们都需要浏览器去加载新的代码.最方便的方法就是引入新的文件名称,只下载新的代码块,不加载旧的代码块,这就是长缓存. 二:场景实现 1.业务代码+第三方库代码 解决方法: 提取vendor,hash -> chunkhash 每

深入学习webpack(二)

深入学习webpack(二) 在深入学习webpack(一)中,我通过一个例子介绍了webpack的基本使用方法,下面将更为系统的学习webpack的基本概念,对于一门技术的掌握我认为系统化还是很重要的,如果仅仅是一知半解,更为深入的地方了解不够,那么你就泯然众人矣. webpack的核心概念主要有四个: entry(入口).output(出口).loaders(加载器).plugins(插件). 下面我将逐一介绍. Entry webpack会创建应用里所有依赖的图表,而最开始的图表就是所谓的