前端常见面试题

news2025/1/18 21:14:22

前端常见面试题大全

    • 前端本地存储的方式有哪些?
    • JS 的参数是以什么方式进行传递的?
    • js中的垃圾回收?
    • 作用域链?
    • 什么是闭包?
    • 原型 与 原型链
    • js的继承
    • 判断一个数据是否为数组? => 数组的方法
    • 数组去重?
    • this指向问题?
    • Promise是什么? 构造函数 异步代码的容器
    • 手写promo
    • 深拷贝 浅拷贝
    • http的请求方式
    • http常见状态码
    • https是如何做到更加安全?
    • http常见的加密方案?
    • http2.x优势?
    • 一次完整的http服务的过程?
    • 三次握手?? 四次挥手??
    • 缓存
    • 浏览器如何解析css选择器?
    • 重排重绘?
    • git基本操作
    • 什么是MVVM? 是一种设计模式
    • Vue2 和 Vue3 中监视数据的区别
    • Vue的响应式系统? => 观察者模式(一对多的设计模式)
    • Vue的生命周期?
    • vue组件通信?
    • key的作用?
    • 路由跳转传参的方式
    • 前端如何处理权限问题?
    • 首屏渲染加载过慢导致白屏?
    • Tree-Shaking-树摇原理
    • 前端如何处理权限问题?
    • 首屏渲染加载过慢导致白屏?
    • Tree-Shaking-树摇原理

前端本地存储的方式有哪些?

方式存储大小过期时间备注
localStorage5M永久存储,除非手动清除
sessionStorage5M会话级别(关闭浏览器就销毁; 可以设置过期时间)
Cookie4k默认是会话级别关闭浏览器就销毁; 可以设置过期时间请求自动携带; 原生操作极其麻烦(js-cookie)
Web SQL已废弃
IndexedDB几百M(应用场景极少)可以基于键值对可以存储大量的数据

JS 的参数是以什么方式进行传递的?

  • 原始数据类型: string number boolean null undefined symbol

const a = 1 存的就是值本身, 简单类型的数据在传递参数时 传递就是值, 将来修改时不会互相影响的!!

  • 引用数据类型: array object function

const a = { name: ‘zs’ } 存的是地址/引用, 复杂类型的数据在传递参数时 传递的是引用地址, 将来修改时会互相影响的!!

js中的垃圾回收?

前置理解: 将来浏览器对于不会再次使用的内存空间 是需要控制回收的,
核心问题: 这个内存到底是不是垃圾??? => 引用计数法 标记清除法

  1. 引用计数(ie): 是有问题的!!!

​ 浏览器在分配内存时, 当发现这块内存有一个引用指向他, 就会记录下来这块内存的引用数, 只有当引用数为0时, 才会被确认为垃圾!

无法解决 循环引用 的问题!!! 见图, 引用计数的角度来说, 这块内存确实还有人用, 不认定为垃圾, 不能回收(本应该被回收)

  1. 标记清除(主流浏览器 google firefox):

从根部(全局)出发, 如果找不到这个内存, 就会被标记为"无法到达的对象", 就被认定为垃圾!!!

可以解决 循环引用 的问题!!!

作用域链?

共3种; 全局作用域 局部作用域 块级作用域

作用域存在嵌套的情况, 变量访问规则(就近访问): 从最近的作用域开始查找, 找到了直接用, 没找到往外层找,… 一直找到全局,
变量访问的链式结构 称为 作用域链

什么是闭包?

函数和声明该函数的词法环境的组合

通俗一点: 内层函数访问外层函数的变量

闭包的优势: 缓存数据, 私有化数据
闭包的劣势: 如果不好好处理, 内存泄露(应该释放的内存没被释放)

总结: 因为内层函数访问了外层函数的变量, 如果内层函数被return出去, 将来这个内层函数会被缓存, 同时这个函数中用到的变量也会被缓存, 从而实现数据缓存 数据私有化; 伴随着内存泄露(重置null即可)

原型 与 原型链

​ 每一个构造函数 都有自己的原型对象, 这个原型对象上所有的属性和方法 都可以供实例访问
原型的一家: 构造函数 原型 实例 的关系

