# 2022 前端技术趋势

TIP

原作者: 尤雨溪

# 底层框架

# React Hooks

  • Func Component 逐渐取代了 Class Component
  • 启发了组件表达逻辑和逻辑复用的新范式
    • Vue Composition API
    • Svelte
    • SolidJS

# React Hooks 的开发体验问题

  • Hooks执行原理
  • 不能条件式调用
  • 过期闭包的问题
  • 必须手动声明 useEffect
  • 需要 useMemo / useCallback 手动优化

# React 团队的努力

  • useEvent RFC 改善 useCallback 的问题
  • useEffect 新文档 (@Dan Abramov)
  • React Forget 编译时优化开发体验 (@黄玄)

# 依赖追踪的编程范式

  • Solid JS
  • Vue Composition API
  • Ember Starbeam

solid

// state
const [count, setCount] = createSignal(0)
// effect
createEffect(() => console.log(`${count()}`))
// update
setCount(count() + 1)

vue

const count = ref(0)
watchEffect(() => console.log(count.value))
count.value++

starbeam

const count = Cell(0)
DEBUG_RENDERER.render({
  render:() => console.log(count.current)
})
count.set(prev => prev + 1)

# 依赖追踪范式的共同点

  • 一次调用,符合原生 JS 直觉
  • 自动追踪依赖,无需手动声明
  • 引用稳定,无需 useCallback

# 基于编译的响应式系统

  • svelte
  • vue reactivity transform
  • solid-laabels

svelte

let count = 0
// label 语法
$:console.log(count)
count++
  • 只能在组件内使用
  • 只能在组件顶层作用域使用

vue

let count = $ref(0)
watchEffect(()=>console.log(count))
coount++

solid-labels (opens new window)

let count = $signal(0)
$effect(()=>console.log(count))
count++

# 基于编译的运行时优化

  • Svelte
  • Solid
  • Vue Vapor Mode

# 工具链

# 原生语言在前端工具链中的使用

  • esbuild (go)
  • swc (rust)
  • bun (zig)
  • parcel2 (js/rust)
  • vite (js via esbuild)
  • napi-rs (rust)

(JS/原生)混合工具链将会成为常态

# 工具链的抽象层次

专注打包

  • browserify
  • webpack
  • rollup

专注应用

  • parcel
  • vue-cli
  • create-react-app
  • cra

灵活

  • vite cli 应用
  • vite api 中层

# 上层框架

# 数据的前后端打通

  • Next getStaticProps / getServerSideProps
  • Nuxt useFetch + Top Level await
  • Remix loader / action + enhanced HTML Form

# 类型的前后端打通

  • 通过显式的引入共享类型
  • 自动基于数据库的 schema 生成类型
  • Nuxt3 自动基于文件布局生 API/ 路由类型

# JS 全栈的代价

  • 数据渲染HTML,还需要额外发送一份数据用于 Hydrate
  • 没有交互的组件也会被打包
  • Hydrate 影响页面交互指标

# 社区的探索方向

  • Server-only Components (Next, Nuxt)
  • Partial hydration (Astro, Fresh)
  • Fine-grained + resumable hydration (Qwik)
  • Shell + partial hydration (VitePress)