资讯详情

资讯详情

Astro Toolbar App 示例解析:开发一个挂载到 Astro Dev Toolbar 的自定义应用

Astro Toolbar App 示例解析开发一个挂载到 Astro Dev Toolbar 的自定义应用【免费下载链接】astroThe web framework for content-driven websites. ⭐️ Star to support our work!项目地址: https://gitcode.com/GitHub_Trending/as/astro本文以 Astro 仓库中的 examples/toolbar-app 示例为骨架完整讲解Dev Toolbar App这一开发工具形态它的项目结构、app.ts与integration.ts两个核心文件各自的职责以及如何在集成Integration中通过addDevToolbarApp把应用挂载进astro dev的开发者工具栏。读完本文你可以照着仓库示例编写自己的 Toolbar App并理解 Astro 底层的类型定义、加载与校验机制。一、这个示例是干什么的Astro 的 Dev Toolbarastro dev时页面右下角的工具栏允许第三方集成注册自定义应用Custom Toolbar App用于在开发期间展示诊断信息、配置开关或调试面板。examples/toolbar-app就是一个Toolbar App Starter Kit——专门用于初始化这类应用的脚手架项目可以通过以下命令创建npm create astrolatest -- --template toolbar-app它不是普通的 Astro 站点而是一个会被其他 Astro 项目以集成形式引入的独立包app.ts里是你的 Toolbar 应用逻辑integration.ts则负责把它接入宿主项目的工具栏。二、项目结构仓库中该示例的实际文件组织与 README 中给出的结构一致源码位于src/目录编译后输出到dist/examples/toolbar-app/ ├── src/ │ ├── app.ts # Toolbar 应用的全部业务逻辑 │ └── integration.ts # Astro 集成定义用于将应用挂载进工具栏 ├── package.json ├── tsconfig.json └── README.md两个核心文件的分工app.ts应用逻辑主体。Toolbar App 的绝大多数代码都写在这里——UI 渲染、事件监听、与开发服务器的通信等。integration.ts一个标准的 Astro 集成文件唯一职责是在astro:config:setup钩子里调用addDevToolbarApp向宿主项目注册应用 ID、名称、图标、入口文件。这种应用逻辑与集成注册分离的设计使得同一个 Toolbar App 包可以独立构建、独立发版而宿主项目只需引入其导出的集成即可。三、app.ts用defineToolbarApp编写应用逻辑示例的 src/app.ts 完整代码如下import { defineToolbarApp } from astro/toolbar; export default defineToolbarApp({ init(canvas) { const astroWindow document.createElement(astro-dev-toolbar-window); const text document.createElement(p); text.textContent Hello, Astro!; astroWindow.append(text); canvas.append(astroWindow); }, });要点defineToolbarApp从astro/toolbar虚拟模块导出。从源码 packages/astro/src/toolbar/index.ts 可以看到它的实现就是一个恒等函数作用是提供 TypeScript 类型约束export function defineToolbarApp(app: DevToolbarApp) { return app; }init回调的参数签名。根据 packages/astro/src/types/public/toolbar.ts 中的DevToolbarApp类型定义一个 Toolbar App 最多可以定义两个生命周期钩子export type DevToolbarApp { init?( canvas: ShadowRoot, app: ToolbarAppEventTarget, server: ToolbarServerHelpers, ): void | Promisevoid; beforeTogglingOff?(canvas: ShadowRoot): boolean | Promiseboolean; };init(canvas, app, server)应用挂载时调用。示例中只用了第一个参数canvas一个 ShadowRoot 节点在其内部创建了一个astro-dev-toolbar-window窗口并追加一段文本第二个参数app是事件目标可监听工具栏相关事件第三个参数server是与开发服务器通信的辅助方法。beforeTogglingOff(canvas)应用即将被关闭时调用返回false可阻止关闭——适合在应用持有未提交状态时提示用户。示例未使用此钩子。专用 Web Components 元素。同一类型文件中的全局声明declare global列出了 Toolbar UI 库提供的一批自定义元素你的应用可以直接用document.createElement创建它们从而获得与原生工具栏一致的样式与交互astro-dev-toolbar-window、astro-dev-toolbar-tooltip、astro-dev-toolbar-highlight、astro-dev-toolbar-toggle、astro-dev-toolbar-badge、astro-dev-toolbar-button、astro-dev-toolbar-icon、astro-dev-toolbar-card、astro-dev-toolbar-select、astro-dev-toolbar-radio-checkbox等。示例中的astro-dev-toolbar-window即其中之一。四、integration.ts用addDevToolbarApp注册应用示例的 src/integration.ts 完整代码如下import { fileURLToPath } from node:url; import type { AstroIntegration } from astro; export default { name: my-astro-integration, hooks: { astro:config:setup: ({ addDevToolbarApp }) { addDevToolbarApp({ id: my-toolbar-app, name: My Toolbar App, icon: , entrypoint: fileURLToPath(new URL(./app.js, import.meta.url)), }); }, }, } satisfies AstroIntegration;关键参数对应源码中的DevToolbarAppEntry类型见 packages/astro/src/types/public/toolbar.ts参数类型说明idstring应用的唯一标识工具栏内部用它区分各应用namestring显示在工具栏中的名称iconIcon可选工具栏中展示的图标示例中用 emoji entrypointstring \| URL应用的 JS 入口文件路径即app.ts编译后的产物实现上有两个值得注意的细节注册发生在astro:config:setup钩子中。从 packages/astro/src/integrations/hooks.ts 可见该钩子上下文提供的addDevToolbarApp只是把入口对象推入设置数组addDevToolbarApp: (entrypoint) { updatedSettings.devToolbarApps.push(entrypoint); },也就是说所有集成注册的 Toolbar App 会累积到settings.devToolbarApps中供后续的工具栏插件统一处理。入口校验是运行时的。packages/astro/src/toolbar/vite-plugin-dev-toolbar.ts 是真正加载这些应用的 Vite 插件它会在生成的代码中逐个safeLoadPlugin每个入口并强制校验入口必须默认导出一个对象、且该对象必须包含id、name、entrypoint属性对应 Apps must be an object with an id, a name and an entrypoint. 的报错。加载失败时会通过console.error输出Failed to load dev toolbar app from ...并通过 HMR 通道发送astro:devtoolbar:error:load事件而不是让整个开发服务器崩溃——单个 Toolbar App 出错的隔离性由此保证。另外entrypoint使用fileURLToPath(new URL(./app.js, import.meta.url))的写法是因为该包type: module且以 ESM 方式构建需要相对于当前模块解析出编译产物dist/app.js的绝对路径。五、构建与发布package.json和tsconfig.json从 package.json 可以看出这个脚手架的构建约定{ name: example/toolbar-app, type: module, peerDependencies: { astro: ^4.6.1 }, scripts: { build: tsc, dev: tsc --watch, prepublish: npm run build }, exports: { .: ./dist/integration.js, ./app: ./dist/app.js }, engines: { node: 22.12.0 } }几个与 README 命令表对应且值得展开的点npm run build→tscTypeScript 直接编译到./dist由 tsconfig.json 中的outDir: ./dist和rootDir: ./src决定tsconfig 继承自astro/tsconfigs/strict。因此 README 命令表中的npm run buildBuild your app to./dist/和npm run devtsc --watch监听源码变化增量编译都是纯 tsc 行为不涉及 Vite 构建。exports的双入口设计.导出dist/integration.js——宿主项目在astro.config.mjs的integrations数组里引入的是它./app导出dist/app.js——即 Toolbar 应用本身的入口与integration.ts中注册的entrypoint相对应。peerDependencies声明 astroToolbar App 依赖宿主项目提供astro/toolbar虚拟模块与工具栏运行时因此 astro 是 peer 依赖而非直接依赖devDependencies中的astro仅用于本地开发时的类型检查。README 中的完整命令表CommandActionnpm install安装依赖npm run dev监听源码变化自动增量构建应用npm run build将应用构建到./dist/六、在宿主项目中使用把这个包发布或本地链接后宿主 Astro 项目只需引入其默认导出的集成工具栏中就会出现对应的入口图标点击即触发app.ts的init逻辑// astro.config.mjs宿主项目 import myToolbarApp from example/toolbar-app; export default defineConfig({ integrations: [myToolbarApp], });七、小结examples/toolbar-app以最小的文件集演示了 Astro Toolbar App 的完整形态app.ts通过defineToolbarApp声明init以及可选的beforeTogglingOff生命周期并在 Shadow DOM canvas 中渲染 UIintegration.ts通过astro:config:setup钩子中的addDevToolbarApp完成注册构建层面则用简单的 tsc 编译 exports双入口完成打包。想进一步扩展时可以对照仓库中的类型定义 packages/astro/src/types/public/toolbar.ts 了解全部可用参数以及 packages/astro/src/toolbar/vite-plugin-dev-toolbar.ts 了解入口的加载、校验与错误隔离机制。【免费下载链接】astroThe web framework for content-driven websites. ⭐️ Star to support our work!项目地址: https://gitcode.com/GitHub_Trending/as/astro创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →