最近在头疼vue项目打包的问题,看着辛辛苦苦写的项目写完后,打包到线上的用户体验很糟糕,实在是无地自容。后面接触了一些打包优化的方法,如今作一个开发总结,这个技术栈就是vue+element-ui+axios+echarts,使用webpack打包构建工具,算是一个经验笔记只谈,文章如有不足之处,还请各位大侠指点一二,我会尽快改正,谢谢!css
Vue项目的页面是使用的虚拟路由,页面内容是靠vue-router配置的路由连接来访问的,SPA单页面应用开发,适合开发后台系统,可是对搜索引擎不友好,由于最后只生成一个页面。html
搜索引擎是靠页面的连接来爬取网页内容,而后搜录进去搜索引擎数据库的,而vue打包之后的项目只有一个页面,因此其中的内容搜索引擎蜘蛛固然没法收录,这是一个比较很差的地方,固然后期能够进行SEO优化。前端
因此当你的项目vue组件不少时候,打包之后的首屏渲染优化就是一个很是重要的问题,改善性能,提升加载打开速度,是很关键的一点。vue
下面,我就vue中的路由异步懒加载作一个方法分享,建议若是组件不是不少的项目不要使用这种方法,会增长加载时间和速度,对于组件不少的项目能够采用这种方法。node
可是这种方法组件多了,加载就会变慢,打包之后的app.js
文件体积会变得很是大,后面使用比较经常使用的两种。jquery
import example from '../components/example.vue'
复制代码
使用import把组件分割成一个个小的单独的文件,缩小文件体积。webpackChunkName里面的就是这个组件/子组件的打包后的名字。webpack
const example = () => import(/* webpackChunkName: "group-example" */ '../components/example.vue')
复制代码
下面就是我比较喜欢的require方法,这个也是能够把组件分割成小的块。ios
const example = resolve => require(['../components/example.vue'], resolve);
复制代码
因为是后台项目,因此选择element-ui框架进行后台系统搭建,因此对这个进行优化也能够减少体积,提升速度和减小加载时间,提升用户体验。nginx
对这个框架的优化可使用第三种方法,可是我仍是比较喜欢这种方法,就是对组件不用全局引入,仍是改为按需加载的比较好。git
import elementUI from 'element-ui'
Vue.use(elementUI)
复制代码
这种方法对于只用少许element-ui组件的状况来讲,不少组件都是多余的,会无形中加大加载时间和项目打包后的体积,因此使用下面这种按需引入的方法能够有效解决这个问题。
下面是演示代码:通常是表单和表格用的较多。
// 按需引入
import {
Form,
Button,
Table,
} from 'element-ui'
// 按需使用
Vue.use(Form)
Vue.use(Button)
Vue.use(Table)
复制代码
还要一些加载和消息提示等的组件,如下写法:
// 按需引入
import {
Loading,
Message,
MessageBox,
Notification,
} from 'element-ui'
// 按需使用
Vue.use(Loading.directive)
// 挂载到vue实例上面
Vue.prototype.$loading = Loading.service
Vue.prototype.$msgbox = MessageBox
Vue.prototype.$confirm = MessageBox.confirm
Vue.prototype.$alert = MessageBox.alert
Vue.prototype.$prompt = MessageBox.prompt
Vue.prototype.$message = Message
Vue.prototype.$notify = Notification,
复制代码
使用通知组件能够,这么调用也能够,Notification(options)
,或者Notification.success(options)
。
众所周知,平常开发过程当中,前端这块早就已经开始进行工程化和组件化开发了,因此免不了下载各类node包,使得打包后的体积也是很是的庞大,下面使用webpack的一个配置外部扩展就能够解决这类问题。
webpack官方文档是有一个配置用来处理各类依赖包打包优化的,这是【externals外部扩展】。
使用方法:这个案例以jQuery为主。
index.html
的head
标签中写入。<script src="https://code.jquery.com/jquery-3.1.0.js" integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk=" crossorigin="anonymous"> </script>
复制代码
webpack.config.js
属性就是你在项目中引入的名称,后面的值就是jQuery的暴露出的方法名称。
externals: {
jquery: 'jQuery'
}
复制代码
import $ from 'jquery';
$('.my-elem').animate(/*some things*/);
复制代码
这样三步之后,打包后的文件体积会缩小不少,一个不是很明显,可是不少个包使用这种方法,效果就比较显著了。
这里使用国内的bootcdn服务,版本的话你本身项目使用的哪一个就引入哪一个。
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
<script src="https://cdn.bootcss.com/vue-router/3.0.7/vue-router.min.js"></script>
<script src="https://cdn.bootcss.com/vuex/3.1.1/vuex.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.19.0/axios.min.js"></script>
<script src="https://cdn.bootcss.com/element-ui/2.10.1/index.js"></script>
复制代码
webpack.base.conf.js
中entry属性后面加下面一段:一样的,属性是包暴露出的方法名称,后面的值是你在项目中使用的名称。
externals: {
'vue': 'Vue',
'vue-router': 'VueRouter',
'vuex': 'Vuex',
'element-ui': 'elementUI',
'axios': 'axios',
}
复制代码
实战事后,发现上面的配置方法有写问题,因此调换了个,就一切🆗了。
这个也是压缩文件的一个方法,线上服务器的nginx也开启gzip功能更好;取消资源地图,能够有效保护源码。
在webpack的build文件中,开启Gzip压缩功能和禁用资源地图。
module.exports = {
// ...
build: {
productionSourceMap: false,
productionGzip: true,
}
}
复制代码
这样作的话,打包之后就不会再有sourceMap文件了,也会多了几个以.js.gz
后缀名的文件。
最后,介绍一点平常开发过程当中用到的依赖包分析包,开启之后能够可视化的观察每一个包的体积,帮助你整理分析每一个包的结构。
npm i -D webpack-bundle-size-analyzer
复制代码
引入方法两种
// commondjs方法
var WebpackBundleSizeAnalyzerPlugin = require('webpack-bundle-size-analyzer').WebpackBundleSizeAnalyzerPlugin;
// es6方法
import { WebpackBundleSizeAnalyzerPlugin } from 'webpack-bundle-size-analyzer';
复制代码
在webpack的配置文件中插件部分加入:
module.exports = {
// ...
plugins: [
new WebpackBundleSizeAnalyzerPlugin('./reports/plain-report.txt')
]
// ...
}
复制代码
使用上面配置会生成如下内容:
<webpack-output-path>/reports/plain-report.txt
:
marked: 27.53 KB (14.9%)
lru-cache: 6.29 KB (3.40%)
style-loader: 717 B (0.379%)
<self>: 150.33 KB (81.3%)
复制代码
因为vue-cli已经集成了这个插件,因此使用方法就是下载插件,最后执行命令npm run build --report
就能够打包后查看了,会自动在http://localhost:8888
打开。
最后看一下优化后的效果:
打包前:
打包后:
打包前:
打包后:
打包前:
打包后:
打包前:
打包后:
此次说的vue项目总结方法,只是优化方法中的几种,随着业务场景的变化,还会衍生出其余问题,要相信还有其余方法没有发现和使用,项目优化任重道远,还要很长的路要走下去,我会一直默默的优化下去的。