前端知识
工程化
Vite和Webpack
- 使用过vite和webpack创建工程的经验,深有体会
- Vite启动很快,webpack启动较慢
- Vite冷启动很快仅需启动devserver,webpack需要将依赖整体打包,vite在需要使用时按需加载模块
- vite原生支持对vue文件ts文件的转换以及一些css预处理器的loader(如sass、less),webpack需要配置对应的loader
- vite更轻量化,适合小型项目;webpack支持的配置项更多更灵活
-
vite rollup esbuild什么关系?
- 开发阶段vite使用esbuild进行打包,将cjs模块转换为ESM,可以按需加载,项目启动快
- rollup在vite打包时使用,支持tree-shaking和代码分割
-
pnpm 和 npm区别,为什么pnpm更快
-
pnpm 幽灵依赖
- 幽灵依赖是指未在package.json中明确声明却在包中引用的情况
- pnpm通过软链接的方式在node_modules中保留了层级关系,对于相同的依赖在.pnmp文件夹下保存不同版本的依赖包
babel和polyfill
- polyfill - 新增不支持的属性
- babel - 将高级语法转义为低级语法
JS基础
- ES6新特性
- 箭头函数
- 解构赋值
- Promise async/await
- 可选链
- 位置相关属性
- pageX 点击位置距离相对于整个文档的左侧 pageX = clientX + scrollLeft
- scrollTop 页面已经被滚动去的部分
- offsetX 点击位置相对于触发事件的元素的左侧 内容区域,不包括padding和边框
- clientX 相对于浏览器窗口的位置
Array方法
- indexOf 和 includes比较的原理
- arr = [NaN] arr.indexOf(NaN) // -1 arr.includes(NaN) // true
- 内部都是基于全等运算符===进行比较的,但是includes中对特殊值NaN进行处理
- push pop shift unshift
- slice splice
- map reduce
- some every
CSS相关
flex
- 主轴方向
- 水平垂直相关属性
- flex:1的作用
容器属性
- flex-direction 主轴方向
- justify-content 主轴上元素的对齐方式
- align-items 交叉轴上的对齐方式
- align-content 多条轴线的对齐方式
- flex-wrap 在轴线上排列不下的换行方式
项目属性
- order 排序方式 整数 越小的越靠前 可为负数
- flex 是flex-grow flex-shrink(可选) flex-basis(可选)的合并 -> flex-grow (flex-shrink) (flex-basis)
- flex-grow 项目的扩展比例
- flex-shrink 项目的缩小比例 0为不缩小
- flex-basis 设置项目占据的固定空间 可设置为像素值px 默认为auto
- align-self 可以单独为某个项目设置在交叉轴上的对其方式,会为单个元素覆盖其align-items属性
rem布局
CSS长度单位
- 绝对长度 in cm mm pt pc
- 相对长度 px % vw vh em rem
- em相当于父元素的字体大小 rem只会去看根元素html的字体大小
网络相关
状态码
- 100 继续请求
- 200 成功相关
- 200 成功
- 206 部分响应
- 300 重定向
- 301 永久重定向 浏览器会记录下新的location之后都去请求新的location
- 302 临时重定向
- 304 缓存未修改 可以进行缓存中读取 协商缓存
- 400 客户端错误
- 400 请求参数错误
- 404 资源未找到
- 403 未授权的操作
- 500 服务器错误
- 500 服务器错误
- 503 服务不可用
强缓存和协商缓存
- 强缓存
- 使用cache-control响应头规定最大过期时间,过期后就抛弃缓存重新请求获取最新数据
- 协商缓存
- 每次请求都会询问服务器是否过期,如果过期服务器会返回状态码200和最新的数据;如果未过期会返回状态码304
- 浏览器发送请求头If-Modify-Since是一个时间值,服务器判断在这个时间节点前是否修改,未修改响应304
- 浏览器发送请求头If-None-Match是文件的hash值,服务器重新计算哈希值进行判断,如果相同响应304
Vue相关
响应式原理
teleport
自定义指令
生命周期hook
- bind 初始化阶段一次性配置
- inserted 元素被绑定到父节点
- update vnode更新时触发
- componentUpdate vnode当前节点和子节点全部更新后
- unbind 解绑时触发一次
vueRouter
-
两种模式
- History
- history.pushState history.replaceState 不会引起页面刷新
- 需要nginx配合转发到前端SPA入口文件由前端做页面路由,否则会404
- Hash
- 监听window上的hashchange事件
- History
-
路由hook
- 全局hook
- beforeEach
- afterEach
- 组件内hook
- beforeRouteEnter
- beforeRouteUpdate
- beforeRouteLeave
- 路由独享hook
- beforeEnter
- 全局hook
Vue2 Vue3的区别
1. 响应式原理
- vue2基于Object.defineProperty实现,是对对象的每个属性单独设置getter和setter,所以新增的属性不能被响应式获取到;
- Vue3基于Proxy实现,直接对整个对象进行代理,省去了vue2原本需要递归去为每一个对象属性添加监听的操作
- 为什么Vue2修改数组索引无效? 基于Object.defineProperty对数据进行监听,在数组对象中无法为每个索引增加getter和setter监听,可以通过数组方法实现响应式更新,因为vue内部重写了数组的方法并在之后通知了订阅这个数据的watcher将变化patch到对应的视图上
2. API模式不同
- vue2是选项式API,可以通过mixin抽离;只支持单根组件,必须在外层用一个div包裹
- vue3是组合式API,便于抽离;支持多根组件
3. 性能优化
- vue3优化了虚拟dom算法
- vue3中v-if优先级高于v-for vue2中 v-for优先级更高
- vue3中生命周期去除 beforeDestroy/destroyed 改为beforeUnmount/unmounted
4. 开发生态
- vue2脚手架默认是webpack 状态管理用vuex
- vue3脚手架默认为vite 状态管理推荐用pinia
Git
- git fetch 和 git pull
- git fetch会将所有分支的信息都拉取过来,但是不自动进行合并
- git pull会将当前活跃分支的远程仓库内容拉取下来并自动进行合并
- git rebase
- 变基
- git rebase -i 合并多个提交
优化相关
错误上报、埋点
- 采集
- 浏览器onerror
- 框架自带错误回调
- 上报
- gif图片上传
- sendBeacon
- source-map
- 入库分析
- 构建上层监控平台
场景相关
换肤
- 主题全局sass less变量
axios
- 如何取消重复请求
Websocket
- 心跳机制
-
- 连接建立后定期发送心跳数据
-
- 服务端接收到心跳数据后进行回应
-
- 如果未收到回应进行重连
-
- 重连成功后重置重连计数
-
- 重连次数达到上限时取消连接
-
微前端
- qiankun
-
原理 类似于vue-router实现方式,single-SPA应用,通过监听浏览器path的变化将匹配到的路由对应的子应用渲染到容器上
-
如何实现通信
-
- 通过发布订阅模式设计
-
- 主应用中首先初始化全局变量initGlobalState,在注册子应用时传递
// 主应用 import { initGlobalState } from 'qiankun'; const state = { user: 'admin' }; const actions = initGlobalState(state); // 注册子应用时传递 actions registerMicroApps([{ entry: '//localhost:8080', props: { actions } }]); -
- 子应用中获取/修改变量
mount(props) { props.onGlobalStateChange((state) => { console.log('状态变更:', state); }, true); // true 表示立即触发回调 props.setGlobalState({ user: 'guest' }); // 修改状态 }
-
-
如何实现js隔离
-
- 快照沙箱 在应用激活时将当前window进行快照保存,恢复时将快照逐一恢复
-
- 改进的快照沙箱 避免了全部遍历window对象造成的开销
-
- Proxy沙箱 直接在监控对象上进行修改,每个应用有一个独立的Proxy对象
-
-
解决了那些问题?
- 模块太多,每次构建上线都需要整体打包
- 项目启动时需要整体打包编译
- 拆分模块,可以跨框架,A应用Vue B应用React
-
MutationObserver 和 IntersectionObserver
- MutationObserver 监控DOM变化 添加子节点 属性变更等
- IntersectionObserver 判断是否与视口有交叉 可以做图片懒加载功能