前端项目时因chunk-vendors过大导致首屏加载太慢,Vue Build时chunk-vendors的优化方案...

news2024/12/23 19:00:36

1、compression-webpack-plugin插件打包.gz文件

  • 安装插件 也可以指定版本 我这里下载的是1.1.2版本的,试过更高的版本会有ES6语法的报错,因为我node使用的是v12,如果node版本更高可以尝试更高版本

  • npm install --save-dev compression-webpack-plugin
    npm install --save-dev compression-webpack-plugin@1.1.2
    或者
    
    yarn add compression-webpack-plugin --save-dev
    
    

    解决 TypeError: Cannot read property ‘tapPromise‘ of undefined

    在使用 compression-webpack-plugin 插件时报这个错误,原因是版本问题。
    
    ERROR TypeError: Cannot read property 'tapPromise' of undefined
    TypeError: Cannot read property 'tapPromise' of undefined
    
    安装插件的时候默认最新版本,但是可能脚手架还不支持这个版本,所以需要降低插件版本进行使用,这边在安装的时候最新版本为 v9.2.0,降到 v6.1.1 进行使用
    
     npm install compression-webpack-plugin@6.1.1
    
    
    
    vue.config.js配置插件 
    module.exports = {
      chainWebpack: config => {
        const CompressionWebpackPlugin = require('compression-webpack-plugin')
        if (process.env.NODE_ENV === 'production') {
            config.plugin('CompressionPlugin').use(
            	new CompressionWebpackPlugin({
                test: /\.(js|css)$/,
                threshold: 10240, // 超过10kb的文件就压缩
          			deleteOriginalAssets:fale, // 删除压缩后的源文件
          			minRatio: 0.8
              })
            )
       	}
      }
    }
    
    

    2、nginx配置:

  • 完整示例
    server {
        listen 80;
        # gzip config
        gzip on;
        gzip_min_length 1k;
        gzip_comp_level 9;
        gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        gzip_vary on;
        gzip_disable "MSIE [1-6]\.";
    
        root /usr/share/nginx/html;
    
        location / {
            # 用于配合 browserHistory 使用
            try_files $uri $uri/ /index.html;
    
            # 如果有资源,建议使用 https + http2,配合按需加载可以获得更好的体验 
            # rewrite ^/(.*)$ https://preview.pro.loacg.com/$1 permanent;
    
        }
        location /api {
            proxy_pass https://preview.pro.loacg.com;
            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   Host              $http_host;
            proxy_set_header   X-Real-IP         $remote_addr;
        }}server {
      # 如果有资源,建议使用 https + http2,配合按需加载可以获得更好的体验 
      listen 443 ssl http2 default_server;
    
      # 证书的公私钥
      ssl_certificate /path/to/public.crt;
      ssl_certificate_key /path/to/private.key;
    
      location / {
            # 用于配合 browserHistory 使用
            try_files $uri $uri/ /index.html;
    
      }
      location /api {
          proxy_pass https://preview.pro.loacg.com;
          proxy_set_header   X-Forwarded-Proto $scheme;
          proxy_set_header   Host              $http_host;
          proxy_set_header   X-Real-IP         $remote_addr;
      }}
    
    
    # gzip config gzip on; gzip_min_length 1k; gzip_comp_level 9; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_vary on; gzip_disable "MSIE [1-6]\.";
    

    附录

    配置项释义:

  • # 开启服务器实时gzip
      gzip on;
      
      # 开启静态gz文件返回
      gzip_static on;
      
      # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
      gzip_min_length 1k;
      
      # 设置压缩所需要的缓冲区大小     
      gzip_buffers 32 4k;
    
    # 设置gzip压缩针对的HTTP协议版本
      gzip_http_version 1.0;
    
      # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
      gzip_comp_level 7;
    
      # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
      gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
    
      # 是否在http header中添加Vary: Accept-Encoding,建议开启
      gzip_vary on;
    
      # 禁用IE 6 gzip
      gzip_disable "MSIE [1-6]\."; 
    

     实际成功实例

  • vue.config.js

  • module.exports = {
      publicPath: process.env.NODE_ENV === 'production' ? './' : '/',
      chainWebpack: config => {
        const svgRule = config.module.rule('svg')
        const CompressionWebpackPlugin = require('compression-webpack-plugin')
        svgRule.uses.clear()
        svgRule
          .test(/\.svg$/)
          .use('svg-sprite-loader')
          .loader('svg-sprite-loader')
    
          if (process.env.NODE_ENV === 'production') {
              config.plugin('CompressionPlugin').use(
                  new CompressionWebpackPlugin({
                      test: /\.(js|css)$/,
                      threshold: 10240, // 超过10kb的文件就压缩
                      deleteOriginalAssets:false, // 删除压缩后的源文件
                      minRatio: 0.8
                  })
              )
          }
    
      },
      productionSourceMap: false,
      devServer: {
        open: true,
        port: 8001,
        overlay: {
          errors: true,
          warnings: true
        }
      },
    
    

     打包后的文件

  • nginx.conf 

  •     #gzip  on;
    
        server {
            listen       80;
            server_name  localhost;
            #开启gzip
            gzip  on;  
            #低于1kb的资源不压缩 
            gzip_min_length 1k;
            #压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。 
            gzip_comp_level 5; 
            #需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.
            gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;  
            #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
            gzip_disable "MSIE [1-6]\.";  
            #是否添加“Vary: Accept-Encoding”响应头
            gzip_vary on;		
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   /home/vue/dist;
                index  index.html index.htm;
            }
    
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    
    

     重启nginx

  • ./nginx -s reload  

  • 以下资料还没试过,有需要可以试试

  • 通过以上处理,在网页访问时,chunk-vendors.js 显示为2.3M,加载还是需要2秒左右,还是不太能接受。

    于是需要进一步查询项目还有哪些无用的大文件依赖,于是通过以下方法来定位大依赖:
    通过 webpack-bundle-analyzer 插件来分析依赖,该插件可以很清晰的看清楚 chunk-vendors.js 中包含了哪些依赖和哪些依赖是很大的,然后进一步分析这些依赖是否真的必要,如果没有必要就直接拿掉,最终,拿掉了三个1M多的依赖,直接让 chunk-vendors.js 从7.7M下降到了3.1M,gz压缩后只有900多kb,加载大概在700毫秒左右。

    具体操作如下:
    1 引入 webpack-bundle-analyzer 插件

    1
    npm install --save-dev webpack-bundle-analyzer

    2 修改 vue.config.js,相应位置加入以下代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
    module.exports = {
    configureWebpack: config => {
    return {
    plugins: [
    new BundleAnalyzerPlugin()
    ]
    }
    }
    }

      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/850733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day14 引用数组类型

向上造型 计算机 编译过程 和运行过程 Pet pet new Cat(); 图中 pet.eat()为父类构造方法 、 pet.catchMouse()为子类方法 向上造型构成对象不能调用子类独有方法 出现方法重写会调用子类方法 向下造型 Cat cat1 (Cat)new Pet 这种形式错误…

FortiGate防火墙日志审计运维

环境介绍 CPU:8核,内存:16GB,硬盘:100GB 操作系统版本:CentOS-7-x86_64-DVD-2003 平台版本:鸿鹄2.7.0 安装组件 安装环境支持确认 鸿鹄计算引擎使用了 AVX2 高级指令集做向量计算加速&#xf…

Python SQLAlchemy ( ORM )

From Python中强大的通用ORM框架:SQLAlchemy:https://zhuanlan.zhihu.com/p/444930067Python ORM之SQLAlchemy全面指南:https://zhuanlan.zhihu.com/p/387078089 SQLAlchemy 文档:https://www.sqlalchemy.org/ SQLAlchemy入门和…

STM32F103——GPIO八种工作模式

目录 1、GPIO 基本结构分析 2、GPIO 八种工作模式 2.1 输入浮空 2.2 输入上拉 2.3 输入下拉 2.4 模拟功能 2.5 开漏输出 2.6 开漏式复用功能 2.7 推挽输出 2.8 推挽式复用功能 3、GPIO 八种工作模式特点及应用 1、GPIO 基本结构分析 STM32F103的 GPIO 工作有八种…

Vue.js2+Cesium1.103.0 七、Primitive 绘制航线元素

Vue.js2Cesium1.103.0 七、Primitive 绘制航线元素 用 Primitive 绘制航线元素,包括航点图标,航线线段,线段距离标注,航点序号,海拔标注,总航程等信息。 可同时绘制多条航线;可根据 id 清除指…

【LeetCode】数据结构题解(11)[用队列实现栈]

用队列实现栈 😉 1.题目来源👀2.题目描述🤔3.解题思路🥳4.代码展示 所属专栏:玩转数据结构题型❤️ 🚀 >博主首页:初阳785❤️ 🚀 >代码托管:chuyang785❤️ &…

PHP最简单自定义自己的框架定义常量自动生成目录(三)

1、框架入口增加模块定义&#xff0c;实现多模块功能 index.php 定义模块 <?php //定义当前请求模块 define("MODULE",index); require "./core/KJ.php"; 创建后台模块admin.php <?php define("MODULE",admin); require "./cor…

在家构建您的迷你聊天Chat gpt

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 什么是指令遵循模型&#xff1f; 语言模型是机器学习模型&#xff0c;可以根据句子的前一个单词预测单词概率。如果我们向模型请求下一个单词&#xff0c;并将其递减地反馈给模型以请求更多单词&#xff…

《Linux运维实战:Docker基础总结》

一、简介 1、docker的基本结构是什么&#xff0c;包含哪些组件&#xff1f; docker的基本机构是c/s模式&#xff0c;即客户端/服务端模式。 由docker客户端和docker守护进程组成。docker客户端通过命令行或其它工具使用docker sdk与docker守护进程通信&#xff0c;发送容器管理…

SaaS系统相比传统软件,为何数据更安全?

随着云计算、5G等技术的不断进步&#xff0c;SaaS行业步入了快速发展的阶段&#xff0c;应用场景也日趋多元化。预计2023年底&#xff0c;中国SaaS行业市场规模将达到555.1亿元。 中研网对于SaaS发展态势预测这样评价&#xff1a; 当前&#xff0c;我国在多个维度上具备发展 S…

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…

【ChatGPT】自我救赎

ChatGPT辅助学习C之【在C中如果大数据类型转小数据类型会发生什么呢?】&#xff0c;今天问ChatGPT一个问题&#xff0c;让它解析下面这个C程序&#xff1a; #include <iostream> #include <cstdio> using namespace std; int main() {int a;long long b532165478…

haproxy基本编译环境部署

前提&#xff1a;haproxy支持基于lua实现功能扩展&#xff08;需要安装比较新的lua语言&#xff0c;方便进行haproxy编译&#xff09;。 wget http://www.lua.org/ftp/lua-5.3.5.tar.gz lua -v # 检查环境 yum list lua # 查看可以安装环境 同时还需要gcc&#xff0c;gcc-c&…

rocketMq消息队列详细使用与实践整合spring

文章目录 一、RocketMQ原生API使用1、测试环境搭建2、RocketMQ的编程模型3、RocketMQ的消息样例3.1 基本样例3.2 顺序消息3.3 广播消息3.4 延迟消息3.5 批量消息3.6 过滤消息3.7 事务消息3.8 ACL权限控制 二、SpringBoot整合RocketMQ1、快速实战2、其他更多消息类型&#xff1a…

CSS实现图像填充文字

效果如下 具体代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>CSS图像填充文字</title><style>.text {background-image: url(./imgs/1.webp);/* 一定要让背景透明&#xff0c;这样后面的背…

Linux使用mount挂载

authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 格式化分区 sudo mkfs -t ext4 /dev/mmcblk0p1 格式化分区 实际使用中推荐这个&#xff0c;它是 mkfs 命令的个变种&#xff0c;可以自动识别文件系统类型为 ext4&#xff0c;并使用 ext4 文件系统的默认参数来创建…

【源码篇】ArrayList源码解析

文章目录 ArrayList源码解析1、ArrayList简介2、ArrayList继承关系2.1 Seralizable接口2.2 Cloneable接口2.3 RandomAccess接口 3、源码解析3.1 构造方法源码解析3.1.1 无参构造源码解析3.1.2 有参构造源码解析 3.2 add方法源码解析3.2.1 add(E e)方法源码解析3.2.2 add(int in…

Azure通过自动化账户实现对资源变更

Azure通过自动化账户实现对资源变更 创建一个自动化账户第一种方式 添加凭据&#xff08;有更改资源权限的账户&#xff0c;没有auth认证情况&#xff09;创建一个Runbook&#xff0c;测试修改 AnalysisServices 定价层设置定时任务&#xff1a;开始定时任务&#xff1a; 第二种…

Redis基础 (三十八)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 1.1 NoSQL 1.2 Redis 二、安装 2.1 安装方式 &#xff1a; 三、目录结构 3.1 rpm -ql redis 3.2 /etc/redis.conf 主配置文件 3.3 /var/lib/redis …

【MATLAB第68期】基于MATLAB的LSTM长短期记忆网络多变量时间序列数据多步预测含预测未来(非单步预测)

【MATLAB第68期】基于MATLAB的LSTM长短期记忆网络多变量时间序列数据多步预测含预测未来&#xff08;非单步预测&#xff09; 输入前25个时间&#xff0c;输出后5个时间 一、数据转换 1、原始数据 5列时间序列数据&#xff0c;70行样本 705 数据矩阵结构 2、数据转换 将…