效果预览 image-20251111075114857实现过程
app/background.js 创建 BrowserWindow,并启用 @electron/remote/main,以兼容新版 Electron 移除默认 remote 的变更。webContents.send 实现渲染进程通信(如打开目录、更新配置项)。app/app.html 引入 LightGallery 的 CSS/JS 与各插件(如 Autoplay、Thumbnail),并在页面中渲染图片容器。app/app.js 负责将 defaults(主进程中的配置)透传到 LightGallery 初始化,绑定事件与控件逻辑。background.js 维护 defaults,其中包含 mode/speed/zoom/thumbnail/autoplay 等所有参数;菜单项通过 updateConfig(key, value) 动态更新并通知渲染进程。app/i18n.js 提供简易字典,默认语言 zh-CN,可用 setLocale('en-US') 切换。t('key') 获取翻译,避免硬编码英文。示例代码(附注释)
app/i18n.js 核心方法与字典结构export function setLocale(code) {
// 切换当前语言,默认字典包含 zh-CN 与 en-US
}
export function t(key) {
// 读取当前字典;如果未找到键,降级返回 key 本身,避免崩溃
}
background.js,已替换为 t()){
label: t('thumbnail'), // 缩略图主开关
type: 'checkbox',
checked: defaults.thumbnail,
click: (menuItem) => updateConfig('thumbnail', menuItem.checked)
},
{
label: t('animateThumb'), // 缩略图动效
type: 'checkbox',
checked: defaults.animateThumb,
click: (menuItem) => updateConfig('animateThumb', menuItem.checked)
},
{
label: t('toogleThumb'), // 切换缩略图显示
type: 'checkbox',
checked: defaults.toogleThumb,
click: (menuItem) => updateConfig('toogleThumb', menuItem.checked)
},
{
label: t('enableThumbDrag'), // 启用缩略图拖拽
type: 'checkbox',
checked: defaults.enableThumbDrag,
click: (menuItem) => updateConfig('enableThumbDrag', menuItem.checked)
}
app/i18n.js)'zh-CN': {
thumbnail: '缩略图',
animateThumb: '缩略图动画',
toogleThumb: '切换缩略图',
enableThumbDrag: '启用缩略图拖拽',
// ...
},
'en-US': {
thumbnail: 'Thumbnail',
animateThumb: 'animateThumb',
toogleThumb: 'toogleThumb',
enableThumbDrag: 'enableThumbDrag',
// ...
}
目录结构
app:应用主代码与资源app.html:页面骨架与资源引入app.js:渲染逻辑与 LightGallery 初始化background.js:Electron 主进程、菜单、配置与事件转发i18n.js:字典与翻译方法lightgallery/:第三方库 CSS/JS/Sass 与字体、图片等stylesheets/main.less:样式入口config.json:默认配置与参数tasks:构建与打包脚本start.js:开发时独立构建并启动 Electronbuild_standalone.js:独立构建,规避旧版 gulp 问题release_standalone.js:按当前 OS 打包(推荐入口)release_osx*.js:macOS 打包,支持 zip/DMG 与签名release_windows.js:Windows 打包(NSIS 安装包)release_linux.js:Linux 打包(DEB)utils.js:通用工具(OS 检测、变量替换、签名参数等)resources:平台打包素材osx/:Info.plist、DMG 配置与图标windows/:图标与 NSIS 安装脚本linux/:DEBIAN/ 控制文件与 Desktop 文件模板config:环境配置(development/test/production)README.md:文档(含打包与升级说明)启动与开发
app 内依赖)npm install
npm start
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm install
打包流程
npm run release
node ./tasks/release_osx.js --env=production --sign="Developer ID Application: 你的证书名称 (TEAMID)"
node ./tasks/release_osx_simple.js --env=production
node ./tasks/release_windows.js --env=production
node ./tasks/release_linux.js --env=production
app/package.json 的 version/productName/identifier升级过程中遇到的问题
remote,需在主进程启用 @electron/remote/main,渲染进程使用 @electron/remote。BrowserWindow 需设置 webPreferences: { nodeIntegration: true, contextIsolation: false } 以兼容旧代码。primordials is not definedbuild_standalone.js;发布脚本按平台拆分(可逐步迁移到 gulp v4)release_osx.js 支持签名与 DMG;需设置 --sign 指定 Developer IDrelease_osx_simple.js 默认生成 zip 与 DMG,增强兼容性(优先 hdiutil,回退 appdmg)makensis 在 PATHrcedit 替换图标与版本描述fakeroot 与 dpkg-deb;脚本中处理了路径转义,避免空间字符导致命令失败Autoplay/autoplay/progressBar/fourceAutoplay/autoplayControls/ms 等键,并替换菜单标签为 t()animateThumb、toogleThumb、enableThumbDrag,对应中文翻译与英文占位HarmonyOS 适配
build/ 作为资源目录,在 ArkUI 的 Web 组件中加载Web 组件承载页面,映射键盘与鼠标事件(如缩放、全屏、拖拽)t('thumbnail')),保持跨平台一致性;单位类(如 ms)按键值组合翻译,避免硬编码.hap;桌面端仍按上述流程输出安装包,形成多端共用前端代码的混合架构开源项目地址
gitcode.com:nutpi/lightgallery-desktop.githttps://github.com/sachinchoolur/lightGalleryhttps://github.com/sachinchoolur/lightslider结语
npm start 做一次端到端自查。架构与流程详解(更深入的技术细节)
app/background.js。app/app.html 与 app/app.js。webContents.send(channel, payload) 下发事件;渲染进程监听并应用配置。// background.js 中的配置更新桥
var updateConfig = function(key, val) {
// 1) 更新内存中的 defaults
defaults[key] = val;
// 2) 广播给渲染进程(LightGallery 的实例在渲染层)
if (ready) {
mainWindow.webContents.send('updateConfig', { key: key, val: val });
}
};
// 菜单项示例(缩略图开关)
{
label: t('thumbnail'),
type: 'checkbox',
checked: defaults.thumbnail,
click: (menuItem) => updateConfig('thumbnail', menuItem.checked)
}
defaults 映射为 LightGallery 的初始化参数与插件选项。dynamicEl,也可从目录读取并填充数组。构建流水线详解(替代旧版 gulp 的方案)
tasks/start.jsbuild_standalone.js 完成打包,然后拉起 Electron:var app = childProcess.spawn(electron, ['./build'], { stdio: 'inherit' });
chokidar 恢复监听。tasks/build_standalone.jsbuild/;复制 app 的静态资源与第三方库。rollup 打包 background.js 与 app.js 为 cjs:rollup.rollup({ entry: src }).then((bundle) => {
const result = bundle.generate({ format: 'cjs', sourceMap: true });
const isolatedCode = '(function () {' + result.code + '}());';
// 写入 bundle 及 source map
});
- 编译 Less:`stylesheets/main.less` → `build/stylesheets/main.css`。
- 写入 `build/package.json` 并注入环境配置:
manifest.env = projectDir.read('config/env_' + utils.getEnvName() + '.json', 'json');
destDir.write('package.json', manifest);
打包实现细节(按平台)
npm run release → tasks/release_standalone.jsconst releaseForOs = { osx: require('./release_osx_simple'), linux: require('./release_linux'), windows: require('./release_windows') };
release_osx_simple.js 与 release_osx.jsElectron.app 到临时目录,打包 app.asar,替换 Info.plist 与图标。.zip 与 .dmg;优先使用系统 hdiutil,失败时回退到 appdmg。release_osx.js 支持 --sign="Developer ID Application: ... (TEAMID)"。release_windows.jselectron/dist,打包 app.asar,用 rcedit 替换图标与版本说明。makensis 可用。release_linux.jselectron/dist,打包 app.asar,生成 .desktop 文件与图标。fakeroot dpkg-deb 生成 amd64.deb。IPC 与安全策略(升级注意点)
remote;主进程需 @electron/remote/main 初始化并在创建窗口后启用。@electron/remote 获取 app 等 API。BrowserWindow 安全配置(现状与建议)nodeIntegration: true, contextIsolation: false。contextIsolation: true 与 preload,通过 contextBridge 暴露受控 API,降低 XSS 风险。i18n 设计与扩展
dictionaries[locale][key];默认 zh-CN,支持 en-US。t(key) 未命中返回 key 本身,保证菜单不因缺失键而崩溃。ms 等单位作为独立键处理,避免字符串拼接硬编码。t()(见上文代码片段)。性能与体验细节(实践建议)
animateThumb 并降低 speed,以提升交互流畅性。lightgallery 子目录与字体/图片,减少包体。HarmonyOS 集成更细节(ArkTS/ETS)
Web 组件承载 build/ 页面;通过 postMessage 或 JSBridge 与宿主交互。问题清单与解决策略(升级踩坑)
primordials is not definedELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm install。--sign 进行签名,必要时按 Apple 流程进行公证(notarytool)。spawn makensis ENOENT。makensis 加入 PATH。