首页 > 其他分享 >前端项目时因chunk-vendors过大导致首屏加载太慢,Vue Build时chunk-vendors的优化方案

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

时间:2023-08-03 16:44:08浏览次数:39  
标签:时因 text chunk javascript webpack application vendors gzip config

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

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

  • npm install --save-dev compression-webpack-plugin
    npm install --save-dev [email protected]
    或者
    
    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 [email protected]
    
    

     

    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()
    ]
    }
    }
    }

     

      

标签:时因,text,chunk,javascript,webpack,application,vendors,gzip,config
From: https://www.cnblogs.com/zhangzhiping35/p/17603745.html

相关文章

  • Chunk编码
    Chunk编码Content-Length需要提前知道BODY的长度,对于静态资源是没问题的,但是对于一些动态资源有时候就没有那么方便了。因此HTTP1.1还有一种Chunk编码的方式来传输数据。使用Chunk编码的BODY会变成下面这样子(假设BODY的数据是“<h1>Helloworld</h1>”)4<h1>5Hello6 world......
  • mongodb chunk 逻辑概念
    MongoDBChunk逻辑概念教程概述在学习MongoDBChunk逻辑概念之前,首先需要了解一些基本概念。MongoDB是一个分布式数据库,它将数据划分为多个Chunk(块),每个Chunk包含一个数据片段。Chunk的划分是通过sharding集群实现的,sharding集群由多个分片(shard)组成。每个分片都是一个......
  • uniapp vue.config.js配置chunk-vendors.js文件拆分
    constpath=require('path')functionresolve(dir){returnpath.join(__dirname,dir);}constCompressionPlugin=require('compression-webpack-plugin')consthtmlWebpackPlugin=require('html-webpack-plugin')htmlWebpackPl......
  • pandas读取excel表格内容后重新生成表格时因为序号再次生成,出现:Unnamed: 0
    出现的问题如下图:在读取数据的函数中增加:index_col=0,即可。......
  • European software vendors ranking 2012 (zz)
    Europeansoftwarevendorsranking2012//z2013-07-1214:08:[email protected][T62,L646,R24,V1099]欧洲最大100家软件企业公司一百强100强软件公司世界欧洲美国最大营业额利润排名RankCompanyPublic ?CountryofHQlocationSoftwarereven......
  • 原油价格波动临时因素,Forexclub认为有4个原因
    在上一篇文章中,Forexclub和各位外汇交易者探讨一下影响原油价格波动的永久因素,今天紧接上一篇文章的内容,我们继续探讨影响原油价格波动的4个临时因素:1.原油产量随着原油产量的增加,原油出口国将有兴趣向市场输送更多石油。如果需求受到买家欢迎,这是一个积极的信号。但是,如果供大于求......
  • 关于TChunkedArray和UE5的ECS框架Mass
    在虚幻引擎中,TChunkArray是一个动态数组类型。它通过分配一系列固定大小的Chunk来管理Array中的元素。每个Chunk具有以下特征:1.固定大小,通常为4096个元素。该大小在TChunkArray定义时指定,之后所有Chunk的大小都是一致的。2.可以连续或不连续的分配在内存中。TChunk......
  • 配置 webpack 的 SplitChunksPlugin
    VueCLI3构建的Vue2项目,配置webpack的SplitChunksPlugin插件,可以按照以下步骤进行操作:打开项目根目录下的vue.config.js文件(如果没有该文件,可以在根目录下创建一个)。在vue.config.js文件中添加以下内容:module.exports={configureWebpack:{optimi......
  • lucene LZ4 会将doc存储在一个chunk里进行Lz4压缩 ES的_source便如此
    默认情况下,Elasticsearch用JSON字符串来表示文档主体保存在 _source 字段中。像其他保存的字段一样,_source 字段也会在写入硬盘前压缩。The_sourceisstoredasabinaryblob(whichiscompressedbyLucenewithdeflateorLZ4)其实就是多个_source合并到一个chunk里......
  • parquet文件格式——本质上是将多个rows作为一个chunk,同一个chunk里每一个单独的colum
    Parquet是Twitter贡献给开源社区的一个列数据存储格式,采用和Dremel相同的文件存储算法,支持树形结构存储和基于列的访问。ClouderaImpala也将使用Parquet作为底层的存储格式。在很多大数据的应用场景下面,比如电信行业,具有一定规则的数据,字段很多,但是每次查询仅仅针对其中少数的几个......