​ 原型链: 每个实例都有自己的原型, 原型本身也是个对象, 他也有自己的原型, … 一层层的链式结构 => 原型链
属性的查找规则: 就近查找( obj.hh 从自己本身开始查找, 如果找不到, 去找他的原型, … )

为什么需要原型???
如果没有原型, 所有实例的方法都需要额外分配内存, 这样浪费内存,把公共的方法统一放在一个地方, 供所有实例使用 => 原型的意义

js的继承

原型继承 组合式继承 寄生组合式继承 3种

  1. 原型继承 => 换原型

    Student.prototype = new Person()

  2. 组合式继承 => 换原型 + 借调父类构造函数

    Student.prototype = new Person() 继承了父类的方法
    Student构造函数内部 Person.call(this, …) 借父构造函数初始化自己实例的属性 继承了父类属性

  3. 寄生组合式继承 => 换原型 + 借调父类构造函数

    Student.prototype = new Person()
    Student构造函数内部 Person.call(this, …)

    之前替换原型 需要通过new 父类构造函数得到实例(new做了很多事)
    Object.create(obj) 基于传入的对象, 得到一个新对象, 新对象的__proto__直接指向传入对象

    Student.prototype = Object.create(Person.prototype)
    这一步省略了new的过程, 提升了性能

  4. class Student extends Person {}

判断一个数据是否为数组? => 数组的方法

数组的一家

Array.isArray(数据) true 是数组; false 不是数组

Object.prototype.toString.call(数据) ‘[object Number]’ ‘[object Object]’ ‘[object Array]’ …

数组去重?

  1. new Set方法
[...new Set(arr)]
  1. 准备一个新的空数组, 遍历老数组, 每遍历到一项, 先判断这个数据是否在新数组中存在了, 不存在 push进新的空数组
const arr = [1, 2, 3, 3, 2, 1]
   const temp = []
   arr.forEach(item => {
     if (!temp.includes(item)) {
       temp.push(item)
     }
   })
   console.log(temp)

this指向问题?

  1. 默认绑定 fn() => window
  2. 隐式绑定 obj.fn() => 调用者
  3. 显式绑定 call apply bind => 第一个参数
  4. new绑定 => 创建的实例本身
  5. 箭头函数 不存在this => 外层作用域的this

Promise是什么? 构造函数 异步代码的容器

三个状态 等待中pending 失败rejected 成功fulfilled

new Promise((resolve, reject) => {
… 封装异步代码
结束之后需要手动修改状态
resolve() => 修改为成功状态 => .then
reject() => 修改为失败状态 => .catch
})

状态凝固 => 一旦状态变化了, 将不能再次改变状态

手写promo

// Promise.all([p1, p2, p3, p4]).then((values) => { ... })
Promise.myAll = function(arr) {
  let total = 0
  let temp = []

  return new Promise((resolve, reject) => {
    // resolve 必须传入的arr中每个都成功
    arr.forEach((item, index) => {
      item.then((val) => {
        total++
        // temp.push(val)
        temp[index] = val
    if(total === arr.length) {
      // 都成功了
      resolve(temp)
    }
  })
})

  })
}

// Promise.race([p1, p2, p3, p4]).then((value) => { ... })
Promise.myRace = function(arr) {
  return new Promise((resolve, reject) => {
    arr.forEach(item => {
      item.then((val) => {
        resolve(val)
      })
    })
  })
}

Promise.resolve(1) // 快速创建一个成功的promise
new Promise((resolve, reject) => {
  resolve(1)
})

Promise.reject(0) // 快速创建一个失败的promise
new Promise((resolve, reject) => {
  reject(0)
})

深拷贝 浅拷贝

  • 浅拷贝: 只拷贝一层

  • 浅拷贝指的是对象中对象A需要用到对象B的属性,那么可以将对象B的属性利用for in语句来进行遍历,将需要的属性赋值给对象A,这个过程叫做浅拷贝

{...obj}
  • 深拷贝: 拷贝多层

  • 深拷贝指的是对象中对象A需要用到对象B的属性和方法,那么可以利用递归函数封装函数并且自调用的特点,将对象B的属性利用for in语句来进行多次遍历,将需要的属性、方法赋值给对象A,这个过程叫做深拷贝

    递归
    
    JSON.parse(JSON.stringify(obj))
    

