前端架构

Home Assistant 前端使用 Web Components 构建。这是一项现代 Web 技术,允许我们将模板、样式和逻辑封装到单个文件中,并在浏览器中以 HTML 标签的形式暴露。这些组件可以自由组合,为我们的应用提供非常动态且强大的基础。

结构

Home Assistant 前端可以拆分为 4 个部分:

Bootstrap

文件:src/entrypoints/core.ts

这是一个非常小的脚本,是页面中最先加载的内容。它负责检查认证凭据并建立与后端的 websocket 连接。

这个脚本让我们能够在下载其余 UI 的同时并行开始下载数据。

App shell

文件:src/entrypoints/app.ts

这部分包含渲染侧边栏和处理路由所需的一切。

Panels

文件夹:src/panels/

Home Assistant 中的每个页面都是一个 panel。组件可以注册额外的 panel 供用户使用。panel 的示例包括 "states"、"map"、"logbook" 和 "history"。

Dialogs

文件夹:src/dialogs

某些信息展示和数据录入会以流程的形式呈现给用户。Dialogs 可以在任何页面触发。最常见的是实体 more info dialog,它允许用户深入查看实体的状态、历史和设置。

数据流

前端通过 Websocket APIRest API 与 Home Assistant 交互。

数据通过 hass 属性提供,并向下传递给每个组件。hass 属性包含核心状态,并带有调用 API 的方法。

组件可以订阅核心状态中不可用的信息。订阅通过 websocket API 进行,从而使数据与后端保持同步。

我们使用单向数据流。当你在后端进行更改时(例如打开一盏灯),hass 对象会在应用根部更新,并提供给每个需要它的组件。

路由

前端使用去中心化路由。每个组件只了解足以处理自己负责部分的路由信息。更深层的路由会继续沿组件树向下传递。

例如,<home-assistant> 主组件会查看 url 的第一部分来决定应加载哪个 panel。每个 panel 都可以定义自己从 url 到展示内容的映射关系。