前端各技术的比较
loyalvi Lv7

前端各技术的比较

  • vue2 和 vue3
  • 不同前端框架
  • vite 和 webpack
  • Vuex 和 pinia
  • es6+/css3/html5
  • ts 和 js
  • canvas 与 svg
  • sass 和 less

vue2 与 vue3

对比维度 Vue 2 Vue 3
响应式原理 使用 Object.defineProperty() 进行数据劫持,需要遍历所有属性,存在性能开销。 使用 Proxy 代理数据,直接监听对象,减少遍历属性时间,性能更好。
模板语法 使用 v-bind(缩写为 :)绑定属性,v-on(缩写为 @)绑定事件,插值表达式使用 {{}} 基本继承 Vue 2 的模板语法,但在一些细节上有所优化,模板编译生成的代码更精简高效。
组件通信 使用 props 传递数据,$emit 触发事件,跨级通信需借助 $parent$children$refs 或 Vuex。 除了保留 Vue 2 的方式外,还引入了 provideinject 来更方便地实现跨级组件通信。
生命周期钩子 包括 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestroydestroyed 等。 合并了一些钩子,新增了 setuponBeforeMountonMountedonBeforeUpdateonUpdatedonBeforeUnmountonUnmounted 等,还增加了 onRenderTrackedonRenderTriggered(开发环境专用)和 onServerPrefetch(SSR专用)。
性能优化 可通过 v-for 中的 key 值优化列表渲染,使用 computedwatch 优化数据依赖。 内部渲染机制更高效,更新节点时采用更精细的算法,减少不必要的重新渲染;Tree-shaking 技术应用更好,打包体积更小。
API 变化 主要通过 Options API 进行开发,如 datamethods 等。 推荐使用 Composition API,如 refreactivewatchcomputed 等。
编码方式 逻辑分散在多个选项中,不便于重用。 引入 Composition API,基于函数式编程,代码更聚合。
双向绑定 使用 Object.defineProperty() 实现,无法监听数组内部数据变化。 使用 Proxy API 实现,可以监听整个对象及数组内部数据变化。
TypeScript 支持 源码是 JavaScript 编写,需要手动维护类型定义。 源码直接采用 TypeScript 重写,类型信息内置,提供更好的类型推导。
新特性 新增了 Fragment、Teleport、Suspense 等特性。
生态系统 拥有丰富的插件和第三方库,但部分插件可能需要更新才能在 Vue 3 中使用。 生态系统正在不断发展,越来越多的新插件和库开始支持 Vue 3。

以下是 Vite 和 Webpack 的详细对比表格:

对比维度 Vite Webpack
开发服务器启动速度 非常快,利用浏览器原生 ES Module 特性,无需打包即可启动。 较慢,需要先打包代码后才能启动。
热模块替换(HMR)速度 非常快,仅对修改的模块进行重新编译,无需刷新页面。 较慢,需要重新编译相关模块及其依赖。
内存使用 更低,适合大型项目。 较高,尤其在大型项目中。
构建速度 构建时间显著更快,适合中小型项目。 构建时间较长,适合大型复杂项目。
构建大小 构建输出通常更小。 构建输出较大,但可通过配置优化。
配置复杂度 配置简单,开箱即用。 配置复杂,需要手动配置 Loader 和插件。
生态系统 生态系统正在快速发展,插件支持较少。 生态系统成熟,拥有丰富的插件和加载器。
旧版浏览器支持 默认仅支持现代浏览器,需通过插件支持旧版浏览器。 通过配置可支持几乎所有浏览器。
代码分割 支持按需加载。 支持代码分割,可高度自定义。
TypeScript 支持 内置支持,无需额外配置。 需安装额外的 Loader 才能支持。
适用场景 适合中小型项目、快速迭代的开发。 适合大型复杂项目、需要高度自定义的场景。

vue 与其他前端框架的比较

