vue 首屏优化 + 性能优化 + 打包优化

4 篇文章 0 订阅

一、首屏优化

计算首屏打开时间:在打开时间浏览器 开发者工具 console 中执行 下面代码

(performance.timing.domComplete-performance.timing.navigationStart)/1000

浏览器开发模式,performance 页面标签下可以执行查看


1.用户体验 三 种

loading动画,骨架屏,渐进式加载内容(懒加载)

2. 图片处理 六 种方式

小图片base64, 合并成雪碧图,压缩图片,css动效替换动图,图片懒加载,图片代理加载

图片代理加载
	<image id="imgId">
    function proxyImage(){
        let image = new Image()
        image.onload=function(){
            document.getElementById("imgId").setAttribute("src",this.src)
        }
        return function(src){
            image.src = src
        }
    }


// 图片懒加载 offsetTop < innerHeight+scrollTop

<img src="loading.gif" data-src="1.jpg">
<img src="loading.gif" data-src="100.jpg">

let num = document.getElementbytagname("img").length
let img = document.getElementbytagname("img")
lazyload();
window.onscroll = lazyload
function lazyload(){
  // 可见区域高度
  let seeHeight = document.innerHeight;
 // 滚动条距离顶部的高度funding条距离顶部的高度
 let scrollTop = document.body.scrollTop;
 for(var i=0;i<num;i++){
   if(img[i].offsetTop < seeHeight+ scrollTop){
        var temp = new Image();
        temp.src = imgs[i].getAttribute('data-src');//只会请求一次
        // onload判断图片加载完毕,真是图片加载完毕,再赋值给dom节点
        temp.onload = function(){
          // 获取自定义属性data-src,用真图片替换假图片
          imgs[i].src = imgs[i].getAttribute('data-src')
        }
   }
 }

}

3 打包优化后减小http带宽请求 三种

splitChunks分片公用文件打包,打包压缩,cdn 不需要打包,

4 代码优化 (抖音三剑客,fk需懒)

二、vue 性能优化(代码)

  • 防抖,截流
  • 组件异步加载(按需引入)
  • html,css,js 的写法
  • v-for 两种 : 不和v-if ,代理事件
  • 缓存 : keep-alive + 请求缓存到浏览器storage
  • 需 :长列表虚拟滚动,
  • 懒:图片懒加载,路由懒加载

口诀:抖 ,异 ,三剑客,for ,k, 需, 懒
谐音:抖音三剑客,fk需懒


二、vue 性能优化(代码)

1.html 不渲染的 标签用 vue-fragment 替换

vue 下载包: npm i -s vue-fragment

// main.js里面
import Fragment from 'vue-fragment'
Vue.use(Fragment.Plugin)
// vue页面代码 ,生成的是注释减小dom操作
<template>
	  <fragment>
			<div>test</div>
	</fragment>
</template>

2. js :vue2 数据冻结

//data()里面不需要修改的,冻结后不会递归执行 数据劫持object.definePrototype
object.freeze(mapList) 

3. css scope少用

<div clsss="testPage">测试红色页面</div>
<style scoped>
.testPage{
	background:red
}
</style>

// 加入scoped 后渲染的页面会变成下面,css渲染效率变低
<div clsss="testPage" v-data-7987979 >测试红色页面</div>
<style scoped>
.testPage[v-data-7987979]{
	background:red
}
</style>

4 v-for 不和 v-if 使用

5 v-for 事件代理

不用代理

<div>
	<span v-for='(item, index)' of 100 :key='index' @click=''function() {}">{{item}}</span>
</div>

改成代理

<div @click=''clickEvent">
	<span v-for='(item, index)' of 10000 :key='index' :data-index='index'>{{item}}</span>
</div>
export default {
	methods: {
		clickEvent(e) {
			console.log(`当前选中下标为${e.target.dataset.index}`)
		}
	 }
}


6 缓存:keep-alive 动态缓存 ,请求缓存到浏览器storage

<keep-alive :include=''>

9 组件按需引入异步加载