区别:

  • 浅拷贝只可以拷贝简单数据类型(堆内存),对于复杂数据类型只拷贝内存中的堆内存,而栈内存不会拷贝
  • 深拷贝不仅可以拷贝简单数据类型(堆内存),还可以拷贝复杂数据类型(栈内存)

http的请求方式

get 获取
post 添加
delete 删除
put 更新(重置式)
patch 更新(补丁式)

请求报文: 请求行 请求头 请求体; 响应报文: 响应行 响应头 响应体;

http常见状态码

  • 2xx

    200 成功
    201 新建

  • 3xx

    301/302 重定向
    304 协商缓存

  • 4xx

    400 接口传参错误
    401 权限认证失败
    404 找不到

  • 5xx 服务器错误

https是如何做到更加安全?

https比http更加安全 在进行数据传输时, 对数据进行加密处理, 所以更加安全

https加密方案:

  1. 非对称加密 + 对称加密 两者结合
    将来数据传输必须以 对称加密 为主!!! 但是容易一开始泄露对称加密的 密钥
    用 非对称加密 传输 对称加密的密钥
  • 数据真正传输 还是 对称加密 数据传输效率得到保证
  • 非对称加密 传输 密钥 数据安全性得到保证
  1. 数字证书: 加密签发公钥
    将来你访问一个网站, 你希望得到服务端的响应数据, 数据是被对称加密 加密出来的!! 必须拥有密钥
    密钥必须让服务端给你, 通过非对称加密给你,

初步互通消息时, 客户端发送请求, 得到数字证书, 基于数字证书中的公钥 解密出 对称加密的密钥,
就可以解密传输的数据, 正常通信了…

数字证书(权威的CA机构颁发): 包含网站基本信息, 到期时间, 非对称加密的公钥 ,

  1. 数字签名: 防证书被篡改
    数字证书:
    网站: xxxx.xxx.xxxx
    公钥: sdafasdfasdfasdfasdfsadfsadfgdsg
    到期时间: 2040年10月20号
    签发机构: xxx机构
    签名: xxdaddsafsadhgdfhfldghkdfghdfg ==>> 将网站所有信息通过hash加密成签名

http常见的加密方案?

  1. 对称加密: 加密解密同一个密钥(对称) 可逆的过程
  • 优点: 加密效率很高, 加密速度快, 计算量小
  • 缺点: 如果一开始密钥就泄露了, 安全性完全无法得到保障!!!
  1. 非对称加密: 有两把钥匙 公钥 私钥 (公钥加密的数据私钥解密 私钥加密的数据公钥解密)
  • 优点: 安全性得到一定的保障
  • 缺点: 加密解密效率低 慢, 计算量大

例如:我们想去gitee提交信息, 本地生产了两把公钥 私钥, 将公钥给gitee
我(私钥加密) >> gitee(公钥解密)
我(私钥解密) <<
gitee(公钥加密)

  1. hash加密: 不可逆
    128645 ===>>> asdfasdfasdafas

一般后端数据库存储密码 一定是不可逆的hash加密 如md5 sha256

撞库: 暴力 模拟各种各样的密码 加密 得到一本字典
记录下 123456 ===>>> asdfaasdfasdfasd
123456 ===>>> asdfaasdfasdfasd

http2.x优势?

  • http2.x 二进制传输数据(更高效) http1.x文本形式传输数据 计算机只认识 0 1
  • http2.x 头部压缩技术, 减少请求头中重复携带的数据(我用上一次的请求头中的数据), 降低网络负担
  • http2.x 服务器推送技术 可以主动给客户端响应数据, 提高页面加载效率
  • http2.x 多路复用机制, 一个tcp连接 可以承载任意双向数据流, 少创建很多tcp连接(三次握手 四次挥手)

要想发请求, 得先建立tcp连接, 浏览器对于单个域名有6-8连接限制, 一个tcp连接只能发一次请求

一次完整的http服务的过程?

在地址栏中输入 www.jd.com 具体发生了什么???

  1. dns解析: 先拿着你输入的域名, 去找真正的ip地址
  • 每个人的电脑上都有一个文件 hosts, 记录了一些域名和ip映射关系
  • 会优先去本机hosts文件中去获取ip, 如果没有
  • 去找公网dns域名服务器, 获取ip

