vue2项目webpack3.x打包文件分割优化加载

news2024/12/25 1:20:16

vue2项目webpack3.x打包文件分割优化加载

  • 0. 项目目录和依赖信息
  • 1. 开启 gzip(建议)
  • 2. vue2项目配置懒加载(建议)
  • 3. 拆分 vendor 包
    • 注意:webpack3使用CommonsChunkPlugin实现

本文使用 3 种方案进行叠加优化
优先级按以下排序。

0. 项目目录和依赖信息

在这里插入图片描述
package.json 部分信息如下:

{
"scripts": {
	"build": "node build/build.js"
},
"dependencies": {
	"vue": "^2.6.14",
    "vue-router": "^3.5.2",
    "vuex": "^3.6.2"
},
"devDependencies": {
 	"webpack": "^3.12.0",
    "webpack-bundle-analyzer": "^2.9.0",
    "webpack-dev-server": "^2.11.5",
    "webpack-merge": "^4.1.0",
    "webpack-post-compile-plugin": "^0.5.1",
    "webpack-transform-modules-plugin": "^0.3.5"
}
}

1. 开启 gzip(建议)

  1. 打开Nginx配置文件:
    通常,Nginx的主配置文件位于/etc/nginx/nginx.conf。但实际的配置文件可能还包含在其他位置,例如/etc/nginx/conf.d/*/etc/nginx/sites-available/*

  2. 编辑配置文件:
    在http、server或location块中添加以下指令来启用gzip压缩:

http {
    ...
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_compresss_level 9;
    gzip_vary on;
    ...
}
  1. 重新加载Nginx
nginx -s reload
  1. webpack.prod.config.js配置 gzip
config: {
 // ...
	build: {
		// ...
		productionGzip: true,
		productionGzipExtensions: ['js', 'css']
		// ...
	}
 // ...
}

在这里插入图片描述
5. 打包后会生成 *.gz的文件如下,nginx 会优先加载 gz 文件
在这里插入图片描述
在这里插入图片描述

2. vue2项目配置懒加载(建议)

  1. 在路由上配置懒加载方式。当请求新页面时再进行网络请求加载资源

在这里插入图片描述

// router/index.js
export defalut new Router({
	base: '/',
	mode: 'hash',
	routes: routes
})

// main.js
import router from './router'
Vue.use(router);
new Vue({
	// ...
	router,
	// ...
})
  1. 实现的效果如下图,网络请求实现了懒加载方式
    每请求一个页面,加载一个页面资源 js,这样的好处是拆分 app.js ,全局实现懒加载后,大大的减少app.js 包的体积,加速首屏加载和渲染。
    在这里插入图片描述
  2. 组件懒加载
    // 如果发现了一个文件特别大,分析引入的组件是否太大,可以做成异步组件,拆分出一个文件
components: {
  OrgSelect: () => import( '@/components/org-select.vue')
},

3. 拆分 vendor 包

由于项目第三方的依赖包会越来越多,因为 vendor 包会越来越大(未进行 gzip 情况下一般都有 2M 或以上),首次加载会占用很长时间。此时可以考虑把其他第一方的组件库独立打包,如 echartvantloadshmoment/dayjs

注意:webpack3使用CommonsChunkPlugin实现

Webpack 4及更高版本提供了一个名为SplitChunksPlugin的内置插件,用于自动拆分公共的依赖模块到已有的入口chunk中,或者提取到新的生成的chunk

// webpack.prod.config.js

module.exports = {
  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      minChunks: function (module) {
        // 匹配 node_modules 下的模块
        return module.context && module.context.includes('node_modules');
      }
    }),
    // 从 vendor 中提取出 echarts
	new webpack.optimize.CommonsChunkPlugin({
	  name: 'echarts',
	  chunks: ['vendor'],
	  minChunks: function(module) {
	    return module.resource && /echarts/.test(module.resource)
	  }
	}),
	// 从 echarts 中提取出 echarts-component
	new webpack.optimize.CommonsChunkPlugin({
	  name: 'echarts-component',
	  chunks: ['echarts'],
	  minChunks: function(module) {
	    return module.resource && /component/.test(module.resource)
	  }
	}),
	// 从 vendor 中提取出 vant
	new webpack.optimize.CommonsChunkPlugin({
	  name: 'vant',
	  chunks: ['vendor'],
	  minChunks: function(module) {
	    return module.resource && /vant/.test(module.resource)
	  }
	}),
	// 从 vendor 中提取出 monent / dayjs 合成一个文件
	new webpack.optimize.CommonsChunkPlugin({
	  name: 'moment',
	  chunks: ['vendor'],
	  minChunks: function(module) {
	    return module.resource && (/moment/.test(module.resource) || /dayjs/.test(module.resource))
	  }
	}),
	new webpack.optimize.CommonsChunkPlugin({
      name: 'app',
      async: 'vendor-async',
      children: true,
      minChunks: Infinity, // 默认是 3 的,设置成无限大,实现一个异步一个块
    }),
    // 从 app 中提取出 app-components
	new webpack.optimize.CommonsChunkPlugin({
	  name: 'app-components',
	  chunks: ['app'],
	  minChunks: function(module) {
	    return module.resource && /components/.test(module.resource)
	  }
	}),
    new webpack.optimize.CommonsChunkPlugin({
      name: 'manifest',
      minChunks: Infinity
    }),
    
  ]
  // 其他配置...
};

// 配置插件,由于分割了很多包,所以手动设置一下加载次序
new HtmlWebpackPlugin({
  // 这里要调整成手动排序 chunk
  chunksSortMode: 'manual',
  // 把我们自己分割好的包的 chunk 名一个个按顺序记录在这里,不然打包会报错
  chunks: [
    'manifest',
    'vendor',
    'echarts',
    'echarts-component',
    'vant', 
    'moment',
    'app-components',
    'app'
  ]
}),


加载效果如下:
在这里插入图片描述

参考: https://juejin.cn/post/7117450435920674829

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

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

相关文章

多级留言/评论的功能实现——SpringBoot3后端篇

目录 功能描述数据库表设计后端接口设计实体类entity 完整实体类dto 封装请求数据dto 封装分页请求数据vo 请求返回数据 Controller控制层Service层接口实现类 Mapper层Mybatis 操作数据库 补充:返回的数据结构自动创建实体类 最近毕设做完了,开始来梳理…

题目:线性代数

问题描述: 解题思路: 列相乘,然后行相加。 注意点:由于元素数据范围最大为1e6,两个元素相乘乘积最大为1e12,如果元素类型为int则在乘的过程中就会爆炸,所以需要开long long类型。 AC代码…

深度学习500问——Chapter08:目标检测(6)

文章目录 8.3.7 RetinaNet 8.3.7 RetinaNet 研究背景 Two-Stage 检测器(如Faster R-CNN、FPN)效果好,但速度相对慢。One-Stage 检测器(如YOLO、SSD)速度快,但效果一般。 作者对one-stage检测器准确率不高…

有限单元法-编程与软件应用(崔济东、沈雪龙)【PDF下载】

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

JAVA基础之线程池原理与源码简读

线程 线程是调度CPU资源的最小单位,线程模型分为KLT和ULT模型,JVM使用的KLT模型java线程与OS线程保持1:1的映射关系,也就是说每一个java线程对应操作系统一个线程。Java线程有以下几种生命状态: NEW:新建状态RUNNABL…

STM32——IWDG(独立看门狗)

技术笔记! 1. IWDG(Independent watchdog),即独立看门狗 本质:能产生系统复位信号的计算器。 特性:递减计算器;时钟有独立的RC振荡器提供(可在待机和停止模式下运行)&#xff1b…

数据结构与算法---线性表

线性表 1.顺序表 需求分析 /*创建顺序表具体功能:初始化顺序表销毁顺序表获取顺序表元素个数输出顺序表中的内容自动扩容增 --- 插入数据(包含了尾部添加功能)删 --- 删除数据(包含了尾部删除功能)改 --- 修改数据查…

UDP编程流程(UDP客户端、服务器互发消息流程)

一、UDP编程流程 1.1、 UDP概述 UDP,即用户数据报协议,是一种面向无连接的传输层协议。相比于TCP协议,UDP具有以下特点: 速度较快:由于UDP不需要建立连接和进行复杂的握手过程,因此在传输数据时速度稍快…

【深度学习】第二门课 改善深层神经网络 Week 2 3 优化算法、超参数调试和BN及其框架

🚀Write In Front🚀 📝个人主页:令夏二十三 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:深度学习 💬总结:希望你看完之后,能对…

ASV1000视频监控平台:通过SDK接入海康网络摄像机IPC

目录 一、为何要通过SDK接入海康网络摄像机 (一)海康网络摄像机的SDK的功能 1、视频采集和显示 2、视频存储 3、视频回放 4、报警事件处理 5、PTZ控制 6、自定义设置 7、扩展功能 (二)通过SDK接入的好处(相对…

【1小时掌握速通深度学习面试3】RNN循环神经网络

目录 12.描述循环神经网络的结构及参数更新方式,如何使用神经网络对序列数据建模? 13.循环神经网络为什么容易出现长期依赖问题? 14.LSTM 是如何实现长短期记忆功能的? 15.在循环神经网络中如何使用 Dropout ? 16.如何用循环神经网络实现 Seg2Seq 映射? …

2024新版Java基础从入门到精通全套教程(含视频+配套资料)

前言 Java基础是所有入门java的同学必过的一关,基础学习的牢固与否决定了程序员未来成就的高度。因此,基础学习的重要性不言而喻。 但是很多同学学习java基础知识,要么是学的太“基础”,就是只会各个知识点的简单概念和使用&…

idea 新建spring maven项目、ioc和依赖注入

文章目录 一、新建Spring-Maven项目二、在Spring-context使用IOC和依赖注入 一、新建Spring-Maven项目 在pom.xml文件中添加插件管理依赖 <build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</ver…

恶补《操作系统》4_2——王道学习笔记

4.1_5 文件存储空间管理 1、存储空间的划分与初始化 文件卷&#xff08;逻辑卷&#xff09;的概念目录区与文件区 2、几种管理方法 空闲表法&#xff1a;首位置长度&#xff0c;回收时注意修改空闲链表法&#xff08;空闲盘块链、空闲盘区链&#xff09;位示图法 成组链接法…

2024年 Java 面试八股文——Mybatis篇

目录 1. 什么是Mybatis&#xff1f; 2. 说说Mybatis的优缺点 3. Xml映射文件中&#xff0c;都有哪些标签 4. #{}和&{}有什么区别 5. Mybatis是如何进行分页的,分页插件的原理是什么 6. Mybatis是如何将sql执行结果封装为目标对象并返回的&#xff1f; 7. Mybatis是怎…

JavaWeb--1.Servlet

Servlet&#xff08;基础&#xff09; 1、配置依赖&#xff1a; ​ 在pom.xml文件中加入相关依赖 <dependencies><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>5.0.0&l…

基于Python的LSTM网络实现单特征预测回归任务(TensorFlow)

目录 一、数据集 二、任务目标 三、代码实现 1、从本地路径中读取数据文件 2、数据归一化 3、创建配置类&#xff0c;将LSTM的各个超参数声明为变量&#xff0c;便于后续使用 4、创建时间序列数据 5、划分数据集 6、定义LSTM网络 &#xff08;1&#xff09;创建顺序模…

【ESP32之旅】合宙ESP32-C3 使用PlatformIO编译和Debug调试

工程创建 首先打开PIO Home窗口&#xff0c;然后点击New Project来创建新的工程&#xff0c;工程配置选择如下图所示&#xff1a; 注&#xff1a; 选择板子型号的时候需要选择ESP32C3&#xff0c;勾选取消Location可以自定义路径。 修改配置文件 工程创建完毕之后在工程根…

模式识别作业:颜色算子的三种阈值分割算法

一、引言&#xff1a; 在图像处理中&#xff0c;我们往往需要提取图像的一些关键信息&#xff0c;比如本篇文章的内容——提取颜色&#xff0c;然而当我们需要提取某一种颜色时&#xff0c;无论图像余下的部分如何“丰富多彩”&#xff0c;他们都不再重要&#xff0c;需要被忽…

C#核心之面向对象-继承

面向对象-继承 文章目录 1、继承的基本规则1、基本概念2、基本语法3、示例4、访问修饰符的影响5、子类和父类的同名成员 2、里氏替换原则1、基本概念2、is和as3、基本实现 3、继承中的构造函数1、基本概念2、父类的无参构造函数3、通过base调用指定父类构造 4、万物之父和装箱拆…