对比维度 Vue React Angular Svelte
核心理念 渐进式框架,强调开发效率和易用性,支持双向绑定与单向数据流。 声明式编程,基于组件构建,强调单向数据流和灵活性。 全面的企业级解决方案,提供完整的开发工具和最佳实践。 编译时框架,无运行时开销,直接生成高效的原生 JavaScript 代码。
性能 响应式系统高效,适合中小型项目。 虚拟 DOM 优化,适合大型复杂项目。 通过 AOT 编译和懒加载优化性能,适合大型企业级应用。 编译时优化,运行时性能最佳,适合性能敏感型应用。
学习曲线 学习曲线平缓,文档清晰,适合初学者。 学习曲线较陡,需要掌握 JSX 和 Hooks 等概念。 学习曲线最陡峭,需要掌握 TypeScript 和复杂配置。 学习曲线适中,语法简单直接。
生态系统 社区活跃度高,生态插件丰富,尤其在亚洲地区。 社区活跃度极高,生态插件最丰富。 社区增长缓慢,但生态完善,适合企业级应用。 社区较小但增长迅速,生态尚在发展中。
适用场景 中小型项目、快速迭代开发、个人项目。 大型复杂项目、需要高度定制化的项目。 大型企业级应用、需要类型安全的项目。 性能敏感型应用、小型到中型项目。
开发体验 模板语法直观,开发效率高。 JSX 将 JavaScript 和 HTML 融为一体,自由度高。 提供完整的工具链和类型安全,适合复杂项目。 语法简洁,接近原生 HTML。
状态管理 内置响应式 API 和 Vuex 状态管理工具。 推荐使用 Redux 或 Context API。 提供依赖注入和内置状态管理。 状态管理是框架内置的一部分。
工具链支持 Vue CLI、Vite 提供全面支持。 Create React App 和 Next.js 是流行选择。 Angular CLI 提供强大的工具链。 SvelteKit 是官方提供的应用框架。
社区支持 社区支持良好,尤其在亚洲地区。 社区支持最为强大,全球开发者众多。 社区支持较强,尤其在企业级应用中。 社区支持逐渐增强,但相对较弱。

pinie 与 vuex

对比维度 Pinia Vuex
设计理念 基于 Vue 3 Composition API,简洁易用 基于 Flux 架构,严格的状态管理规则
状态变更 可以直接在 actions 中变更状态 必须通过 Mutation 来变更状态
模块化 每个 store 是独立的,模块化更灵活 使用 Modules 来分割状态管理
异步操作 可以在 actions 中直接修改状态 在 Actions 中进行异步操作
TypeScript 支持 内置 TypeScript 支持,自动推导类型 支持,但需要手动定义类型
API 简洁性 API 简单,基于 Composition API 相对复杂,需要手动定义 Mutation、Action
调试支持 与 Vue DevTools 的集成也很强大 强大的 Vue DevTools 集成
性能 更加轻量高效,适合 Vue 3.x 项目 性能足够强大,但不如 Pinia 轻量级
社区支持 社区正在快速增长 社区成熟,拥有丰富的插件和工具
学习曲线 学习曲线较平缓,适合初学者 学习曲线较陡,需要理解 Flux 架构
适用场景 推荐用于 Vue 3 项目,适合需要更高开发效率的场景 适合 Vue 2 和 Vue 3 项目,尤其是需要依赖 Vuex 强大生态的项目

defineProperty 和 proxy

对比维度 Object.defineProperty Proxy
拦截范围 只能拦截对象的单个属性操作,无法监听数组的变化、对象新增属性 可以拦截对象的所有操作,包括属性访问、赋值、删除、函数调用等
动态属性支持 无法直接监听动态新增或删除的属性 可以直接监听动态新增和删除的属性
是否破坏原对象 会直接修改原对象的属性 不会破坏原对象,而是生成一个代理对象
性能 性能较差,需要递归遍历对象的所有属性 性能较好,按需代理对象的属性
兼容性 兼容性较好,支持 ES5 及以上环境 兼容性较差,仅支持 ES6 及以上环境
实现方式 通过定义或修改对象的属性描述符来实现监听 通过创建一个代理对象来拦截目标对象的操作
功能丰富度 功能相对有限,只能监听属性的读取和赋值 功能强大,支持多达13种拦截方法
适用场景 适用于简单的属性监听,性能要求不高 适用于复杂场景,需要高性能和强大功能

