# Infinite Canvas 画布节点插件 给画布扩展自定义节点。每个插件是一个**独立目录**,自带 `package.json` / `build.mjs` / `src/index.jsx` / `dist/`,互不耦合,可单独构建、发布、升级。 内置节点只有文本、图片、视频、音频、生成配置、组六种;其余节点(Markdown、SVG、HTML、3D 全景、便利贴……)都是插件。 ## 目录约定 ``` plugins/canvas/ markdown/ # 每个插件一个独立目录 package.json build.mjs # esbuild 构建,产物名取目录名 → dist/markdown.js src/index.jsx # 插件源码(默认导出工厂函数) README.md svg/ html/ panorama/ sticky-note/ ... ``` ## 构建 / 发布 / 升级 ```bash cd plugins/canvas/ npm install npm run build # → dist/.js,并同步到 web/public/plugins/.js npm run dev # watch,改动自动构建并同步 ``` 把 `dist/.js` 托管到任意静态地址(CDN、GitHub Raw、对象存储),用户在画布「节点插件」管理器填该 URL 安装。升级时重新构建覆盖同一 URL,用户点「更新」即可。 ## 本地开发 `npm run dev` 起 watch,在 `web/.env.local` 声明开发插件(逗号分隔多个): ```env VITE_DEV_PLUGINS=/plugins/markdown.js,/plugins/svg.js ``` 再起画布 `web`(`npm run dev`)。`VITE_DEV_PLUGINS` 里的插件每次刷新页面都会**重新拉取**(不缓存、不落库),流程即:改 `src/index.jsx` → watch 自动构建 → 刷新画布看到最新效果,无需反复安装。 ## 插件文件构成 每个插件最终打包成**单个 `.js` 文件**(加载器 `fetch 单文件 → import`),但源码可以随意拆分: - **多个 JS/JSX**:在 `src/index.jsx` 里 `import` 其它模块,esbuild `bundle` 会合并进一个产物。 - **CSS**:写独立 `.css` 文件,`import css from "./styles.css"` 拿到字符串(esbuild 用 `text` loader),放到插件的 `css` 字段即可——启用时自动注入 `