vue、webpack打包优化

news2024/9/9 1:12:17

webpack默认打包把所有的资源都放在chunk-vendors.js,导致文件很大,从而让页面的响应很慢

1 使用compression-webpack-plugin,打包生成gzip静态资源压缩文件,结合服务端Nginx的配置,服务器启用gzip;

1.1 安装compression-webpack-plugin插件


npm install compression-webpack-plugin --save-dev

1.2 修改vue.config.js


const CompressionWebpackPlugin = require('compression-webpack-plugin')
module.exports = {

 configureWebpack: {
    plugins: [
      // gzip
      new CompressionWebpackPlugin({
        filename: '[path].gz[query]',
        algorithm: 'gzip',
        test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$'),
        threshold: 10240,
        minRatio: 0.8,
        deleteOriginalAssets: false
      })
    ],
    resolve: {
      alias: {
        '@': resolve('src')
      }
    }
  },

}

1.3 修改nginx的配置


http {

sendfile        on;
    keepalive_timeout  65;
    
    #上传文件的大小
    client_max_body_size 200m;
    
    ##缓存cache参数配置##  
    proxy_connect_timeout 60;  
    proxy_read_timeout 60;  
    proxy_send_timeout 60;  
    proxy_buffer_size 16k;  
    proxy_buffers 4 64k;  
    proxy_busy_buffers_size 128k;  
    proxy_temp_file_write_size 128k;  
    
    #缓存到nginx的本地目录  
    proxy_temp_path  /usr/local/nginx/temp/;  
    proxy_cache_path /usr/local/nginx/temp/cache_temp levels=1:2 keys_zone=my_cache:200m inactive=1d max_size=30g;
    # 开启缓存
    proxy_cache my_cache;
    ##压缩配置##
    gzip on; #开启或关闭gzip on off 
    gzip_static on;    
    gzip_disable "MSIE [1-6]\."; #IE1-6版本不支持gzip压缩
    gzip_min_length 10k; #gzip压缩最小文件大小,超出进行压缩(自行调节) 
    gzip_buffers 4 16k; #buffer 不用修改 
    gzip_comp_level 5; #压缩级别:1-10,数字越大压缩的越好,时间也越长 
    gzip_types text/plain text/css application/xml application/javascript text/javascript application/x-httpd-php application/json application/css image/jpeg image/gif image/png; # 压缩文件类型 
    gzip_vary on; #跟Squid等缓存服务有关,on的话会在Header里增加 "Vary: Accept-Encoding"
    gzip_http_version 1.0; #不设置的话,gzip不生效
    # 限流策略,可在一定程度上防止ddos攻击
    # ip限流策略
    limit_req_zone $binary_remote_addr zone=iplimit:10m rate=50r/s;
    # cookies中access_token值限流策略
    limit_req_zone $COOKIE_access_token zone=cookielimit:10m rate=50r/s;
    # header中Authorization值限流策略
    limit_req_zone $http_Authorization zone=headerlimit:10m rate=50r/s;
    # url中access_token参数值限流策略
    limit_req_zone $arg_access_token zone=paramlimit:10m rate=50r/s;
}

2 拆分chunk-vendors.js文件

2.1 拆解方式一

指定模块进行单独打包,不进行大小拆分

