Vue中文社区

前端 20 年!正式"干掉" 骨架屏!

在前端世界里,有一件事几乎每个人都干过——写骨架屏(Skeleton)。

Image

常见做法无非两种:

  • 用 Ant Design 这类组件库拼一个
  • 或者自己手写一套骨架组件

问题也很现实:

  • 想做到“和真实 UI 完全一致”,代码会非常多
  • 一旦 UI 改了,骨架屏很容易忘记同步
  • 布局复杂一点(卡片、列表、嵌套结构),基本就是体力活

🚀 Boneyard:拒绝手写骨架屏

最近有个项目开始在圈子里刷屏 —— Boneyard

Image

它做了一件很“反常识”的事:

  • ❌ 不再手写 Skeleton
  • ✅ 直接从真实页面“生成 Skeleton”
Image

让骨架屏不再是 UI,而是“编译产物”

🧠 它到底是怎么做到的?

Boneyard 的核心思路大致就是:

在构建阶段,把真实 UI “拍扁”成骨架数据

核心工作流(非常关键)

整个流程其实很清晰:

正常写你的组件

你不需要写任何骨架 UI:

<Skeletonname="user-card">
<UserCard />
</Skeleton>

运行 CLI 生成骨架

npx boneyard-js build

这一步才是核心:

  • 它会启动浏览器(Playwright)
  • 扫描 DOM
  • 记录所有元素的位置和尺寸

最终生成一份数据文件:

.bones.json

本质就是:

UI → 坐标数据(x / y / width / height / radius)

运行时直接渲染

<Skeletonname="user-card" />

不再依赖真实组件,只渲染“骨架数据”

⚡ 如何快速上手?

大概只需要三步:

安装

npm install boneyard-js

包裹组件

<Skeletonname="card">
<Card />
</Skeleton>

生成骨架

npx boneyard-js build

完成之后就可以直接用了。

🌍 支持哪些框架?

这是 Boneyard 很有意思的一点:它本质是跨框架的

✅ 官方支持

  • React
  • React Native
  • Svelte 5

🧩 Vue 也能用(社区版本)

虽然官方还没有 Vue 版本:

但社区已经有人做了适配 - boneyard-vue

它本质上做了一件事: 用 Vue 实现 Skeleton 运行时

所以你可以这样写:

<Skeletonname="card":loading="loading">
<Card />
</Skeleton>

💥 写在最后

Boneyard 本质是在做一件事:把“骨架屏”从手工活,变成编译产物。

如果说过去 20 年:前端在“写 UI”,那 Boneyard 在做的是:

让 UI 的“加载态”也进入编译时代

当 Skeleton 都开始被编译:

那未来会不会是:

  • loading 不再写
  • animation 不再写
  • 甚至 UI 也不再“手写”

🔗 相关链接

  • Boneyard 官网:https://boneyard.vercel.app/overview
  • Boneyard Vue:https://github.com/samuelbelo/boneyard-vue