CSP 管得住脚本从哪个域加载,管不住页面自己往 innerHTML 里塞了什么字符串。Trusted Types 把危险 DOM Sink 的写入变成浏览器强制审查,这篇讲它的机制、落地代码和撞见的真实麻烦。
围绕复杂中后台、配置平台与数据可视化的技术沉淀,记录工程化、性能优化与协作工具的实际用法。用文章把问题、方案和判断留下来。
从核心主题中挑选更能代表内容深度的文章,适合快速了解博客的技术关注点。
light-dark() 函数和 color-scheme 属性能不能替换项目里现有的暗色模式实现,这篇给出具体判断标准:暗色变量数量、是否依赖 data-theme 做第三方组件适配,以及原生表单控件、滚动条怎么借 color-scheme 自动换色。
shadcn/ui 不发 npm 包、直接把组件源码装进你的仓库。聊聊这种 copy-in 模式的好处、维护成本、和传统组件库(Antd/MUI)的取舍。
无限级菜单看着是个递归组件,实际牵着路由高亮、权限过滤、图标映射和接口数据清洗。这篇把该在数据层收干净的活,和只留给递归模板的活拆清楚。
团队要做一个多人协同编辑的功能,传统的后端合并冲突加乐观锁在多人同时改同一段内容时很难写干净;记录一下改用 CRDT、用 Yjs 落地协同文档的过程,以及这套方案要付出的代价。
最近更新的技术记录。
Svelte 4 的响应式声明依赖编译期静态分析,没法在组件外的普通模块里复用;Runes 用 `$state`、`$derived`、`$effect`、`$props` 这套显式 API 解决了这个问题,这篇记录我们把内部发布看板一部分模块迁移到 Runes 后的具体判断。
几十万个点位的散点图在 Canvas 2D 下卡到没法交互,换 WebGL 也只是把卡顿从主线程挪到了每帧几千次 draw call 上——记录我排查这个瓶颈、最终用 WebGPU 的 Compute Shader 重写数据聚合逻辑的过程。
评估一个离线优先的文档编辑器要不要把数据存进浏览器时,IndexedDB 的异步 API 在高频写入场景下写起来啰嗦、性能也一般,OPFS 提供的同步访问句柄和更接近真实文件的操作方式是另一条路,这篇讲清楚它的存储模型、权限模型、和 IndexedDB/Cache Storage 的分工,以及配额和数据清除时该怎么应对。
Speculation Rules API 能让浏览器提前预取甚至预渲染下一跳页面,比 link rel=prefetch 和悬停预加载库更进一步,但预渲染错页面会白白浪费带宽,预渲染有副作用的页面还可能提前触发埋点或写操作,这些代价得先算清楚。
长任务把主线程堵住的时候,setTimeout(fn, 0) 和 requestIdleCallback 都救不了场——scheduler.postTask() 的优先级参数和 scheduler.yield() 的循环内让出,才是浏览器原生给出的任务调度方案。
记录给后台表格行加一个操作菜单时,把原本要手写的 z-index、点击外部关闭、Esc、焦点管理和定位计算,逐步换成 popover 属性、dialog 元素和 CSS 锚点定位的过程,附选型判断和可运行代码。