创建时间: 2025-01-30 目的: 修改 FFmpeg 脚本后无需重启应用
项目根目录/
├── scripts/
│ └── mapreduce-refactor.js ← 📝 外部 FFmpeg 脚本(可动态重载)
├── apps/
│ └── desktop/
│ └── src/
│ └── main/
│ ├── generator.cjs ← 主进程(启动时加载脚本)
│ └── mapreduce-refactor.js ← 已废弃(仅作备份)
前端代码:
// 在 React 组件中
const reloadScript = async () => {
try {
const result = await window.electron.ipcRenderer.invoke('generator:reload-script');
if (result.success) {
console.log('✅ 脚本重新加载成功:', result.message);
console.log('⏰ 加载时间:', result.timestamp);
alert('脚本已重新加载!\n' + result.message);
} else {
console.error('❌ 脚本加载失败:', result.message);
alert('脚本加载失败:\n' + result.message);
}
} catch (error) {
console.error('重新加载失败:', error);
alert('重新加载失败:' + error.message);
}
};
// 添加按钮(放在设置页面或调试面板)
<button onClick={reloadScript}>
🔄 重新加载 FFmpeg 脚本
</button>在 GeneratorPage.jsx 中添加自动检测:
useEffect(() => {
// 监听脚本文件修改
const checkScriptUpdate = async () => {
const fs = window.require('fs');
const path = window.require('path');
const scriptPath = path.join(projectRoot, 'scripts/mapreduce-refactor.js');
fs.watchFile(scriptPath, { interval: 1000 }, (curr, prev) => {
if (curr.mtime !== prev.mtime) {
console.log('📝 检测到脚本文件修改');
// 提示用户重新加载
setScriptUpdatePending(true);
}
});
};
checkScriptUpdate();
return () => {
fs.unwatchFile(scriptPath);
};
}, []);# 编辑外部脚本文件
code scripts/mapreduce-refactor.js# Ctrl+S 保存方式 A:点击按钮
- 在前端界面点击"🔄 重新加载 FFmpeg 脚本"按钮
方式 B:开发者控制台
// 在浏览器开发者控制台执行
await window.electron.ipcRenderer.invoke('generator:reload-script')查看主进程控制台日志:
[ScriptReload] 🔄 重新加载 Map-Reduce 脚本...
[ScriptReload] 脚本路径: F:\...\scripts\mapreduce-refactor.js
[ScriptReload] ✅ 脚本加载成功!
[ScriptReload] 导出的函数: {
calculateTasks: 'function',
generateFFmpegCommand: 'function',
generateReduceCommand: 'function'
}
直接生成视频,无需重启应用!
修改文件: scripts/mapreduce-refactor.js
// 修改前
const FADE_IN_DUR = 0.5;
const FADE_OUT_DUR = 0.5;
// 修改后
const FADE_IN_DUR = 1.0;
const FADE_OUT_DUR = 1.0;操作:
- 保存文件
- 点击"重新加载"按钮
- 生成视频验证
修改文件: scripts/mapreduce-refactor.js
// 修改前
filterParts.push(`[main_v_0]scale=1920:1080:force_original_aspect_ratio=decrease,boxblur=20[blur_bg]`);
// 修改后(改变模糊强度)
filterParts.push(`[main_v_0]scale=1920:1080:force_original_aspect_ratio=decrease,boxblur=10[blur_bg]`);如果脚本有语法错误,会返回错误信息:
{
success: false,
message: "Unexpected token",
error: "..."
}解决方法:
- 查看主进程控制台的详细错误信息
- 修复语法错误
- 重新加载
确保 scripts/mapreduce-refactor.js 文件存在,否则首次启动会失败。
必须保持以下导出:
module.exports = {
CONFIG,
calculateTasks,
generateFFmpegCommand,
generateReduceCommand
};// 在前端执行
const path = window.require('path');
const scriptPath = path.join('...', 'scripts/mapreduce-refactor.js');
console.log('脚本路径:', scriptPath);
// 查看 require 缓存
console.log('缓存状态:', require.cache[require.resolve(scriptPath)]);// 主进程代码已自动处理:
delete require.cache[require.resolve(scriptPath)];// 在前端执行
const result = await window.electron.ipcRenderer.invoke('generator:reload-script');
console.log('导出的函数类型:', Object.keys(result.exports));scripts/mapreduce-refactor.js- 外部 FFmpeg 脚本(主要编辑目标)apps/desktop/src/main/generator.cjs- 主进程(包含动态加载逻辑)apps/desktop/src/main/mapreduce-refactor.js- 已废弃(仅作备份参考)
-
开发时
- 只编辑
scripts/mapreduce-refactor.js - 修改后立即点击"重新加载"按钮
- 快速迭代,无需重启
- 只编辑
-
测试时
- 每次修改后重新加载脚本
- 验证生成的 FFmpeg 命令
- 确认视频输出符合预期
-
生产时
- 脚本稳定后,可以集成回主进程
- 或保持外部加载,方便后续维护
文档创建时间: 2025-01-30 功能状态: ✅ 已实现,可立即使用