www.jd.com => 58.242.151.131

  1. 根据ip地址找到对应的服务器, 需要建立tcp连接, 三次握手!!!

  2. 成功建立tcp连接后, 进行http请求

  3. 服务器响应http请求, 浏览器得到网站的首页 index.html

  4. 浏览器解析html页面时, 解析到script link img, 会再发请求 获取 js文件/css文件/图片资源

  5. 浏览器渲染完整的网页给用户

  6. http服务完成后, 关闭tcp连接, 四次挥手!!!

三次握手?? 四次挥手??

三次握手 四次挥手 ==>> 体现出连接与断开的谨慎

三次握手 => 想要让双方确认收发消息的能力!!!

  • 第一次握手 客户端往服务端发消息, 你好, 在么? 能听到么??
    服务器能确认: 服务器可以收消息的能力 客户端有发消息的能力
  • 第二次握手 服务端回消息给客户端 在的! 你能听到我说话么?
    客户端确认: 客户端有发消息的能力, 客户端能收消息; 服务端能发消息 服务端能收消息
  • 第三次握手: 客户端再回消息给服务端 我能听到
    服务端确认: 客户端能发消息 能收消息 服务端能发消息 能收消息

四次挥手 => 为了保证数据传输的完整性

  • 第一次挥手 客户端发消息给服务端 服务端 你这个数据传完了么?
  • 第二次挥手 服务端先回一个消息 你等我一会 我检查一下
  • 第三次挥手 服务端回消息 确实没有了, 都说完了, 你可以走了
  • 第四次挥手 客户端回消息 那我走了 再见!!!

缓存

大类: 数据库缓存 服务器缓存 浏览器缓存
浏览器缓存: http缓存 + Cookie/localStorage/sessionStorage/websql/IndexedDB

http缓存的必要性: 每次重复的资源 希望直接走缓存, 不想每次发请求 => 优化网页加载的效率

  • 强缓存
  • 协商缓存

强缓存: 类似于食品的过期时间
将来第一次请求服务器资源时, 服务器会正常响应给你一张图片, 同时会告诉你这张图片的有效期,
expires: Sun, 25 Jan 2032 09:31:06 GMT (到期时间-绝对时间), 将来处于有效期内 直接走强缓存,
从缓存中获取该图片, 不会再发请求

expires将来会和本机时间对比, 本机时间是可以改的!! 有漏洞

cache-control: max-age=315360000 相对时间 315360000s = 10年 从你拿到该资源后, 10年后必过期

cache-control为主 expires为辅

一旦强缓存失效(未命中强缓存), 这个时候 该资源不能再次使用!!, 必须要发请求问服务端要了
图片这种资源很少会更新, 不存在过期了不能用了!!!

  1. 这次发请求 会带上之前过期的图片资源, 问服务端 哥们 还能用么?? 服务端一检查, 发现没更新,
    此时不需要响应新图片, 直接告诉客户端走缓存, 更新过期时间 304 => 协商缓存成功
  2. 将来如果服务器发现图片更新了, 会直接响应一张新图片(自带新的过期时间), => 协商缓存失败, 200

服务端如何判断图片资源是否更新?
最后修改时间(最小单位秒) last-modified: Tue, 10 Sep 2019 05:51:30 GMT
不一致, 更新了
一致, 没更新

1s内如果发生了多次更新, last-modified就有问题

资源的唯一校验码: ETag: xdsddasfsd
ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化。
如果1s内进行了多次更新, ETag是会实时变化的

强缓存与协商缓存 配合使用 缓存页面资源

浏览器如何解析css选择器?

div h3 span { … }

以为的: 从左往右, 先找所有的div 再找所有div后代中的所有h3 , 再找左右h3后代中的左右span
比如: 页面中有10000个元素, 有4000个div 找4000次; 你需要在这4000个div中找后代中有没有h3, h3 300次

遍历树形结构的所有子节点 查找 比如层级有40层, 子节点会特别多

实际上: 从右往左, 先找所有的span, 再找所有span中有祖辈是h3的, 再找祖辈有div的
比如: 页面中有10000个元素, 有4000个span 找4000次,

