webpack系列 —— 性能优化篇

2023-11-15

一 压缩图片和css

压缩图片
  1. image-webpack-loader 来压缩图片文件
// image-webpack-loader 使用 imagemin 来进行压缩
use: [
    'file-loader', // 需要在file-loader之后添加 image-webpack-loader
    {
      loader:  'image-webpack-loader',
        options: {
            // 压缩 jpg
            mozjpeg: {
              progressive:  true,
            },
            // 压缩 png
            optipng: {
              enabled:  false,  // 可以使用enabled:false来禁用优化器
            },
            // 压缩 png
            pngquant: {
              quality: [0.65, 0.90], // 达到或超过最大质量所需的最少颜色数量
              speed:  4
            },
            // 压缩 gif
            gifsicle: {
              interlaced:  false, // 渐进式渲染
            },
            // 压缩 jpg 和 png为 webp
            webp: {
              quality:  75 // 压缩质量
            }
         }
    }
]

需要注意的是:

  1. image-webpack-loader 需要在 file-loader 之后添加
  2. 默认情况下会自动启用
    jpg、png、gif、svg的优化器

压缩前后文件对比:
压缩前:
请添加图片描述
压缩后:
请添加图片描述
2. 使用 url-loader 将小图片转换为 base64 编码

{
    test: /.(png|jpg|gif)$/, 
    use: [{
           loader: 'url-loader', 
           options: {
             limit: 8 * 1024, // 单位是 Byte,当文件小于 8KB 时作为 DataURL 处理 
           }
         }]
}
压缩 css 代码
  1. optimize-css-assets-webpack-plugin
const  OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
plugins: [
  new  OptimizeCssAssetsWebpackPlugin(),
]

请添加图片描述
请添加图片描述

二 优化 js代码

Tree Shaking 移除未引用的代码
使用前提:

  1. 使用 es6模块化(因为es6模块化语法是静态的,可以使webpack分析出哪些是需要被剔除的代码。 )
import { A } from './index.js' 
export function A() { ... }
  1. 开启production环境
module.exports = {
  entery: '',
  output: {},
  module: {},
  plugins: [],
  mode: 'production',
}

如何配置 webpack 可以使 tree shaking生效?
3. 配置 babel,保留es6模块化语句。

{
    "presets": [
      [
        "env",
          {
            "modules": false  // 关闭 babel 的模块化转换功能,保留原本的es6模块语法
          }
      ]
    ]
}
  1. UglifyJs 代码压缩工具 ,帮忙剔除无用的代码
    通过分析 js 语法树,从而去掉无效代码,去掉console代码,缩短变量名等。
    插件:uglifyjs-webpack-plugin
const  UglifyJsPlugin = require('uglifyjs-webpack-plugin');
    optimization: {
      minimizer: [
        new  UglifyJsPlugin({
             test: /\.js(\?.*)?$/i,
             parallel:  true, // 使用多进程并行运行以提高构建速度
             sourceMap:  true, 
             uglifyOptions: {
                warnings:  false,
                parse: {},
             },
        }),
    ]
}

分离代码文件
分离css文件
css-loader 会把样式字符串存储到js文件中,style-loader 会把样式字符串添加到style标签中。
请添加图片描述
这样会使js文件比较大,影响加载速度。所以我们需要把js中的css文件分离出来,css文件单独打包,并引入到html中。

  • 安装 mini-css-extract-plugin 插件
 npm install mini-css-extract-plugin -D
  • 修改配置
