TypeScript strict 模式开了一年,聊聊收益
一年前在新项目里开了全套 strict(strict、noUncheckedIndexedAccess、exactOptionalPropertyTypes),刚开始大家都很痛苦,现在回头看收益巨大。 最大的改变: 重构敢动手了,编译器会兜底。 null 处理变严谨,runtim
Posts
Start discussions like a forum — great for questions, opinions, tool recommendations, and experience sharing.
一年前在新项目里开了全套 strict(strict、noUncheckedIndexedAccess、exactOptionalPropertyTypes),刚开始大家都很痛苦,现在回头看收益巨大。 最大的改变: 重构敢动手了,编译器会兜底。 null 处理变严谨,runtim
几个内部包 + 主应用 + 文档站,迁到 pnpm workspace,整体体验不错。比 npm/yarn workspace 稳很多。 关键配置: 用 workspace: 协议锁内部包版本。 filter 做按需构建,CI 时间砍半。 用 changesets 管版本发布。
听说 TanStack Router 类型安全做得好,拿一个内部工具试了一周。结论是:类型体验确实吊打 Next.js,但生态和心智模型有学习成本。 最爽的是路由参数和 search params 全类型推导,再也不用手写 as string 。 不爽的: 文件路由约定还在演进,
以为 Server Actions 不走 fetch 就没 CORS 问题,结果部署到独立后端域名后,浏览器照样拦。 原因:Actions 本质是 POST 到一个 endpoint,跨域照样受 CORS 约束。需要在 API 层(或反代)显式允许 origin。 特别要注意 N
做一个纯静态文档站,想用 output: 'export' 全量 SSG,build 出 HTML 直接丢 CDN。但担心页面多了 build 顶不住。 试了下 5000 篇文档:build 时间 8 分钟,输出 1.2GB。还能接受。瓶颈在 generateStaticPara
App Router 下做全局 toast,传统的 context + provider 模式套在 root layout 会把整棵树变成 client component,RSC 全废。 现在流行的解法: 用 zustand / jotai 这类非 React Context
App Router 的 loading.tsx 本质是给整个路由包 Suspense,用得好首屏体验起飞,用不好就是 "闪一下骨架屏再闪一下内容"。 踩过的坑: loading.tsx 是静态的,没法根据加载进度切换。 嵌套路由每个 segment 都可以加 loading,层
React 19 终于把 ref 当普通 prop 传了,函数组件不用再 forwardRef 包一层。对组件库作者来说是大好事,API 简洁多了。 但迁移有坑: forwardRef 还能用,但官方标记 deprecated 警告。 既有组件库大改 API,可能要发 major
审计一个慢页面,发现一堆 useMemo 。把 "为优化而优化" 的 memo 删了之后,页面反而快了 30%。 原因:很多 memo 缓存的对象在依赖变化时频繁重建,memo 本身的开销 它省下的渲染。特别是缓存的值只被传给原生 DOM 元素时,完全没必要。 经验法则: 缓存值
接手的项目首屏 JS 1.2MB,扒了下发现一堆组件被无脑标了 'use client' ,整片子树都在客户端渲染。 花了两天做了一次清理: 把不依赖交互的展示组件改回 server。 真正交互的组件下沉到叶子节点。 共享 util 区分 server / client 版本。
需要在路由跳转前做权限校验和埋点,App Router 下没有 pages router 时代的页面级拦截,middleware 又只能做粗粒度的事。 摸索出几种方案: middleware:全局拦截,适合鉴权。 layout 里检查:每层 layout 可以 throw red
做一个不需要 SSR 的小工具,分享一下最精简的 Vite + React + Tailwind 起手配置。 vite.config.ts 里加 Tailwind 插件,CSS 里一行 @import "tailwindcss"; 。不用 postcss、不用 tailwind.