本地存储

特性/方法 localStorage sessionStorage Cookies IndexedDB
存储方式 键值对 键值对 键值对 对象存储
存储容量 约5MB 约5MB 约4KB 无明确限制(几百MB)
数据持久性 永久存储,除非手动清除 会话结束时清除 可配置过期时间 永久存储,除非手动清除
存储范围 全局(所有标签页共享) 当前标签页 全局(所有标签页共享) 全局(所有标签页共享)
数据安全性 明文存储,不安全 明文存储,不安全 明文存储,不安全 更安全,存储在沙箱环境中
操作方式 同步操作 同步操作 同步操作 异步操作
适用场景 长期存储少量数据,如用户偏好设置 临时存储少量数据,如分页表格的滚动条位置 存储需要传到后端的小数据,如用户token 存储大量复杂数据,如图片、复杂JSON数据
优点 使用简单,永久保存 使用简单,数据生命周期短,自动清理 可自动携带到服务端,数据生存周期可配置 数据量大,数据结构灵活,性能高
缺点 数据是明文存储,只能存储字符串,同步操作可能影响性能 数据是明文存储,只能存储字符串,数据只能存活在当前标签页 大小限制小,容易造成网络请求臃肿,不适合存放敏感信息 API复杂,浏览器兼容性有坑,学习曲线陡峭

计算属性和侦听器 computed & watcher

特性 计算属性(Computed) 侦听器(Watchers)
缓存机制 有缓存,依赖数据未变化时直接返回缓存结果 无缓存,每次数据变化都会执行回调函数
更新机制 同步更新,依赖数据变化时立即更新 可以同步或异步更新,适合复杂逻辑
适用场景 基于现有数据派生新数据,格式化数据等 执行异步操作、复杂逻辑、防抖/节流等
依赖响应式数据 是,依赖 Vue 的响应式系统 是,依赖 Vue 的响应式系统
代码复杂度 简单,适合直接基于数据的计算 更灵活,适合需要手动处理的复杂场景

canvas 与 svg

特性/功能 Canvas SVG
渲染方式 基于像素的位图渲染,适合像素级操作。 基于矢量的图形渲染,适合矢量图形和可缩放场景。
缩放效果 缩放时可能会失真,因为它是基于像素的。 缩放时不会失真,因为它是基于矢量的。
性能 在处理大量像素操作时性能较好,适合复杂的动画和游戏。 在处理复杂图形时性能可能较低,但适合简单的矢量图形和交互。
交互性 不支持DOM操作,需要手动处理交互逻辑。 支持DOM操作,可以方便地绑定事件和实现交互。
文件格式 使用JavaScript动态绘制,不支持直接保存为文件。 可以保存为SVG文件,便于重用和编辑。
文本支持 文本渲染较为复杂,需要手动处理字体和排版。 文本渲染简单,支持CSS样式和排版。
兼容性 被所有现代浏览器支持,但不支持旧版IE(IE8及以下)。 被所有现代浏览器支持,也支持旧版IE(通过VML)。
数据绑定 不支持数据绑定,需要手动处理数据和视图的更新。 支持数据绑定(如D3.js),适合数据可视化。
动画支持 通过requestAnimationFrame实现动画,适合复杂的动画效果。 通过CSS动画或SMIL实现动画,适合简单的动画效果。
开发复杂度 需要较强的JavaScript基础,代码较为复杂。 需要一定的SVG和CSS基础,代码较为简洁。
适用场景 游戏、复杂动画、图像处理、实时数据可视化。 图表、图标、简单动画、数据可视化、可缩放图形。
文件大小 生成的图像文件通常较大(位图)。 生成的文件通常较小(矢量)。
可访问性 较低,因为Canvas是位图,不支持屏幕阅读器。 较高,因为SVG是基于文本的,支持屏幕阅读器。