你只需要找祖辈中有没有满足条件的, 比如层级有40层 也就40次

  1. 浏览器是如何进行界面渲染的?
  • 解析html, 得到dom树
  • 解析css, 得到样式规则
  • 基于dom树 和 样式规则 得到渲染树
  • 基于渲染树, 进行结构布局(layout) 重排/回流
  • 基于渲染树, 进行绘制(paint) 重绘

重排重绘?

  • 结构的变化 会引起重排

  • 非结构的变化 会引起重绘

重排必将重绘, 重绘不一定重排!!!

尽可能避免重排:

  • 将来如果真要改变盒子大小位置, transform只是视觉效果
  • 集中修改样式 (这样可以尽可能利用浏览器的优化机制, 一次重排重绘就完成渲染)
  • 尽量避免在遍历循环中, 进行元素 offsetTop 等样式值的获取操作, 会强制浏览器刷新队列, 进行渲染
  • 使用文档碎片(DocumentFragment)可以用于批量处理, 创建元素

git基本操作

git服务器 gitee github; 公司中用的多是 gitlab, 支持私有服务器

git常见操作

  • git init
  • git add . git commit m ‘’
  • git push origin xxx-zs
  • git merge
  • git clone xxx
  • git add remote origin …
  • git checkout -b xxx

什么是MVVM? 是一种设计模式

  • M Model(数据层) ajax请求回来的数据
  • V View(视图层) 页面
  • VM ViewModel(视图数据) 既能操作数据 也能操作视图
    • 数据变了, 操作视图自动更新
    • 视图变了, 操作数据自动更新
  1. 双向数据绑定的原理?
  • 如何知道数据变了?
    Vue2 Object.defineProperty
    Vue3 Proxy
  • 如何知道视图变了?
    @change @input

Vue2 和 Vue3 中监视数据的区别

  • Vue2 Object.defineProperty 劫持数据
    针对于每个属性去劫持, 如果数据复杂, 需要递归劫持, 成本高, 效率低
    对于数组数据的劫持/监视, 有问题 ==>> $set
  • Vue3 Proxy
    proxy对于整个对象数据的劫持 对象内部的任意属性发生变化 都会经过外层的proxy, 无需递归, 效率高
    proxy对于数组数据的更新也没问题

Vue的响应式系统? => 观察者模式(一对多的设计模式)

响应式: 数据变化了, 会通知到所有用到该数据的视图自动更新

在这里插入图片描述

观察者模式 目的在于 需要通知对应的watcher进行响应; 依赖收集(找到数据的依赖者)

一上来vue会解析渲染, 会进行依赖收集(找到数据的watcher), 收集到一个大的数据中,
当数据变化时, Object.defineProperty监视到数据变化了, 就会通知到你刚刚收集的watcher们进行响应(派发更新)

watcher也有分类: 侦听器watcher > 计算属性watcher > 渲染watcher

Vue的生命周期?

Vue2                       Vue3
beforeCreate               Setup
created                    Setup
beforeMount                onBeforeMount
mounted                    onMounted
beforeUpdate               onBeforeUpdate
updated                    onUpdated
beforeDestroy              onBeforeUnmount
destroyed                  onUnmounted

activated
deactivated

vue组件通信?

  1. 父传子 子传父
    父传子: 父组件给子组件标签上以添加属性的方式绑数据; 子组件内部通过props接收
   <son title="123" :num="456" />

子传父: 子组件内部通过$emit触发自定义事件; 父组件中需要给子组件标签上注册对应的自定义事件, 提供处理函数

     ```js

this.$emit(‘xx’, 12) <son @xx=“fn” /> fn(val) { … }
```

  1. 事件总线(eventBus) vue3移除了
    理解: 组件A要和组件B通信(两个组件没有任何关系), 有个中介, 借助于eventBus通信
const eventBus = new Vue() 
export default eventBus

组件A => 组件B

组件A发消息:

eventBus.$emit('ss', 123123)

组件B收消息:

eventBus.$on('ss', function(val) { ... })
  1. provide inject 用于某个组件共享数据/方法 给子孙后代组件使用
    vue2中有这个语法 但是不好用,
    vue3中增强了

  2. 提供数据

    provide('val', 123)
    provide('fn', () => { ... 某个数据更新的代码 })
    
  3. 注入数据使用

    const num = inject('val')
    const fn = inject('fn')    fn('123')
    
  4. $refs $children $parent => 可以拿到组件

