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实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

Vue中插槽slot的使用示例详解

《Vue中插槽slot的使用示例详解》:本文主要介绍Vue中插槽slot的使用示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、插槽是什么二、插槽分类2.1 匿名插槽2.2 具名插槽2.3 作用域插槽三、插槽的基本使用3.1 匿名插槽

springboot+vue项目怎么解决跨域问题详解

《springboot+vue项目怎么解决跨域问题详解》:本文主要介绍springboot+vue项目怎么解决跨域问题的相关资料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,... 目录1. 前端代理(开发环境推荐)2. 后端全局配置 CORS(生产环境推荐)3. 后端注解配置(按接口