less 和 sass

特性/功能 Less Sass
语言类型 基于 JavaScript,使用 Node.js 编译。 基于 Ruby,但也有基于 JavaScript 的实现(如 Dart Sass)。
文件扩展名 .less .scss(Sass 的主要语法)或 .sass(另一种语法,较少使用)
变量定义 使用 @ 定义变量,例如:@main-color: #3498db; 使用 $ 定义变量,例如:$main-color: #3498db;
嵌套语法 支持嵌套规则,代码结构更清晰。 支持嵌套规则,代码结构更清晰。
混合(Mixins) 使用 .mixin() 定义混合,通过 @include 使用。 使用 @mixin 定义混合,通过 @include 使用。
继承(Extend) 使用 :extend() 实现继承。 使用 @extend 实现继承。
默认值(Default) 不支持变量默认值。 支持变量默认值,通过 !default 修饰符实现。
函数支持 提供基本的数学运算和颜色函数。 提供更丰富的函数库,包括数学、字符串、颜色等操作。
注释方式 支持单行 // 和多行 /* */ 注释。 支持单行 // 和多行 /* */ 注释。
社区和生态 社区相对较小,但功能稳定。 社区更大,文档和插件资源更丰富。
性能 编译速度较快,适合小型到中型项目。 编译速度可能稍慢,但功能更强大,适合大型项目。
学习曲线 学习曲线较平缓,语法简洁。 学习曲线稍陡,但功能强大,适合需要复杂样式的项目。
浏览器兼容性 需要编译为纯 CSS 后才能在浏览器中使用。 需要编译为纯 CSS 后才能在浏览器中使用。
主流框架支持 Vue.js 等现代框架对 Less 有良好支持。 Ruby on Rails、Angular 等框架对 Sass 有原生支持。

js 和 ts

特性 ES6类 TypeScript类
类型系统 没有内置类型系统,变量和函数的类型在运行时确定,无法在编译阶段进行类型检查 增加了静态类型系统,可以在编译阶段检查类型错误,提高代码的健壮性和可维护性
继承机制 支持继承,通过extends关键字实现子类继承父类,子类可以覆盖父类的方法 支持继承,增加了abstract关键字用于定义抽象类和抽象方法,子类必须实现抽象方法
访问修饰符 不支持访问修饰符,所有属性和方法默认为公有(public 支持publicprivateprotected访问修饰符,可以控制属性和方法的访问权限
只读属性 不支持只读属性,属性的值可以在运行时被修改 支持readonly修饰符,用于定义只读属性,防止属性被修改
静态成员 支持静态属性和静态方法,通过static关键字声明 支持静态属性和静态方法,通过static关键字声明,语法与ES6相同
构造函数 使用constructor定义构造函数,用于初始化类的实例 使用constructor定义构造函数,支持类型注解,可以指定参数类型和返回类型
访问器 不支持getset访问器语法,属性访问较为直接 支持getset访问器,用于封装属性的读写操作,增强属性访问的灵活性和安全性
工具方法 没有内置的额外工具方法,需要手动实现 提供了如getset等工具方法,用于封装属性访问,增强类的功能
语法简洁性 语法简洁,适合快速实现类的基本功能 语法相对复杂,但功能更强大,适合大型项目和需要严格类型控制的场景
编译目标 直接运行在支持ES6的JavaScript环境中 需要编译为JavaScript代码后运行,支持多种JavaScript目标版本(如ES5、ES6等)
通过这个表格,可以更直观地看出ES6类和TypeScript类在功能和特性上的差异。
由 Hexo 驱动 & 主题 Keep
访客数 访问量