当前位置:   article > 正文

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

chunk-vendors

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

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

    1. npm install --save-dev compression-webpack-plugin
    2. npm install --save-dev compression-webpack-plugin@1.1.2
    3. 或者
    4. yarn add compression-webpack-plugin --save-dev

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

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

    2、nginx配置:

    1. 完整示例
    2. server {
    3. listen 80;
    4. # gzip config
    5. gzip on;
    6. gzip_min_length 1k;
    7. gzip_comp_level 9;
    8. 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;
    9. gzip_vary on;
    10. gzip_disable "MSIE [1-6]\.";
    11. root /usr/share/nginx/html;
    12. location / {
    13. # 用于配合 browserHistory 使用
    14. try_files $uri $uri/ /index.html;
    15. # 如果有资源,建议使用 https + http2,配合按需加载可以获得更好的体验
    16. # rewrite ^/(.*)$ https://preview.pro.loacg.com/$1 permanent;
    17. }
    18. location /api {
    19. proxy_pass https://preview.pro.loacg.com;
    20. proxy_set_header X-Forwarded-Proto $scheme;
    21. proxy_set_header Host $http_host;
    22. proxy_set_header X-Real-IP $remote_addr;
    23. }}server {
    24. # 如果有资源,建议使用 https + http2,配合按需加载可以获得更好的体验
    25. listen 443 ssl http2 default_server;
    26. # 证书的公私钥
    27. ssl_certificate /path/to/public.crt;
    28. ssl_certificate_key /path/to/private.key;
    29. location / {
    30. # 用于配合 browserHistory 使用
    31. try_files $uri $uri/ /index.html;
    32. }
    33. location /api {
    34. proxy_pass https://preview.pro.loacg.com;
    35. proxy_set_header X-Forwarded-Proto $scheme;
    36. proxy_set_header Host $http_host;
    37. proxy_set_header X-Real-IP $remote_addr;
    38. }}
    # 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]\.";
    

    附录

    配置项释义:

    1. # 开启服务器实时gzip
    2. gzip on;
    3. # 开启静态gz文件返回
    4. gzip_static on;
    5. # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
    6. gzip_min_length 1k;
    7. # 设置压缩所需要的缓冲区大小
    8. gzip_buffers 32 4k;
    9. # 设置gzip压缩针对的HTTP协议版本
    10. gzip_http_version 1.0;
    11. # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
    12. gzip_comp_level 7;
    13. # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
    14. 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;
    15. # 是否在http header中添加Vary: Accept-Encoding,建议开启
    16. gzip_vary on;
    17. # 禁用IE 6 gzip
    18. gzip_disable "MSIE [1-6]\."; 

     实际成功实例

  • vue.config.js

    1. module.exports = {
    2. publicPath: process.env.NODE_ENV === 'production' ? './' : '/',
    3. chainWebpack: config => {
    4. const svgRule = config.module.rule('svg')
    5. const CompressionWebpackPlugin = require('compression-webpack-plugin')
    6. svgRule.uses.clear()
    7. svgRule
    8. .test(/\.svg$/)
    9. .use('svg-sprite-loader')
    10. .loader('svg-sprite-loader')
    11. if (process.env.NODE_ENV === 'production') {
    12. config.plugin('CompressionPlugin').use(
    13. new CompressionWebpackPlugin({
    14. test: /\.(js|css)$/,
    15. threshold: 10240, // 超过10kb的文件就压缩
    16. deleteOriginalAssets:false, // 删除压缩后的源文件
    17. minRatio: 0.8
    18. })
    19. )
    20. }
    21. },
    22. productionSourceMap: false,
    23. devServer: {
    24. open: true,
    25. port: 8001,
    26. overlay: {
    27. errors: true,
    28. warnings: true
    29. }
    30. },

     打包后的文件

  • nginx.conf 

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

     重启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,相应位置加入以下代码。

    12345678910
    
    const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPluginmodule.exports = { configureWebpack: config => { return { plugins: [ new BundleAnalyzerPlugin() ] } }}
    

      

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/535555
推荐阅读
相关标签
  

闽ICP备14008679号