构建内容优先的 Web 运行时(UI 作为透镜,而非模板)

发布: (2026年1月11日 GMT+8 08:19)
4 min read
原文: Dev.to

Source: Dev.to

大多数现代网页应用遵循相同的模式:

  • 设计页面
  • 编写组件
  • 添加路由
  • 永无止境地重复布局逻辑
  • 为每个新页面发送 CSS

重复 UI 开发的示意图

即使使用了现代框架,我们仍然一次又一次地重建同样的页面概念。

于是我开始探索一种不同的方法:

如果页面不是以 UI 的形式编写,而是以结构化内容 + 意图的形式呢?
这正是我正在构建的:一种内容优先的运行时,界面不是固定的,页面以 JSON 节点的形式声明。

思路

而不是像下面这样构建 UI:

// traditional component tree

我会这样声明它们:

{
  "type": "Layout",
  "props": {
    "leftSidebarConfig": {
      "initialView": "rail",
      "elements": [
        { "type": "link", "props": { "label": "Home", "icon": "home", "href": "/" } },
        { "type": "link", "props": { "label": "Catalog", "icon": "palette", "href": "/catalog" } }
      ]
    }
  },
  "children": [
    {
      "type": "Page",
      "props": { "title": "Runtime demo" },
      "children": [
        { "type": "Button", "props": { "variant": "contained" }, "children": ["Click me"] }
      ]
    }
  ]
}

然后运行时挂载它:

GUI.mount(spec, "#root");

为什么这与众不同

  • ✅ UI 只是一个渲染器
  • ✅ 布局可以在所有地方复用
  • ✅ 导航变成了数据
  • ✅ 页面成为聚焦空间
  • ✅ 内容成为主要产出

作为链接列表的导航

不再硬编码侧边栏,导航变成一组链接节点:

{
  "type": "link",
  "props": {
    "label": "Storybook",
    "icon": "auto_stories",
    "href": "https://example.com"
  }
}

现在每个界面都可以共享相同的导航规则、主题绑定和布局逻辑——再也不需要重新构建“侧边栏”。

这开始像是一个浏览器

有一次我意识到: 我正在为结构化内容构建一个浏览器。运行时变成了:

  • 布局引擎
  • 主题引擎
  • 节点渲染器
  • 交互路由器

其他一切都只是内容。页面不再是模板,而是内容所在的空间。

为什么 AI 与之天然契合

这种模型非常适合 AI。AI 不需要生成完整的 React 项目,只需生成小的规范:

{
  "type": "Page",
  "props": { "title": "Themes" },
  "children": [
    { "type": "ThemesCatalog", "props": { "minimal": true } }
  ]
}

没有 CSS,没有路由胶水,没有组件绑定——只有运行时可以渲染的结构化意义。

我正在努力的方向

下一步是把它形式化为“站点规范”:

{
  "site": "this.GUI",
  "nav": [ /* … */ ],
  "pages": {
    "/": { /* spec */ },
    "/catalog": { /* spec */ }
  }
}

于是运行时就成了真正的内容浏览器:

  • 加载路由
  • 挂载规范
  • 重用布局
  • 动态生成聚焦

核心原则

不要构建界面。构建解释意义的运行时。

当你这么做时…… UI 成为一种透镜,而不是模板。

如果你也有同样的痛点,或许会喜欢这个方向。我正把它作为 neurons.me 的一部分公开构建。

Back to Blog

相关文章

阅读更多 »

React 是如何工作的?

Component 是 React 应用的基础,应用由 Component 组成。Component 只是一个返回 UI 的 JavaScript 函数。javascript function App { return Hello ; } JS...