module.exports = {
 css: { extract: false, sourceMap: false },  //  开发环境跟生成环境样式不一致时配置
  chainWebpack: config => {
    if (process.env.NODE_ENV !== 'development') {
      // 移除 prefetch 插件
      config.plugins.delete('prefetch')
      // 移除 preload 插件
      config.plugins.delete('preload')
      config.optimization.splitChunks({
        maxInitialRequests: 8, // 每个入口和它的同步依赖最多能被拆分的数量
        cacheGroups: {
          elementUI: {
            name: 'chunk-elementUI', // split elementUI into a single package
            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
            test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
            chunks: 'all',
            reuseExistingChunk: true,
            enforce: true
          },
          Components: {
            name: 'chunk-components', // 这里name与pages中chunks里的名字对应
            test: /[\\/]node_modules[\\/](components)[\\/]/,
            chunks: 'all',
            priority: 14,
            reuseExistingChunk: true
          },
          base: {
            name: 'chunk-base', // 这里name与pages中chunks里的名字对应
            test: /[\\/]node_modules[\\/](base)[\\/]/,
            chunks: 'all',
            priority: 15,
            reuseExistingChunk: true,
            enforce: true
          }
        }
      })
    }
}

2.2 拆解方式二

直接根据模块名称正则配置拆分,并指定文件大小

// 开启分离js
config.optimization = {
    runtimeChunk: 'single',
    splitChunks: {
        chunks: 'all',
        maxInitialRequests: Infinity,
        minSize: 20000, // 依赖包超过20000bit将被单独打包
        cacheGroups: {
            vendor: {
                test: /[\\/]node_modules[\\/]/,
                name(module) {
                    // get the name. E.g. node_modules/packageName/not/this/part.js
                    // or node_modules/packageName
                    const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
                    // npm package names are URL-safe, but some servers don't like @ symbols
                    return `npm.${packageName.replace('@', '')}`
                }
            }
        }
    }
};

2.3 上述拆分后,需要在chunks配置上对应的模块名,不然会导致页面空白

以方式一为例

const glob = require('glob')
glob.sync('./src/modules/**/main.js').forEach(path => {
  const pageName = path.split('./src/modules/')[1].split('/main.js')[0]
  pages[pageName] = {
    entry: path, // page 的入口
    filename: pageName + '.html', // 在 dist/xxxx.html 的输出
    // If doesn't exist, fallback to 'public/index.html'
    template: pageName + '.html', // 模板来源
    // 提取出来的通用 chunk 和 vendor chunk。
    chunks: ['chunk-vendors', 'chunk-common', 'chunk-elementUI', 'chunk-base', 'chunk-components', pageName]
  }
})

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

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

相关文章

spring 中包自动扫描之 component-scan 解析

在 spring 中&#xff0c;为简化 bean 的配置&#xff0c;在 spring-context 模块下提供了包的自动扫描功能&#xff0c;将配置的包及其子包下的所有符合条件的类都注册到 BeanFactory 中。下面来看下具体是怎么实现的。 配置 <context:component-scan base-package"…

【MIT 6.5840(6.824)学习笔记】Raft

1 脑裂 许多容错系统使用一个单主节点来决定主副本。 MapReduce&#xff1a;由单主节点控制计算复制。GFS&#xff1a;主备复制数据&#xff0c;并由单主节点确定主拷贝的位置。VMware FT&#xff1a;主虚机和备份虚机之间复制指令&#xff0c;需要单点的Test-and-Set服务确认…

[0729] X-CMD 发布 v0.4.3:借助 fzf ,提升用户使用体验

目录 X-CMD 发布 v0.4.3&#x1f50e; ll&#x1f50e; jq&#x1f50e; yq&#x1f50e; man X-CMD 发布 v0.4.3 &#x1f50e; ll 新增 --fzf 子命令 该命令借助 fzf 为用户提供了一种高效查找文件和目录的相关信息的方法&#xff0c;类似于文件管理器。 # 使用 fzf 查找文…

AI智能名片O2O商城小程序源码在社区团购中的应用与红利深度探索

摘要&#xff1a;在数字化转型的浪潮中&#xff0c;社区团购以其独特的商业模式和强大的市场渗透力&#xff0c;成为新零售领域的一股不可忽视的力量。而AI智能名片O2O商城小程序源码&#xff0c;作为技术创新的集大成者&#xff0c;正逐步渗透并深刻改变着社区团购的运作模式和…

从零开始编写一个Chrome插件:详细教程

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

科普文:抽屉合同/协议

抽屉协议是指一种在特定情境下&#xff0c;当事人之间私下签订的、不公开披露的协议。通常情况下&#xff0c;除了协议双方外&#xff0c;其他人并不知道这份协议的存在。这种协议在需要时会被拿出来&#xff0c;因为它已经过双方签字盖章&#xff0c;同样具有法律效应。 背景…

SN65MLVD080使用手册

8通道半双工M-LVDS线路收发器 特性 低压差分30欧姆至55欧姆线路驱动器和接收器&#xff0c;支持信号速率高达250 Mbps&#xff1b;时钟频率高达125 MHz 满足或超过M-LVDS标准TIA/EIA-899多点数据交换规范 受控驱动器输出电压转换时间&#xff0c;提高信号质量 -1V至3.4V共模…

【C++版本】protobuf与gRPC

文章目录 一、Protobuf二、安装以及使用protoc参考 一、Protobuf Google Protocol Buffers&#xff08;protobuf&#xff09;是一种语言中立、平台中立的序列化协议&#xff0c;旨在高效地将结构化数据进行序列化和反序列化。它主要用于通信协议、数据存储和其他需要高效编码和…

【CAN通讯系列5】CAN数据帧及其仲裁

在CAN通讯系列3-CAN通讯如何传递信号中&#xff0c;由于传递信号的分析需要&#xff0c;引出了CAN数据帧的ID&#xff0c;长度和数据段的概念&#xff0c;它们都与CAN协议帧相关。CAN协议帧有5种类型&#xff0c;如下表&#xff1a; 而我们当前使用到的是数据帧&#xff0c;故本…

【Qwen-Audio部署实战】Qwen-Audio-Chat模型之FastApi部署实战

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

10 BERT

目录 1 综述 1.1 BERT的核心思想 1.2 BERT的关键技术&#xff1a;预训练阶段 1.3 微调阶段 2 BERT的架构 2.1 输入处理 3. 特征选择/学习模块 BERT 的自注意力过程 4. 预训练任务&#xff1a;同时进行 4.1 Next Sentence Prediction (NSP) 4.2 Masked Language Model…

Url图标实现

Url图标实现 效果如下&#xff1a; 1.引入样式 <link rel"icon" href"favicon.ico"> favicon.ico和对应的html一般需要在同一个目录下&#xff08;同级别&#xff09;。 2.title是用来设置在url页签中显示的名称。 可能存在的问题&#xff1a; …

如何通过前端表格控件实现自动化报表?

背景 最近伙伴客户的项目经理遇见一个问题&#xff0c;他们在给甲方做自动化报表工具&#xff0c;项目已经基本做好了&#xff0c;但拿给最终甲方&#xff0c;业务人员不太买账&#xff0c;项目经理为此也是天天抓狂&#xff0c;没有想到合适的应对方案。 现阶段主要面临的问…

filament 初使用记录

安装初始化 一、环境准备 官网要的 我安装的 二、下载安装 安装laravel composer create-project --prefer-dist laravel/laravel 项目名称 10.*导入 filament composer require filament/filament注册 filament 管理面板 php artisan filament:install --panels初始化…

KubeSphere部署:(一)环境准备

本文介绍windows系统&#xff0c;安装wsl虚拟机&#xff08;ubuntu&#xff09;&#xff0c;并在ubruntu中配置连接私有harbor及阿里云镜像等。 在确定该方式前&#xff0c;博主也曾尝试过通过安装Docker Desktop的方式&#xff0c;但每次重启电脑之后&#xff0c;docker桌面端…

Photoshop 2023:创意无限的图像编辑神器

Photoshop 2023 是一款专为 Mac 和 Windows 系统设计的强大图像编辑软件&#xff0c;为专业设计师和业余爱好者提供了无与伦比的创作工具和功能。 一、强大的编辑工具 Photoshop 2023 拥有丰富的编辑工具&#xff0c;如选择工具、画笔工具、橡皮擦工具等。其选择工具能够精确…

Matlab编程资源库(14)常微分方程初值问题的数值解法

一、 龙格&#xff0d;库塔法简介 龙格-库塔法&#xff08;Runge-Kutta method&#xff09;是一种常用的数值解微分方程的方法&#xff0c;由德国数学家卡尔龙格&#xff08;Carl Runge&#xff09;和马丁威尔海尔姆库塔&#xff08;Martin Wilhelm Kutta&#xff09;在20世纪…

Windows11下 Visual Studio 2022 + Qt6 的 WebSocket 线程池异步 客户端

Windows11下 Visual Studio 2022 + Qt6 的 WebSocket 线程池异步 客户端 1 开发 WebSocket 客户端1.1 开发环境1.1.1 为Qt 6安装 websockets1.2 .基于Qt6的 QWebSocket 客户端示例1.2.1 实现 WebSocket 客户端1.2.2 创建 QtQWesocketClient1.2.3 创建QWebsocket对象1.2.3.1 添加…

轻松实现人声与伴奏分离,轻松获取纯净音质

SpleeterGui是一款用于人声与伴奏分离的开源软件&#xff0c;基于Python的Spleeter库开发而成。SpleeterGui支持的操作系统包括Windows、macOS和Linux&#xff0c;用户可以根据自己的需求选择合适的版本进行下载和使用。 使用教程 1、解压 人声伴奏分离软件-SpleeterGUI_2.9.5…

前端必知必会-html实体与保留字转换和符号

文章目录 HTML 实体HTML 字符实体一些有用的 HTML 字符实体HTML 符号HTML 符号实体数学符号希腊字母其他一些实体总结 HTML 实体 HTML 中的保留字符必须用实体替换&#xff1a; <&#xff08;小于&#xff09; < >&#xff08;大于&#xff09; >HTML 字符实体 …