<Hello ref='hello' />   // 内部通过data提供了一个 money(组件自己的)   this.money
this.$refs.hello.money   

this.$children[0] // 获取组件中 使用到的第0个组件

$parent  // 获取父组件
  1. $attrs $listeners 使用场景: 有很多数据要隔代传
$attrs 批量获取数据 向下传递
$listeners  批量向上传递自定义事件
  1. Vuex
  • state 提供状态
  • mutations 提供修改状态的方法(同步的)
  • actions 提供消化异步操作的方法 - 不能直接在action中修改状态(异步操作结束后提交mutation)
  • getters 类似计算属性
  • modules 分模块
    namespaced: true 命名空间
this.$store.commit('mutation名', 123) // 页面中触发mutation 同步派发任务
this.$store.dispatch('action名', 123) // 页面中触发action  异步派发任务
  1. pinia 官方推荐的vue3使用的状态管理工具

  2. 提供状态

    state() {
      return {
        count: 0,
        money: 100
      }
    }
    
  3. actions用于修改状态(同步异步都可以) 修改状态 获取状态 直接通过this

    actions: {
    fn() {
      this.money = 1000
    },
    fnAsync() {
      const res = await Api()
      this.count = res.data.data
    }
    }
    
  4. getters

  5. store/user.js

export default defineStore('user', {
  state() {
    return {
      username: 'zs',
      age: 19
    }
  },
  actions: {
    addAge() {
      this.age++
    }
  }
})

页面组件如何使用仓库数据

import useUserStore from '@/store/user.js'
const user = useUserStore()
{{user.username}}  @click='user.addAge'

key的作用?

添加一个唯一标识, 优化对比复用策略(默认下标), 提高渲染性能

对比真实结构? 虚拟dom
真实dom结构太复杂了, 属性特别多,
一个js对象模拟真实dom结构, 身上只有关键的几个属性

真实dom结构 树形的!! 虚拟dom结构模拟也还是树形! 遍历一层还是巨大的!!

diff算法:

  • 首先比根元素, 如果根元素不同, 直接销毁重建!!!
  • 如果根元素相同, 对比出其他差异(属性), 考虑往下继续复用
  • 如果是兄弟元素, 默认按照下标去比, 建议添加key属性, 优化对比策略, 提升渲染性能

路由跳转传参的方式

query传参(多) params传参(极少) params传参配合动态路由使用(多)

  • 在地址栏传递的 刷新不丢失
this.$router.push('/login?name=zs&age=19')
this.$router.push({
  path: '/login',
  query: {
    name: 'zs',
    age: 19
  }
})
this.$route.query.name
  • 刷新会丢失, 在内存中传递
{ path: '/test', component: Test, name: 'test' } // 路由规则中设置name
this.$router.push({
  name: 'test'
  params: {
    money: 100
  }
})
  • 地址栏中传递, 刷新不丢失
{ path: '/user/:id', component: User } // 必须配合动态路由使用
this.$router.push('/user/123')
this.$route.params.id

前端如何处理权限问题?

RBAC role based access control 基于角色的权限控制
给员工分配角色 给角色分配权限 (给员工直接分配权限的危害)

1.页面访问权
在你点击登录之后, 在路由跳转之前, 获取你的个人信息(包含roles: [‘home’, ‘salary’, ‘social’]),
将来基于这个字段通过 addRoutes 动态添加对应的路由规则(动态路由), 因为你有这个权限, 所有你又这个路由规则, 所以你能访问这个页面

2.按钮操作权
在你点击登录之后, 在路由跳转之前, 获取你的个人信息(包含btns: [‘del’, ‘edit’]), 将来在页面中可以封装一个方法,
得到某个用户到底有没有这个按钮权, 有3种形式: 1. v-if 2. 禁用 3. 给你看给你点 给你提示 你权限不够

3.api访问权(后端)

首屏渲染加载过慢导致白屏?

  • 组件懒加载 路由懒加载 异步组件
  • 图片资源等压缩
  • cdn加速(花钱)

Tree-Shaking-树摇原理