module: {
   rules: [
   {
       test: /\.css$/,
       use: [
           MiniCssExtractPlugin.loader,
           { loader: "css-loader" }
       ]
   }
},
plugins: [
   new  MiniCssExtractPlugin({ // 压缩打包css 文件插件
   filename:  "css/\[name\].css"  // 打包后最终生成的 dist 文件里面的 打包后的 css 文件
})]

请添加图片描述
请添加图片描述
如何实现动态加载?

  1. import(/* webpackChunkName: “show” */ ‘./show’)
index.js的代码:

document.getElementById('btn').addEventListener('click', function(){
    import(/* webpackChunkName: "show" */  './show').then(show => {
        show.default('webpack')
     })
})


show.js 的代码:
module.exports = function(content) {
    alert('hello'\+ content);
}
  1. /* webpackChunkName: “show” */ 是为动态生成的 chunk 指定一个名字, 同时还需要在 webpack.config.js 配置。
output: {
    filename:  'build.js',
    path:  resolve(__dirname, 'build'), // 通常写一个绝对路径
    chunkFilename:  '[name].js' // 为动态加载的 chunk 配置文件名称
},

如果不加 chunkFilename: ‘[name].js’ 的配置,chunk的文件名称将会是 [id].js

webpack 遇到 import(*) 的语句时的处理过程

  1. 以 ./show.js 为入口,重新生成一个chunk
  2. 当代码执行到 import 的时候,加载第一步生成的文件。
  3. import 返回一个Promise, 可以在 then 函数中获取到 show.js 导出的内容

由于 import 返回 Promise,所以在一些不支持 Promise 的浏览器中,需要 Promise polyfill的支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webpack系列 —— 性能优化篇 的相关文章

随机推荐

  • python爬虫14:总结

    python爬虫14 总结 前言 python实现网络爬虫非常简单 只需要掌握一定的基础知识和一定的库使用技巧即可 本系列目标旨在梳理相关知识点 方便以后复习 申明 本系列所涉及的代码仅用于个人研究与讨论 并不会对网站产生不好影响 目录结构
  • 记linux内核处理bootargs到内核并加载模块时传入参数(module_param_named()等)

    昨晚 一网友问我如何把LCD反转一下输出 顿时不会 只会去看之前的dm3730的linux2 6 32的内核 偶然发现直接设置bootargs的参数到内核也许就可以啦 Linux以内核模块为核心 自动编译如系统后 所以的类似init cal
  • Webpack运行报错 Module parse failed

    自己本地项目运行报错 因为项目中使用package lock json固定了版本 项目中axios使用的0 21 1版本 可以正常运行 当删除package lock json执行npm install 然后axios版本为0 21 4 运
  • matlab filter函数_MATLAB 低通滤波器 low pass filter

    1 lowpass 函数 注意 只有2018年之后的matlab才有lowpass bandpass 函数 lowpass x fpass fs x 一维信号 fpass 截止频率 fs 采样频率 例子 两个频率的信号 一个是50HZ 振幅
  • air硬盘扩容 macbook_「技巧」苹果电脑硬盘拓展的5种方法,你知道吗

    前言 这是官网最新的MacBook Pro 13 提供的前两种配置 9999元起售 差价1500元 一样的外观 一样的处理器和内存 除了硬盘容量之外 其他配置全部相同 为了128G的容量多花1500元钱 值得吗 从成本上来说 是不值得的 同
  • 欧拉角与四元数

    以下文章摘自wiki百科 对于在三维空间里的一个参考系 任何坐标系的取向 都可以用三个欧拉角来表现 参考系又称为全局坐标系 是静止不动的 而局部坐标系则固定于刚体 随着刚体的旋转而旋转 参閲右图 设定 x y z轴为全局坐标系的参考轴 称
  • 软件程序流程图使用规范

    软件程序流程图使用规范 Amorphous 博客园 cnblogs com 目录 一 程序流程图的作用 二 画流程图常用软件 三 流程图中使用的符号 四 流程图采用的常用符号 五 循环流程图的画法 六 程序流程图的高级用法 七 基本结构 八
  • 算法训练day43

    文章目录 1049 最后一块石头的重量 II 求最大重量 思路分析 代码实现 494 目标和 求组合方法数 思路分析 动规方法 代码实现 总结思考 474 一和零 求二维背包的最大物品数 思路分析 代码实现 思考总结 1049 最后一块石头
  • springmvc / /* /img/**等问题

    在配置springmvc的前端控制器 DispatcherServlet的时候有三种配置方式 action 访问以 action结尾 由DispatcherServlet进行解析 第二种 所以访问的地址都由DispatcherServlet
  • 用Vmware和vm tools虚拟机装Linux Ubuntu16 配置anaconda python3环境 安装tensorflow/tflearn

    Authoried by Monana Contact me via hemonan vip 163 com 本教程适合虚拟机 也适合不用虚拟机直接用Linux系统的 0 安装前的准备答疑 1 很多人都会有疑问 我到底在虚拟机里装linux
  • filebeat 解析日志 并发送到Elasticsearch

    起先 是出于了解我的网站逐步前行STEP的访问情况而做一个Nginx日志统计分析的功能 首选的就是ELK 但是 由于Logstash占用内存和CPU占有率都不是我的小服务器能承受的 转而将logstash换成filebeat 因为fileb
  • 【计算机视觉

    文章目录 一 前言 二 试玩效果 三 研究背景 四 模型结构 五 Pre training objectives 六 CapFilt架构 七 Experiment 八 结论 一 前言 今天我们要介绍的论文是 BLIP 论文全名为 Boots
  • live555 实现一个最简单的RTSP服务器

    用live555中的库写了一个最简单的RTSPServer程序 仅用于学习目的 从下例的代码中 可以清析的明白RTSPServer的函数调用流程 cpp view plaincopyprint include
  • 人工智能期末复习

    1 人工智能 内涵和外延 英文 Artificial Intelligence 定义 能力方面 人工智能就是用人工的方法在机器 计算机 上实现的智能 或称机器智能 学科方面 是一门研究如何构造智能机器或智能系统 以模拟 延申和扩展人类智能的
  • 微信JSAPI支付v3流程(uniapp和node版)

    一 微信JSAPI支付 请提前准备好接入前的准备文档获取相关的配置数据 否则下面需要的数据你可能会比较懵 并且需要提前了解微信JSAPI支付文档 二 获取用户openid 获取openid方法例子 三 h5调起支付 1 第一种通过Weixi
  • springboot yml 配置文件注入Map,List

    文章转自 https blog csdn net sdzhangshulong article details 80124900 person lastName hello age 18 boss false birth 2017 12 1
  • C语言学习之extern关键字

    1 了解extern 1 extern是C语言的一个关键字 可以用来修饰函数与变量 2 当extern修饰一个变量或函数时时 就是在声明这个变量 函数 告诉编译器在外部文件中已经这个变量 函数 要通过编译 2 extern的用法 1 在一个
  • 使用java实现word转pdf,亲测有效,完美保留样式

    网上了很多方法 要么转换速度慢 要么转换出来的格式不一样 遇到了各种问题 无法完美完成转换 在stackoverflow发现完美答案 依赖
  • 网易严选滑块

    疫情分控在家 哎 难搞哦 大表哥们 虽然是网易一家的滑块 就当无聊分享一下 说明一下 有些id用官方的那套可能过不去 文章末尾分享一个ast解混淆的js 大家可以拿去用过用 之前的文章有写过网易的 也是简单介绍了一下 严选滑块 先看看b d
  • webpack系列 —— 性能优化篇

    一 压缩图片和css 压缩图片 image webpack loader 来压缩图片文件 image webpack loader 使用 imagemin 来进行压缩 use file loader 需要在file loader之后添加 i