const AsyncList = () => ({
  component:  () => import("components/List"),
  loading: LoadingComponent,
  error: ErrorComponent,
  delay: 200,
  timeout: 500
})
export default {
  name: 'Example',
  component: {
    AsyncList // 工厂模式
  }
}

9.路由懒加载 三种方法

// 1.webpack的require.ensure技术,也可以实现按需加载
// 2 require 箭头函数
// 3 import 箭头函数
const List2 = r => require.ensure([], () => r(require('@/components/list')), 'list');

const router = new Router({
  routes: [
   {
     path: '/list2',
     component: List2
   },
   {
     path: '/list',
     component: resolve => require(['@/components/list'], resolve)
   },
    {
    path: '/404',
    component: () => import('@/views/error-page/404'),
    hidden: true
  },
  ]
})


三、打包优化

1 避免重复打包文件,

公共文件打包成一个文件,避免多次http请求

module.exports={
    externals:[vue],
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            name: ['vendor','runtime'],
            filename: '[name].js',
            minChunks:2
        }),
    ]
}

2 打包开启gzip压缩

    plugins: [
      new CompressionWebpackPlugin({
        filename: "[path].gz[query]",
        algorithm: "gzip",
        test: new RegExp("\\.(" + productionGzipExtensions.join("|") + ")$"), //匹配文件名
        threshold: 10240, //对10K以上的数据进行压缩
        minRatio: 0.8,
        deleteOriginalAssets: false //是否删除源文件
      })
      

代码来源:https://blog.csdn.net/qq_34707272/article/details/107222943

3 Tree Shaking/Scope Hoisting

4 使用cdn加载第三方模块,extenal 排除打包

5 多线程打包 happypack

6 splitChunks抽离公共文件

打包过程,根据配置设置多个文件
module.exports={
    optimization:{
        runtimechunks:"single" ,// 模块交互时,连接模块的加载解析逻辑
        splitChunks:{
            cacheGroups:{
                commons:{
                    chunks:"initial",
                    minChunks:2,// 使用两次以上的打包到公共文件中
                    minsize:0  
                }
                vendor:{
                    test:/node_moduless/,
                    chunks:"initial",
                    name:"vendor",
                    enforce:true
                }
            }
        }
    } 
}

7 sourceMap优化

devtool:cheap-module-eval-source-map // 开发
devtool:cheap-module-source-map // 生产,没有对应关系eval
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3是一种流行的JavaScript框架,它提供了用于构建用户界面的高效工具和组件。在使用Vue3时,结合TypeScript可以提供更好的类型检查和开发体验。Vue Router是Vue框架的官方路由管理工具,能够轻松实现单页面应用的路由功能。 Pinia是Vue3官方推荐的状态管理工具。它使用类似于Vuex的store模式,但通过使用Vue3的响应性机制,提供了更好的性能和开发体验。 Element Plus是一套基于Vue3的UI组件库,它提供了丰富的功能和美观的界面,可以用于构建现代化的Web应用程序。 在搭建Vue3和TypeScript环境模板时,我们可以使用Vite这个工具。Vite是一个快速的Web开发工具,它基于ES模块的原生浏览器导入功能,能够提供快速的冷启动和热模块替换。我们可以使用Vite的模板来创建一个基于Vue3和TypeScript的项目骨架,以及集成Vue Router和Element Plus。 在进行Vite打包优化时,我们可以采取以下措施来提高打包效率和性能: 1. 使用按需加载:只加载项目所需的模块,减少打包体积和加载时间。 2. 配置代码分割:将代码拆分为多个小块,按需加载,提高页面加载速度。 3. 使用压缩和混淆工具:使用压缩和混淆工具来减小打包体积,提高加载速度。 4. 配置缓存策略:启用浏览器缓存,减少重复加载和网络请求。 5. 使用CDN加速:将一些公共资源,如Vue、Element Plus等引入CDN,提高加载速度。 6. 优化依赖管理:检查项目的依赖关系,合理管理和更新依赖,避免冗余和重复引入。 通过以上优化措施,我们可以提高项目的打包效率和性能,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值