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

本文主要是介绍vue2项目webpack3.x打包文件分割优化加载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.jsmodule.exports = {plugins: [new webpack.optimize.CommonsChunkPlugin({name: 'vendor',minChunks: function (module) {// 匹配 node_modules 下的模块return module.context && module.context.includes('node_modules');}}),// 从 vendor 中提取出 echartsnew webpack.optimize.CommonsChunkPlugin({name: 'echarts',chunks: ['vendor'],minChunks: function(module) {return module.resource && /echarts/.test(module.resource)}}),// 从 echarts 中提取出 echarts-componentnew webpack.optimize.CommonsChunkPlugin({name: 'echarts-component',chunks: ['echarts'],minChunks: function(module) {return module.resource && /component/.test(module.resource)}}),// 从 vendor 中提取出 vantnew 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-componentsnew 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({// 这里要调整成手动排序 chunkchunksSortMode: 'manual',// 把我们自己分割好的包的 chunk 名一个个按顺序记录在这里,不然打包会报错chunks: ['manifest','vendor','echarts','echarts-component','vant', 'moment','app-components','app']
}),

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

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

这篇关于vue2项目webpack3.x打包文件分割优化加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958663

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