webpack 打包优化实践

参考文档:
https://github.com/staven630/vue-cli4-config/tree/vue-cli3#hmr
https://segmentfault.com/a/1190000017547171

主要介绍webpack配置,用来提升打包速度和压缩打包体积。有:图片压缩配置、热模块替换配置、打包速度优化等。

  1. 图片压缩配置——image-webpack-loader 和 url-loader
  • Image-webpack-loader
    确保电脑上安装了windows-build-tools。
    查看npm 全局安装包命令:npm list -g --depth 0
    安装方式如下:windows上使用npm install -g windows-build-tools 命令 注意用管理员身份运行。
// vue.config.js
// 效果:可以将图片压缩10倍。1M的压缩为100K,300K的压缩为30K。
chainWebpack: *config*  => {
  config.module
 .rule('images')
 .use('image-webpack-loader')
 .loader('image-webpack-loader')
 .options({
  mozjpeg: { progressive: true, quality: 65 },
  optipng: { enabled: false },
  pngquant: { quality: [0.65, 0.9], speed: 4 },
  gifsicle: { interlaced: false },
  webp: { quality: 75 }
 })
 }
  • url-loader
// vue.config.js
// 效果:将小于8192b的文件转码成base64图片,减少网络请求。但对于base64的图片,浏览器不会缓存。
chainWebpack: *config*  => {
  config.module
 .rule('images')
 .use('url-loader')
 .tap(*options*  =>  Object.assign(options, {
  limit: 8192
 }));
  1. 热模块替换配置——HMR
// 在vue.config.js中配置以下插件,每次更新文件时会报错:
configureWebpack: {
  plugins: [
  new  webpack.NamedModulesPlugin(),
  new  webpack.HotModuleReplacementPlugin(),
]
}
// 直接使用下面的配置:
chainWebpack: *config*  => {
config.resolve.symlinks(true)
}
devServer: {
hot: process.env.NODE_ENV  ===  "development",
}
  1. 打包速度优化——thread_loader (happyPack)和 webpack-parallel-uglify-plugin
    作用:happyPack,多线程解释js和css。
    webpack-parallel-uglify-plugin : 多线程压缩js和css.uglifyjs-webpack-plugin压缩js文件是单线程的
const  HappyPack  =  require('happypack');
const  os  =  require('os');
const  happyThreadPool  =  HappyPack.ThreadPool({
  size: os.cpus().length
});
const  ParallelUglifyPlugin  =  require('webpack-parallel-uglify-plugin');
configureWebpack: {
plugins: [
new  HappyPack({
  *//**用**id**来标识* *happypack**处理那里类文件*
  id: 'happyBabel',
  *//**如何处理**用法和**loader* *的配置一样*
  loaders: [{
  loader: 'babel-loader?cacheDirectory=true',
 }],
  *//**共享进程池*
  threadPool: happyThreadPool,
  *//**允许* *HappyPack* *输出日志*
  verbose: true,
 }),
  *//* *使用* *ParallelUglifyPlugin* *并行压缩输出**JS**代码*
  new  ParallelUglifyPlugin({
  *//* *传递给* *UglifyJS**的参数如下:*
  uglifyJS: {
  output: {
  beautify: false,
  comments: false
 },
  compress: {
  */**
*是否在**UglifyJS**删除没有用到的代码时输出警告信息,默认为输出,可以设置为**false**关闭这些作用*
*不大的警告*
 **/*
  warnings: false,
  */**
*是否删除代码中所有的**console**语句,默认为不删除,开启后,会删除所有的**console**语句*
 **/*
  drop_console: true,
  */**
*是否内嵌虽然已经定义了,但是只用到一次的变量,比如将* *var x = 1; y = x,* *转换成* *y = 5,* *默认为不*
*转换,为了达到更好的压缩效果,可以设置为**false*
 **/*
  collapse_vars: true,
  */**
*是否提取出现了多次但是没有定义成变量去引用的静态值,比如将* *x = 'xxx'; y = 'xxx'* *转换成*
 *var a = 'xxxx'; x = a; y = a;* *默认为不转换,为了达到更好的压缩效果,可以设置为**false*
 **/*
  reduce_vars: true
 }
 },
  test:  /.js$/g,
 }),
]
}
  1. 使用html-webpack-plugin来生成html文件,当script标签引入的js名称是不确定的,尤其有用.

  2. 使用clean-webpack-plugin来每次打包时清理dist文件夹.

  3. 使用webpack.ProvidePlugin来使能第三方库.

new webpack.ProvidePlugin({
  $: 'jquery',
  jQuery: 'jquery',
});
new webpack.ProvidePlugin({
  Vue: ['vue/dist/vue.esm.js', 'default'],
});
  1. 解释css文件——style-loader和css-loader
    css-loader 会对 @import 和 url() 进行处理,就像 js 解析 import/require() 一样。
    style-loader 把 CSS 插入到 DOM 中。
    如果想要将css提取为一个文件,不存储在Js模块中,可以使用mini-css-extract-plugin或者extract-css-chunks-webpack-plugin
    不要将 style-loader 于 mini-css-extract-plugin 一起使用。建议开发环境使用 style-loader ,生产环境使用 mini-css-extract-plugin

  2. 加载图片和字体——file-loader和url-loader

  3. 配置gzip——compression-webpack-plugin

const CompressionPlugin = require("compression-webpack-plugin");
new CompressionPlugin({
    filename: '[path].gz[query]',
     algorithm: "gzip",
     test: /\.js$|\.html$/,
     threshold: 10240,
     minRatio: 0.8,
     deleteOriginalAssets: true
  })
  1. 配置编译时的变量替换——DefinePlugin
    DefinePlugin 允许在 编译时 将你代码中的变量替换为其他值或表达式。这在需要根据开发模式与生产模式进行不同的操作时,非常有用。
new webpack.DefinePlugin({
  PRODUCTION: JSON.stringify(true),
  VERSION: JSON.stringify('5fa3b9'),
  BROWSER_SUPPORTS_HTML5: true,
  TWO: '1+1',
  'typeof window': JSON.stringify('object'),
  'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
});
console.log('Running App version ' + VERSION);
  1. 分析打包之后的js文件——BundleAnalyzerPlugin
    会启动一个服务,在指定端口展示js文件里包含的内容。
const BundleAnalyzerPlugin =
  require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
  configureWebpack: {
    plugins: [new BundleAnalyzerPlugin({ analyzerPort: 6000 })],
  },
};

12.打包不常用模块为静态资源——DllPlugin
https://juejin.cn/post/6844903490620391438
13.配置打包分包——SplitChunkPlugin

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

推荐阅读更多精彩内容