分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

webpack打包性能优化

发布时间:2023-09-06 01:49责任编辑:熊小新关键词:webpack性能优化

1. 使用 gzip 压缩打包后的 js 文件

这个方法优化浏览器下载时的文件大小(打包后的文件大小没有改变)
webpack.config.prod.js 中

var ?CompressionWebpackPlugin ?= ?require(‘compression-webpack-plugin‘);// 在 pligins 中添加new ?CompressionWebpackPlugin({ //gzip 压缩 ???asset: ?‘\[path\].gz\[query\]‘, ???algorithm: ?‘gzip‘, ???test: ?new ?RegExp( ???????‘\\\.(js|css)$‘ ?//压缩 js 与 css ???), ???threshold: ?10240, ???minRatio: ?0.8})

这样打包出的 css js,会有 css.gz js.gz,即压缩过的 js 和 css。
之后在服务器端的 nginx 配置中开启 gzip:
查看配置文件:vim /usr/local/etc/nginx/nginx.conf

// 写在 http 中就可以gzip ?on;gzip_types application/javascript text/css image/jpeg;

这样浏览器下载文件时还是之前的 js,但是服务器返回的压缩过的 .gz 文件,再在本地解压,时间缩短了很多。

2. echart 使用外链 js 文件,不引入 npm 包

在 html 中引入 echarts.min.jschina.jsecharts-gl.min.jsecharts-wordcloud.min.js,不引入 npm 包
在 webpack生产打包配置中增加:

externals: { ???"react": ?"React", ??// 左边引入时的自定义名字,右边全局变量名 ???"react-dom": ?"ReactDOM", ???"jquery": ?"jQuery", ???"echarts": ?"echarts"}

https://doc.webpack-china.org/configuration/externals/#externals
打包后文件大小减小 0.5M

3. 配置打包去掉注释,删除debugger,删除console

new webpack.optimize.UglifyJsPlugin({ ???comments: ?false, //去掉注释 ???compress: { ???????warnings: ?false, ???????drop_debugger: true, ???????drop_console: true ???}}),

4. ant design 按需引入

https://github.com/ant-design/ant-design/issues/2656

  1. 可以直接写,缺点每个组件需要单写一行
    import ?Button ?from ?"antd/lib/button"
  2. 用对象的方式写
    import { Button } from ‘antd‘;
    如果单用这种方式写,打包的时候每个文件会把 antd 的所有模块都加载进去,参见:
    https://ant.design/docs/react/getting-started-cn#%E6%8C%89%E9%9C%80%E5%8A%A0%E8%BD%BD
    需要引入 babel-plugin-import 使每个模块按需加载,并在 webpack.config.js 里配置

    loaders: [...{ ??text: /\.(js|jsx)$/, ??include: paths.appSrc, ??loader: ‘babel‘, ??query: { ??????cacheDirectory: true, ??????plugins: [["import", { libraryName: "antd", style: "css" }]] ?// 这一句 ??}},...]

    每个引入antd的文件减小0.5M

5. 删除无用依赖

6. echart 图表懒加载

https://www.npmjs.com/package/react-lazyload

import LazyLoad from ‘react-lazyload‘;// 在需要懒加载的元素外包裹<LazyLoad height={300} offset={10}><!--元素--></LazyLoad>

7. 使用 webpack-parallel-uglify-plugin 替代 UglifyJS 插件

https://jeffjade.com/2017/08/12/125-webpack-package-optimization-for-speed/#%E5%A2%9E%E5%BC%BA%E4%BB%A3%E7%A0%81%E4%BB%A3%E7%A0%81%E5%8E%8B%E7%BC%A9%E5%B7%A5%E5%85%B7
使用 webpack-parallel-uglify-plugin 替代 webpack.optimize.UglifyJsPlugin 并行混淆压缩 js 文件,打包时间从四分钟减到两分钟。用法和 UglifyJsPlugin 相同。

var ParallelUglifyPlugin=require(‘webpack-parallel-uglify-plugin‘) ;new ParallelUglifyPlugin({ ???uglifyJS: { ???????output: { ???????????comments: ?false ?//去掉注释 ???????}, ???????compress: { ???????????warnings: ?false, ???????????drop_debugger: ?true, ???????????drop_console: ?true ???????} ???}}),

8. happypack 多进程执行 loader

原理
配置方式
引入 happypack
支持的loader列表

module.exports ?= { ???module: { ???????loaders: [ ???????????{ ???????????????test: /.jsx?$/, ???????????????loader: ?"happypack/loader?id=happybabel", ???????????????exclude: /node_modules/ ???????????}, ???????????{ ???????????????test: /\.json$/, ???????????????exclude: /node_modules/, ???????????????loader: ?‘happypack/loader?id=happyjson‘, ???????????????include: [ ???????????????????path.join(rootPath, "src/components"), ???????????????????path.join(rootPath, "src/mockdata"), ???????????????????path.join(rootPath, "src/views"), ???????????????] ???????????}, ???????????{ ???????????????test: /\.less$/, ???????????????loader: ?ExtractTextPlugin.extract("style", "happypack/loader?id=happyless"), ???????????????include: [ ???????????????????path.join(rootPath, "src/components/"), ???????????????????path.join(rootPath, "src/assets"), ???????????????????path.join(rootPath, "node_modules/antd"), ???????????????] ???????????}, ???????] ???}, ???plugins: [ ???????createHappyPlugin(‘happybabel‘, [{ ???????????loader: ?‘babel-loader‘, ???????????query: { ???????????????cacheDirectory: ?true, ???????????????plugins: [ ???????????????["import", { "libraryName": ?"antd", "style": ?true }] // `style: true` 会加载 less 文件 ???????????????] ???????????}, ???????}]), ???????createHappyPlugin(‘happyjson‘, [‘json-loader‘]), ???????createHappyPlugin(‘happyless‘, [‘css-loader?sourceMap!less‘]), ???]}function ?createHappyPlugin(id, loaders) { ???return ?new ?HappyPack({ ???????id: ?id, ???????loaders: ?loaders, ???????threadPool: ?happyThreadPool, ???????verbose: ?true ???});}

打包时间减少了 15s

9. 检查 loader 中的 include 和 exclude 使其更加精确

https://jeffjade.com/2017/08/12/125-webpack-package-optimization-for-speed/#%E8%AE%BE%E7%BD%AE-test-amp-include-amp-exclude

{ ???test: /\.json$/, ???exclude: /node_modules/, ???loader: ?‘happypack/loader?id=happyjson‘, ???include: [ ???????path.join(rootPath, "src/components"), ???????path.join(rootPath, "src/mockdata"), ???????path.join(rootPath, "src/views"), ???]},{ ???test: /\.less$/, ???loader: ?ExtractTextPlugin.extract("style", "happypack/loader?id=happyless"), ???include: [ ???????path.join(rootPath, "src/components/"), ???????path.join(rootPath, "src/assets"), ???????path.join(rootPath, "node_modules/antd"), ???]},

搜索文件范围变窄,可以减小一点打包时间。

webpack打包性能优化

原文地址:https://www.cnblogs.com/ubuntugx/p/8794582.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved