在本篇文章中,博主总结了一些常见的vue2框架性能优化方法和项目启动出现白屏的原因,还望走过路过的同行和大神们点赞关注,多多指教,用你们发财的小手给予博主大大的鼓励。
const Foo=()=>import('./foo.vue')
const router=new VueRouter({
routes:[
{path:'/foo',component:Foo}
]
})
避免重复创建组件实列,且能保留缓存组件状态。
在列表数据进行遍历渲染时,需要为每一项item设置唯一的key值,方便vue.js内部精准找到该条列表数据。当state更新时,新的状态值和旧的状态值相比,较快的定位到diff
v-for比v-if优先级高,如果每一次都需要遍历整个数组,将会影响速度,尤其是当之需要渲染很小一部分的时候,必须情况下应该替换为computed属性。
vue会通过Object.defineProperty对数据进行劫持,来实现视图响应数据的变化,然而有些时候我们的组件就是纯粹的数据展示,不会有任何改变,我们不需要vue来劫持我们的数据,在大量数据展示的情况下这能够很明显的减少组件初始化的时间,那如何禁止vue劫持我们的数据呢?可以通过Object.freeze方法来冻结一个对象,一旦被冻结的对象就再也不能被修改了
export default{
data(){
return{
users:{}
}
},
async created(){
const users=await axios.get("/api/users");
this.users=Object.freeze(users)
}
}
不再变化的数据可以使用v-once
Vue组件销毁时,会自动清理他与其他实例的连接,解绑它的全部指令以及事件监听器,但是仅限于组件本身的事件,如果在js内使用addEventListener等方式时不会自动销毁的,我们需要在组件销毁时手动移除这些事件的监听,以免造成内存泄漏
created(){
addEventListener('click',this.click,false)
}
beforeDestory(){
removeEventListener('click',this.click,false)
}
对于图片加载过多的页面,过了提高页面的加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载,等到滚动到可视区域后再去加载,这样对于页面的加载性能上会有很大的提升,也提高了用户体验,我们在项目中使用vue-lazyload插件
1.安装
npm install vue-lazyload --save -dev
2.在入口文件main.js引入并使用
import VuelazyLoad from 'vue-lazy-load'
然后在vue中直接使用
Vue.use(VueLazyLoad)
或者添加自定义选项
Vue.use(VueLazyLoad,{
preload:1.3,
error:'dist/error.png',
loading:'dist/loading.gif',
attempt:1
})
3.在vue文件中将img标签的src属性直接改为v-lazy,从而将图片显示方式更改为懒加载显示
我们在项目中经常会需要引入第三方插件,如果我们直接引入整个插件,会导致项目的整个体积太大,我们可以借助babel-plugin-component,然后只引入需要的组件,以达到减小项目体积的目的,以下为项目中引入elementui组件库
npm install babel-plugin-component -D
{
"presets":[["es2015",{"modules":false}]] ,
"plugins":[
[
"component",
{
"libraryName":"element-ui",
"styleLibraryName":"theme-chalk"
}
]
]
}
import Vue from 'vue'
import {Button,Select} from 'element-ui'
Vue.use(Button)
Vue.use(Select)
服务器渲染是指Vue在客户端将标签渲染成的整个html片段的工作在服务端完成,服务端形成的html片段直接返回给客户端的这个过程就叫做服务器渲染
如果你的应用存在非常长或者无效滚动的列表,那么需要采用窗口化的技术来优化性能,只需要渲染少部分区域的内容,减少重新渲染组件和创建dom节点的时间,可以参考开源项目"vue-virtual-scroll-list"和vue-virtual-scroller来优化这种无限列表的场景。
路由模式有误
由于把路由模式mode设置成history。默认是hash
解决方法:
改为hash或者直接删除模式配置,如果非要用的话,在服务端加一个覆盖所有情况的候选资源
dist中文件引用路径错误
打包后的dist目录下的文件引用路径不对,因找不到文件而报错导致白屏
解决方法:
修改config下面index.js的模块导出路径
浏览器不支持es6
在项目中使用了es6语法,一些浏览器不支持es6,造成编译错误不能解析而造成白屏
解决方法:
安装Babel ,Babel 会把这些新语法转译成较低版本的代码。
加载文件资源过大
单页面应用的html是靠js生成,因为首屏需要加载很大的js文件(app.js和vendor.js),所以当网速差的时候会产生一定程度的白屏
路由懒加载,
//1. vue异步组件技术
{
path:"/home",
name:'Home',
component:resolve=>require(['../views/home.vue'],resolve)
}
//2. es6提案的import()
{
path:'/',
name:'home',
component:()=>import('../views/home.vue')
}
//3. webpack提供的require.ensure()
{
path:'/home',
name:'Home',
component:r=>require.ensure([],()=>r(require('../views/home.vue')),'home')
}
组件懒加载
//import方式
components:{
"dailyModal":()=>import("./dailyModal.vue")
}
// require 方式
components:{
"dailyModal":resolve=>require(['./dailyModal.vue'],resolve)
},
解决方案
1.将 vue、vue-router、vuex、axios 这些 vue 全家桶的资源,全部改为通过 CDN 链接获取,在 index.html 里插入相应链接
<body>
<div id="app">div>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js">script>
<script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js">script>
<script src="https://cdn.bootcss.com/vuex/3.1.0/vuex.min.js">script>
<script src="https://cdn.bootcss.com/vue-router/3.0.2/vue-router.min.js">script>
<script src="https://cdn.bootcss.com/element-ui/2.6.1/index.js">script>
body>
2.在 vue.config.js 配置 externals 属性
module.exports = {
···
externals: {
'vue': 'Vue',
'vuex': 'Vuex',
'vue-router': 'VueRouter',
'axios':'axios'
}
}
3.卸载相关依赖的 npm 包
npm uninstall vue vue-router vuex axios
const CompressionPlugin = require('compression-webpack-plugin')
configureWebpack: (config) => {
if (process.env.NODE_ENV === 'production') {
config.plugins.push(
new CompressionPlugin({
// gzip压缩配置
test: /\.js$|\.html$|\.css/, // 匹配文件名
threshold: 10240, // 对超过10kb的数据进行压缩
deleteOriginalAssets: false, // 是否删除原文件
})
)
}
}
productionSourceMap: false,
SSR,服务端渲染,在服务端事先拼装好首页所需的 html
首页加 loading或 骨架屏(优化体验)
随着 SPA 在前端界的逐渐流行,单页面应用不可避免地给首页加载带来压力,此时良好的首页用户体验至关重要。很多 APP 采用了“骨架屏”的方式去展示未加载内容,给予了用户焕然一新的体验。
所谓的骨架屏,就是在页面内容未加载完成的时候,先使用一些图形进行占位,待内容加载完成之后再把它替换掉。在这个过程中用户会感知到内容正在逐渐加载并即将呈现,降低了“白屏”的不良体验。