https://juejin.cn/post/6844903544756109319

丢失

{ path: '/user/:id', component: User } // 必须配合动态路由使用
this.$router.push('/user/123')
this.$route.params.id

前端如何处理权限问题?

RBAC role based access control 基于角色的权限控制
给员工分配角色 给角色分配权限 (给员工直接分配权限的危害)

1.页面访问权
在你点击登录之后, 在路由跳转之前, 获取你的个人信息(包含roles: [‘home’, ‘salary’, ‘social’]),
将来基于这个字段通过 addRoutes 动态添加对应的路由规则(动态路由), 因为你有这个权限, 所有你又这个路由规则, 所以你能访问这个页面

2.按钮操作权
在你点击登录之后, 在路由跳转之前, 获取你的个人信息(包含btns: [‘del’, ‘edit’]), 将来在页面中可以封装一个方法,
得到某个用户到底有没有这个按钮权, 有3种形式: 1. v-if 2. 禁用 3. 给你看给你点 给你提示 你权限不够

3.api访问权(后端)

首屏渲染加载过慢导致白屏?

  • 组件懒加载 路由懒加载 异步组件
  • 图片资源等压缩
  • cdn加速(花钱)

Tree-Shaking-树摇原理

Tree-Shaking性能优化实践 - 原理篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AQS源码解析 2.简介 内部核心结构

AQS源码解析—简介 & 内部核心结构 AQS内部结构 简介 AbstractQueuedSynchronizer&#xff1a;AQS&#xff0c;抽象队列同步器。主要是为了解决线程锁竞争的问题。 AQS 原理图如下&#xff0c;其本质是一个双向链表/队列 多线程抢锁内部数据结构&#xff0c;如下 核…

m基于matlab的站点休眠中继CDMA网络动态节能控制算法仿真与性能分析

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 蜂窝网络不仅需要能够为用户提供高质量的语音服务&#xff0c;而且要能够提供大量的数据传输服务&#xff0c;这就决定了蜂窝网络的发展必须要进一步提高系统容量和高速数据速率覆盖&…

银行人总结5个影响系统性能的因素,怕是很多人都会忽略

性能测试往往在投产上线前开展&#xff0c;无法对整个系统变更进行全面的覆盖测试&#xff0c;因此性能测试需求提出十分关键。 性能测试需求交付过程中&#xff0c;需要对开发团队提出的测试需求进行审查&#xff0c;重点分析交付的测试需求是否充分覆盖了影响系统性能的因素…

Cisco Packet Tracer HSRP技术练习

公司拓扑图 交换机配置参数表&#xff0c;如表2-3-4所示。 表2-3-4 交换机配置参数表 交换机 vlan IP地址 hsrp组 虚拟网关地址 核心1 Vlan 10 172.16.10.252/24 10 172.16.10.254/24 Vlan20 172.16.20.252/24 20 172.16.20.254/24 核心2 Vlan 10 172.16.10.…

基于springboot+vue的高校迎新系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

Android App开发实战项目之仿手机QQ动感影集动画播放(附源码和演示视频 可直接使用)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 动感影集就是只要用户添加一张图片&#xff0c;动感影集就能给每张图片渲染不同的动画效果&#xff0c;让原本静止的图片变得活泼起来&#xff0c;辅以各种精致的动画特效&#xff0c;营造一种赏心悦目的感觉。 一、需求描述 …

Cadence Allegro PCB设计88问解析(十八) 之 Allegro中差分规则设置

一个学习信号完整性仿真的layout工程师 我们在进行layout设计时&#xff0c;进行会遇到差分信号的layout&#xff0c;像USB和HDMI等&#xff0c;是需要控制阻抗的&#xff0c;那么我们在走线的时候&#xff0c;也需要从电器规则和物理规则上设置差分要求&#xff0c;今天和大家…

K8S kube-scheduler-master CreateContainerError 问题解决及思路

错误信息1&#xff1a; kubectl get pods 发现pod状态一直在 runing-error-CrashLoopBackOff -循环 解决方法&#xff1a;1&#xff0c;查看日志。 kubectl logs pods web-674477549d-zx8gmkubectl describe pods web-674477549d-zx8gm 没有发现错误&#xff0c;并且服务器资源…

