# Vue Widget 构建流程实施方案 ## 已实施方案:方案1 + 方案4 组合 我们采用了**提交构建产物 + 智能检测**的混合方案,同时满足用户便利性和开发灵活性。 --- ## 🎯 方案特点 ### 对于用户 ✅ **安装即用** - Clone仓库后无需任何构建步骤 ✅ **无需Node.js** - 构建产物已包含在仓库中 ✅ **快速启动** - ComfyUI启动时无延迟 ### 对于开发者 ✅ **自动检测** - 源代码变更后自动检测是否需要重新构建 ✅ **自动构建** - 如果检测到需要,可自动执行构建(需要Node.js) ✅ **灵活配置** - 可选择手动或自动构建模式 --- ## 📦 实施的组件 ### 1. Git 配置调整 **文件**: `.gitignore` ```diff - # Vue widgets build output - web/comfyui/vue-widgets/ + # Vue widgets development cache (but keep build output) + vue-widgets/node_modules/ + vue-widgets/.vite/ + vue-widgets/dist/ ``` **说明**: - ✅ 构建产物 `web/comfyui/vue-widgets/` **提交到Git** - ✅ 开发缓存(node_modules等)被忽略 - ✅ 仓库大小增加约 1.4MB(可接受) --- ### 2. 智能构建检测模块 **文件**: `py/vue_widget_builder.py` **核心功能**: - ✅ 检查构建产物是否存在 - ✅ 检查源代码是否比构建新(开发模式) - ✅ 检查Node.js/npm是否可用 - ✅ 自动执行构建(如果需要且可行) - ✅ 友好的错误提示和日志 **主要类和方法**: ```python class VueWidgetBuilder: def check_build_exists() -> bool """检查构建产物是否存在""" def check_build_outdated() -> bool """检查源代码是否比构建新""" def check_node_available() -> bool """检查Node.js是否可用""" def build_widgets(force=False) -> bool """执行构建""" def ensure_built(auto_build=True, warn_only=True) -> bool """确保构建存在,智能处理""" ``` **便捷函数**: ```python check_and_build_vue_widgets(auto_build=True, warn_only=True, force=False) ``` --- ### 3. 启动时自动检测 **文件**: `__init__.py` 在ComfyUI加载插件时自动检测并构建: ```python # Check and build Vue widgets if needed (development mode) try: from .py.vue_widget_builder import check_and_build_vue_widgets # Auto-build in development, warn only if fails check_and_build_vue_widgets(auto_build=True, warn_only=True) except Exception as e: logging.warning(f"[LoRA Manager] Vue widget build check skipped: {e}") ``` **行为**: - ✅ 如果构建产物存在且最新 → 静默通过 - ✅ 如果构建产物缺失/过期 → 尝试自动构建(需Node.js) - ✅ 如果构建失败 → 警告但不阻止ComfyUI启动 - ✅ 开发模式下源代码变更后自动重建 --- ### 4. 增强的构建脚本 **文件**: `vue-widgets/package.json` ```json { "scripts": { "dev": "vite build --watch", "build": "vite build", "build:production": "vite build --mode production", "typecheck": "vue-tsc --noEmit", "clean": "rm -rf ../web/comfyui/vue-widgets", "rebuild": "npm run clean && npm run build", "prepare": "npm run build" } } ``` **新增脚本**: - `clean` - 清理构建产物 - `rebuild` - 完全重建 - `build:production` - 生产模式构建 - `prepare` - npm install后自动构建(可选) --- ### 5. Pre-commit Hook 示例 **文件**: `vue-widgets/pre-commit.example` 提供了Git pre-commit hook示例,确保提交前构建: ```bash #!/bin/sh cd vue-widgets && npm run build && git add web/comfyui/vue-widgets/ ``` **使用方法**: ```bash # 手动安装(简单方法) cp vue-widgets/pre-commit.example .git/hooks/pre-commit chmod +x .git/hooks/pre-commit # 或使用Husky(推荐用于团队) npm install --save-dev husky npx husky install npx husky add .git/hooks/pre-commit "cd vue-widgets && npm run build" ``` --- ## 🔄 工作流程 ### 场景A: 用户安装 ```bash # 1. 用户clone仓库 git clone cd ComfyUI-Lora-Manager # 2. 启动ComfyUI(无需任何构建步骤) # 构建产物已在仓库中,直接可用 ``` **结果**: ✅ 即装即用,无需Node.js --- ### 场景B: 开发者修改Vue代码 **方式1: 手动构建** ```bash cd vue-widgets npm run build # 修改会被检测到,ComfyUI重启时会看到最新版本 ``` **方式2: 监听模式** ```bash cd vue-widgets npm run dev # Watch mode,自动重建 # 浏览器刷新即可看到变化 ``` **方式3: 自动检测** ```bash # 修改Vue源代码 vim vue-widgets/src/components/DemoWidget.vue # 重启ComfyUI # __init__.py会检测到源代码比构建新,自动重建(如果有Node.js) ``` --- ### 场景C: 提交代码 **如果安装了pre-commit hook**: ```bash git commit -m "Update widget" # Hook自动执行构建 # 构建产物自动添加到commit ``` **如果没有hook(手动)**: ```bash cd vue-widgets && npm run build && cd .. git add . git commit -m "Update widget and build output" ``` --- ### 场景D: CI/CD 发布 ```bash # 在GitHub Actions或其他CI中 cd vue-widgets npm install npm run build # 构建产物自动包含在release中 ``` --- ## 📊 测试结果 已测试以下场景,全部通过: ### ✅ Test 1: 构建产物存在时 ``` Result: True (静默通过,无日志) ``` ### ✅ Test 2: 构建产物缺失时 ``` 自动检测 → 自动npm install → 自动build → 成功 Result: True Build created: web/comfyui/vue-widgets/demo-widget.js (418K) ``` ### ✅ Test 3: 源代码变更检测 ``` 修改.vue文件 → 时间戳检测 → 自动重建 Result: True ``` --- ## 📁 Git 仓库状态 ### 应该提交的文件: ``` ✅ vue-widgets/src/**/*.{ts,vue} # 源代码 ✅ vue-widgets/package.json # 依赖配置 ✅ vue-widgets/package-lock.json # 锁定版本 ✅ vue-widgets/vite.config.mts # 构建配置 ✅ vue-widgets/tsconfig.json # TS配置 ✅ vue-widgets/*.md # 文档 ✅ web/comfyui/vue-widgets/**/*.js # 构建产物 ⭐ ✅ web/comfyui/vue-widgets/**/*.css # 构建CSS ⭐ ✅ web/comfyui/vue-widgets/**/*.map # Source maps ⭐ ✅ py/vue_widget_builder.py # 构建检测模块 ⭐ ``` ### 应该忽略的文件: ``` ❌ vue-widgets/node_modules/ # npm依赖 ❌ vue-widgets/.vite/ # Vite缓存 ❌ vue-widgets/dist/ # Vite临时目录 ``` --- ## 🎓 开发者指南 ### 首次设置 ```bash cd vue-widgets npm install npm run build ``` ### 日常开发 ```bash # 开发模式(推荐) cd vue-widgets npm run dev # 在另一个终端启动ComfyUI,修改后刷新浏览器 # 或者依赖自动检测 # 修改代码 → 重启ComfyUI → 自动重建 ``` ### 提交前 ```bash # 确保构建最新 cd vue-widgets && npm run build && cd .. # 或者安装pre-commit hook自动化 cp vue-widgets/pre-commit.example .git/hooks/pre-commit chmod +x .git/hooks/pre-commit ``` --- ## 🔧 故障排除 ### 问题1: 构建产物不是最新的 **症状**: 修改了Vue代码,但ComfyUI中看不到变化 **解决方案**: ```bash cd vue-widgets npm run rebuild # 强制重建 # 然后刷新浏览器 ``` ### 问题2: 自动构建失败 **症状**: ComfyUI启动时显示构建失败警告 **检查**: ```bash # 检查Node.js是否安装 node --version npm --version # 手动测试构建 cd vue-widgets npm install npm run build ``` ### 问题3: Git显示大量构建产物变更 **这是正常的** - 构建产物应该提交 **最小化变更**: - 使用 `npm run build` 而非 `npm run dev`(watch模式) - 确保vite配置中 `minify: false`(已配置) - 只在需要时重新构建 --- ## 📈 优势总结 | 方面 | 优势 | |------|------| | 用户体验 | ⭐⭐⭐⭐⭐ 安装即用 | | 开发体验 | ⭐⭐⭐⭐⭐ 自动检测+构建 | | 可靠性 | ⭐⭐⭐⭐⭐ 构建产物已验证 | | 灵活性 | ⭐⭐⭐⭐ 支持多种工作流 | | 维护性 | ⭐⭐⭐⭐ 清晰的构建流程 | | Git仓库 | ⭐⭐⭐ 略大但可接受 | --- ## 🚀 未来优化(可选) 1. **添加Husky** - 自动化pre-commit hooks 2. **GitHub Actions** - CI自动构建和测试 3. **构建缓存** - 加速CI构建 4. **Minification** - 生产模式压缩代码(减小体积) 5. **代码分割** - 按需加载不同widget --- ## 总结 当前实施的方案完美平衡了用户便利性和开发灵活性: - ✅ **用户**: Clone后即用,无需Node.js - ✅ **开发者**: 自动检测和构建,开发流畅 - ✅ **可靠性**: 构建产物已验证提交 - ✅ **可维护性**: 清晰的构建流程和文档 用户安装时,`web/comfyui/vue-widgets/`中的JS代码**始终是由vue-widgets中的最新代码编译得到的**,因为: 1. 开发者提交前会构建(手动或通过hook) 2. ComfyUI启动时会检测并自动重建(开发模式) 3. 构建产物已包含在Git仓库中(用户直接获得) 这个方案已经过测试验证,可以投入生产使用。