- https://juejin.cn/book/7127092198096502822/section/7127210360884428812
evan
讲稿笔记
以下内容均为讲稿笔记
开发范式&底层框架
React Hooks
 - 已经彻底取代了Class Components
 - 启发了组件逻辑表达和逻辑复用的新范式
 - Vue Composition API | Sevelte | SolidJS
 
React Hooks的开发体验问题逐渐被正视
- Hooks执行原理和原生JS心智模型的差异
 - 不能条件式调用
 - Stale Closure(过期闭包)的心智负担
 - 必须手动声明useEffect依赖
 - 如何“正确”使用useEffect是个复杂的问题
 - 需要useMemo / useCallback等手动优化
 
React 团队对改善开发体验的努力
- useEvent RFC改善
 - useCallback 的问题
 - Dan Abramov花大量时间改进新版useEffect文档
 - 黄玄正在开发中的React Forget意再避免需要手动声明依赖
 
基于依赖追踪的范式重新得到重视
- SolidJS | Vue Composition API | Ember Starbeam
 - https://github.com/starbeamjs/starbeam
 - 共同点:一次调用,符合原生JS直觉;自动追踪依赖,无需手动声明;引用稳定,无需useCallback
 
基于编译的响应式系统
- Svelte | Vue Reactivity Transform | solid-labels
 - Svelte简洁的代价:只能在Svelte组件内使用|组件外需要不同的API|只能在顶层作用域使用,不可在函数体内使用
 - Vue Reactivity Transform | solid-labels : 可在组件和普通JS/TS文件中使用
 
统一模型的优势和代价
- 优势:利于长期的重构和服用
 - 代价:底层实现的抽象泄漏,初期的学习成本
 
基于编译的运行时优化
- Svelte| Solid | Vue Vapor Mode
 - 不同策略对生成代码量的影响(组件数量/打包后总大小)
 
工具链
原生语言再前端工具链中的使用
- esbuild(Go)
 - SWC(Rust)
 - Bun(Zig)
 - Parcel 2 (JS/Rust hybrid)
 - Vite(JS/ Go hybrid via esbuild)
 - napi-rs(Rust)
 
原生语言在前端工具链中的使用
- 原生语言更适用于用例专注且标准相对稳定的情况,否则很难榨取最大化的性能优势
 - 原生语言会影响可扩展性,增加社区参与门槛,影响生态发展
 - JS/原生混合工具链将会成为常态
 
工具链的抽象层次
- 专注于打包,抽象层次低 - browserify | webpack | rollup
 - 专注于应用,抽象层次高 - parcel | vue-cli | cra
 - cli专注于应用,抽象层次高;API专注于支持上层框架,抽象层次中 - vite
 
基于Vite的上层框架
- Nuxt3 | SvelteKit | Shopify Hydrogen | Astro | Qwik | FastifyDX | Solid Start | Laravel新默认前端方案
 
上层框架Meta Frameworks
一个语言,前后“打通”
数据的前后打通
Next - getStaticProps/getServerSideProps
Nuxt - API routes + useFeth + top level await
Remix loader/action + enhanced HTML Form
通过显式引入共享类型
自动基于DB schema生成类型
Nuxt3 自动基于文件布局生成API/路由类型
全栈的代价
- 虽然数据已经渲染出了HTML,但还是需要额外发送一份数据用于Hydrate
 - 即使在客户端没有交互的组件依然会被打包发送至用户端
 - Hydrate 影响页面交互指标(TTI)
 
社区的探索方向
- Server-only Components(Hydrogen, Next, Nuxt)
 - Partial hydration / Island Architecture (Astro, Isles, Fresh)
 - Fine-grained + resumable hydration (Owik)
 - Shell + partial hydration (VitePress)