2023年MBA/MPA/MEM联考笔试答题抓分点

距离今年的管理类联考还有一个月左右的时间&#xff0c;在最后这个阶段&#xff0c;除了继续稳固的提升自身应试的基本能力之外&#xff0c;一些细节和技巧也要特别关注和留意&#xff0c;说不定可以在考场上帮自己更好的抓分。今天杭州达立易考教育为大家整理主观题答题的五个…

链表OJ题+牛客题

目录 206.反转链表 876.链表的中间节点 链表中倒数第k个节点 CM11链表分割 OR36 链表的回文 206.反转链表 给你单链表的头节点head,请你反转链表&#xff0c;并返回反转后的链表。 实现如下结果&#xff1a; 思路&#xff1a; 取链表中的节点头插&#xff1a; 代码&#…

操作系统的奋斗(二)

第二章 进程与线程2.1进程与线程2.1.1进程的概念、特征、状态与转换2.1.2进程的组织、控制、通信2.1.3进程和多线程模型2.2处理机调度2.2.1调度的概念、目标、实现2.2.2典型的调度算法2.2.3进程切换2.3同步与互斥2.3.1同步与互斥的基本概念2.3.2实现临界区互斥的基本办法2.3.3互…

IPv6与VoIP——配置Cisco CME实现VoIP实验

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.配置Cisco CME实现VoIP 1.实验环境 2.需要设备 Cisco P Co…

解决TypeError: type complex doesn‘t define __round__ method

在调整学习率的时候遇到的一个bug&#xff0c;现已解决。 首先看这个bug说的是&#xff1a;类型complex&#xff08;复数:ij&#xff09;类型不能使用round函数。 为啥不能使用呢&#xff1a; round函数是四舍五入&#xff0c;round(lr,10)就是取lr四舍五入后十位。而复数不能…

分享一套宾馆客房管理系统源码,功能完善,代码完整

淘源码&#xff1a;国内专业的免费源码下载平台 需要源码学习可私信 基本介绍&#xff1a; 本宾馆管理系统是一套成熟的客房管理软件,综合了国内多家同行业软件的优点。具有操作简单、功能全面。 适用于酒店、宾馆、招待所等提供住宿服务的企业。 功能简介&#xff1a; 包括入…

文献学习02_A Survey on Deep Learning for Named Entity Recognition_20221121

论文信息 Subjects: Computation and Language (cs.CL) &#xff08;1&#xff09;题目&#xff1a;A Survey on Deep Learning for Named Entity Recognition &#xff08;命名实体识别的深度学习研究综述&#xff09; &#xff08;2&#xff09;文章下载地址&#xff1a;ht…

私域流量对企业的好处

互联网商业人群在这种时代里&#xff0c;不断寻求突破&#xff0c;开拓创新&#xff0c;很好的将线上和线下结合起来&#xff0c;其中涌现了很多“互联网”模式以及一些新的概念。 比如社交电商、社群零售、私域流量等。这些新互联网商业概念&#xff0c;催生了很多大型企业&…

公众号免费网课查题方法

公众号免费网课查题方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xf…

charles抓包配置具体操作步骤

Charles主要功能 截取Http和Https网络封包 支持重发网络请求&#xff0c;方便后端调试 支持修改网络请求参数 支持网络请求的截获并动态修改 支持模拟慢速网络 Charles下载安装 charles下载地址&#xff1a;https://www.charlesproxy.com/download/ 注&#xff1a; 浏览…

匹配系统(下)

创建SpringCloud目录 目录 创建SpringCloud目录 创建我们的两个子项目 实现两个Interface Config网关 放行完事两个Api 封装后端逻辑 对接我们的匹配系统 修改数据库-天梯分 更改数据库对应的一些修改 实现我们匹配之后的逻辑的思路 具体实现过程 关于线程锁 来进…

【扩展阅读之编译和解释语言的区别】

扩展阅读之编译和解释语言的区别1 本节目标2 解释型语言和编译型语言3 标识符、关键字、保留字1 本节目标 知道解释型语言和编译型语言的特点知道标识符不能是关键字或保留字 2 解释型语言和编译型语言 程序语言翻译成机器语言的工具被称为翻译器。翻译器翻译的方式有两种&a…