前端vue3相关知识点
一、 composition api 和options api的区别,为什么推荐使用composition api?
1. 逻辑组织方式不同: Options API 是按选项类型组织代码(data、methods、computed、watch 分开写,一个功能会散落在多个地方),Composition API 是按业务逻辑组织代码(可以将相关逻辑写在一起,不像options api会被切割);
2. 复用方式不同:composition api复用就是调用函数,没有冲突,不会存在options api的mixins命名冲突,来源不明,不好追溯等问题
3. 可维护性不同: Options API会随着项目和组件变大,被拆散在不同选项里,相关逻辑分散,增加了阅读和维护成本。Composition API可以将相关逻辑写在一个 setup 函数里,逻辑更清晰,可维护性更高;
二、pinia的核心特性是什么,对比vuex的有什么优势?
1.Pinia 的核心特性
模块化和轻量化:
- 每个 store 是独立的模块,不需要像 Vuex 那样要写
modules。 - 配置简单,体积小,学习成本低。
支持 Composition API:
- 与 Vue 3 完美集成,store 可以直接在
setup()中使用。
类型推导友好(TypeScript 支持):
- 能够自动推导 state、getters、actions 类型,减少手动定义类型的麻烦
支持可热重载:
- 开发时修改 store 能即时生效,不需要刷新整个应用。
2. 与 Vuex 对比的优势
- pinia的每个 store 独立,直接导入使用即可,vuex需要写
modules,配置复杂。 - pinia能够自动推导 类型( state、getters、actions),vuex类型推导麻烦,需要额外封装。
- pinia无需 mutations,直接用 actions 改 state。
- pinia完全支持 Composition API,与 Vue 3 生态自然融合。
- 核心是通过拦截对象的
get、set、deleteProperty等,进行依赖收集,当访问对象的属性时,会将当前执行的副作用函数(Effect)与属性建立依赖关系。 - 当数据发生变化时,vue会找到依赖该属性的副作用函数并重新执行,从而触发视图更新。
- proxy拦截的是整个对象,而object.defineProperty拦截的是属性
- object.defineProperty初始化时必须遍历 所有属性,性能消耗大,proxy采用的是懒代理方式,访问到某一层时才代理。
- proxy可以监听带对象的新增或删除,object.defineProperty不能监听到对象的新增或删除。
- proxy可以监听数组索引和长度变化,object.defineProperty不能监听到数组变化。
- proxy对ts开发友好,object.defineProperty类型推导困难,需要额外封装。
如何解决Proxy的局限性:
1.无法监听非对象类型的变化:使用ref来解决即可
2.深层嵌套对象的懒代理问题:对特定深层对象单独调用 reactive()
3.Proxy 不能直接像对象那样监听普通属性变化:使用vue3内置的方法 set, add, delete来触发更新
4.响应式对象被解构赋值,导致对象失去响应式:使用vue3内置方法 toRefs()。
- 函数复用: 允许函数在不同类型间复用,同时保持类型安全。
- 接口和类型复用: 泛型接口或类型可以描述可复用的结构化数据。
- 约束泛型: 类在实例化时可指定不同类型,增加灵活性。
- 类的泛型: 限制泛型类型,保证操作安全。
<script setup lang="ts">
interface Props {
title: string;
count?: number; // 可选
}
const props = defineProps<Props>();
// 使用时 TS 会提示类型
console.log(props.title);
console.log(props.count);
</script>
<script setup lang="ts">
const props = defineProps<{
title: string;
count?: number;
}>();
</script>
- Webpack 的构建理念是「打包构建」,Vite 则是「按需编译」。
- Webpack 会先打包所有模块生成 Bundle,再启动开发服务器,项目越大启动越慢;
- Vite 则利用浏览器原生 ES 模块支持,在开发时直接按需编译源文件,启动速度极快。
- Vite 开发更轻量,Webpack 生态成熟、功能全面,更适合复杂定制场景。
- 因为vite它启动快、热更新快、配置简单、支持现代语法,大幅提升开发效率和维护体验,同时生产构建性能也足够优秀。
- 优化依赖预构建
- 对大型第三方库做预构建,减少开发模式启动时间和 HMR 延迟。
- 按需加载和代码拆分
- 使用动态 import 或 Rollup 的
manualChunks拆分代码,减少主 bundle 体积,提高首屏加载速度。
- 使用动态 import 或 Rollup 的
- 静态资源优化
- 压缩图片、CSS 和 JS,去掉无用的 console 或 debug 代码,减小生产包体积。
- 多环境配置和缓存
- 针对开发、测试、生产环境设置不同配置,同时利用缓存减少重复构建开销。
- 插件优化
- 使用现代插件提高构建效率,比如组件按需引入、静态资源压缩、PWA 支持等。
- 代码分割
- 按路由或模块拆分 JS,首屏只加载必要代码。
- 动态
import()或框架自带路由懒加载实现。
- 按需加载
- 图片、组件、第三方库按需加载。
- 资源压缩和合并
- JS/CSS 压缩、图片压缩、SVG 优化。
- 减少请求体积,加快下载速度。
- HTTP/2 & CDN
- 静态资源使用 CDN 分发,减少跨地域延迟。
- HTTP/2 多路复用同时加载资源,提高并发效率。
- 服务端渲染(SSR)
- 首屏由服务器渲染 HTML,用户看到内容更快。
- 接口优化
- 减少首屏接口请求数量,将接口合并。
- 请求使用缓存或静态生成数据。
- 浏览器缓存
- 服务端缓存(CDN + 缓存策略)

浙公网安备 33010602011771号