项目结构 #
一、基础项目结构 #
1.1 最简结构 #
text
my-electron-app/
├── index.html # 应用入口页面
├── main.js # 主进程入口
├── preload.js # 预加载脚本
├── package.json # 项目配置文件
└── node_modules/ # 依赖目录
1.2 推荐的基础结构 #
text
my-electron-app/
├── electron/ # Electron 相关代码
│ ├── main.js # 主进程入口
│ ├── preload.js # 预加载脚本
│ └── utils/ # 主进程工具函数
│ └── ipc.js # IPC 通信封装
├── src/ # 渲染进程源码
│ ├── index.html # 入口页面
│ ├── renderer.js # 渲染进程脚本
│ ├── styles/ # 样式文件
│ │ └── main.css
│ └── assets/ # 静态资源
│ ├── images/
│ └── fonts/
├── resources/ # 应用资源
│ └── icons/ # 应用图标
│ ├── icon.ico # Windows 图标
│ ├── icon.icns # macOS 图标
│ └── icon.png # Linux 图标
├── build/ # 构建配置
│ └── entitlements.mac.plist
├── dist/ # 打包输出目录
├── tests/ # 测试文件
│ ├── main/ # 主进程测试
│ └── renderer/ # 渲染进程测试
├── .npmrc # npm 配置
├── .eslintrc.js # ESLint 配置
├── .prettierrc # Prettier 配置
├── .gitignore # Git 忽略配置
├── package.json # 项目配置
└── README.md # 项目说明
二、进阶项目结构 #
2.1 中型项目结构 #
text
my-electron-app/
├── electron/
│ ├── main/
│ │ ├── index.js # 主进程入口
│ │ ├── window.js # 窗口管理
│ │ ├── menu.js # 菜单配置
│ │ ├── tray.js # 系统托盘
│ │ ├── shortcuts.js # 快捷键
│ │ └── updater.js # 自动更新
│ ├── preload/
│ │ └── index.js # 预加载脚本
│ ├── ipc/
│ │ ├── index.js # IPC 统一导出
│ │ ├── handlers/ # IPC 处理器
│ │ │ ├── file.js
│ │ │ ├── system.js
│ │ │ └── app.js
│ │ └── channels.js # 频道常量
│ └── utils/
│ ├── store.js # 本地存储
│ ├── logger.js # 日志工具
│ └── paths.js # 路径工具
├── src/
│ ├── index.html
│ ├── renderer.js
│ ├── components/ # UI 组件
│ │ ├── common/
│ │ │ ├── Button.js
│ │ │ └── Modal.js
│ │ └── layout/
│ │ ├── Header.js
│ │ └── Sidebar.js
│ ├── pages/ # 页面
│ │ ├── Home.js
│ │ ├── Settings.js
│ │ └── About.js
│ ├── styles/
│ │ ├── main.css
│ │ ├── variables.css
│ │ └── components/
│ ├── utils/
│ │ ├── api.js # API 封装
│ │ └── helpers.js # 辅助函数
│ └── assets/
│ ├── images/
│ ├── icons/
│ └── fonts/
├── resources/
│ ├── icons/
│ └── installer/
├── scripts/
│ ├── build.js # 构建脚本
│ ├── dev.js # 开发脚本
│ └── release.js # 发布脚本
├── tests/
│ ├── unit/
│ ├── e2e/
│ └── setup.js
├── docs/ # 文档
├── .github/ # GitHub 配置
│ └── workflows/
├── package.json
├── electron-builder.yml
└── README.md
2.2 大型项目结构 #
text
enterprise-electron-app/
├── apps/
│ ├── main/ # 主进程应用
│ │ ├── src/
│ │ │ ├── index.ts
│ │ │ ├── windows/
│ │ │ ├── services/
│ │ │ ├── ipc/
│ │ │ └── utils/
│ │ ├── tests/
│ │ └── package.json
│ ├── renderer/ # 渲染进程应用
│ │ ├── src/
│ │ │ ├── index.html
│ │ │ ├── main.tsx
│ │ │ ├── components/
│ │ │ ├── pages/
│ │ │ ├── hooks/
│ │ │ ├── store/
│ │ │ ├── api/
│ │ │ └── utils/
│ │ ├── tests/
│ │ └── package.json
│ └── preload/ # 预加载脚本
│ ├── src/
│ │ └── index.ts
│ └── package.json
├── packages/ # 共享包
│ ├── shared/ # 共享代码
│ │ ├── src/
│ │ │ ├── types/
│ │ │ ├── constants/
│ │ │ └── utils/
│ │ └── package.json
│ └── ui/ # UI 组件库
│ ├── src/
│ └── package.json
├── resources/
├── scripts/
├── docs/
├── package.json # 根 package.json
├── pnpm-workspace.yaml # pnpm 工作区配置
└── turbo.json # Turborepo 配置
三、目录详解 #
3.1 electron 目录 #
text
electron/
├── main/ # 主进程代码
│ ├── index.js # 入口文件
│ ├── window.js # 窗口管理
│ ├── menu.js # 菜单配置
│ ├── tray.js # 系统托盘
│ ├── shortcuts.js # 全局快捷键
│ └── updater.js # 自动更新
├── preload/ # 预加载脚本
│ └── index.js
├── ipc/ # IPC 通信
│ ├── index.js # 统一导出
│ ├── handlers/ # 处理器
│ └── channels.js # 频道常量
└── utils/ # 工具函数
├── store.js
├── logger.js
└── paths.js
3.2 src 目录 #
text
src/
├── index.html # 入口 HTML
├── renderer.js # 入口 JS
├── components/ # 组件目录
│ ├── common/ # 通用组件
│ ├── layout/ # 布局组件
│ └── features/ # 功能组件
├── pages/ # 页面目录
├── styles/ # 样式目录
│ ├── main.css
│ ├── variables.css
│ └── components/
├── utils/ # 工具函数
├── hooks/ # 自定义 Hooks(React)
├── store/ # 状态管理
└── assets/ # 静态资源
├── images/
├── icons/
└── fonts/
3.3 resources 目录 #
text
resources/
├── icons/ # 应用图标
│ ├── icon.ico # Windows 图标 (256x256)
│ ├── icon.icns # macOS 图标 (512x512)
│ ├── icon.png # Linux 图标 (512x512)
│ └── tray/ # 托盘图标
│ ├── tray.ico
│ ├── trayTemplate@2x.png
│ └── tray-dark.png
├── installer/ # 安装程序资源
│ ├── background.png # Windows 安装背景
│ └── license.txt
└── sounds/ # 声音资源
└── notification.mp3
四、配置文件 #
4.1 package.json #
json
{
"name": "my-electron-app",
"version": "1.0.0",
"description": "我的 Electron 应用",
"main": "electron/main/index.js",
"author": "Your Name",
"license": "MIT",
"scripts": {
"start": "electron .",
"dev": "electron . --enable-logging",
"build": "electron-builder",
"build:win": "electron-builder --win",
"build:mac": "electron-builder --mac",
"build:linux": "electron-builder --linux",
"lint": "eslint .",
"test": "jest"
},
"dependencies": {
"electron-store": "^8.1.0"
},
"devDependencies": {
"electron": "^28.0.0",
"electron-builder": "^24.9.1",
"eslint": "^8.56.0"
},
"build": {
"appId": "com.example.myapp",
"productName": "My App",
"directories": {
"output": "dist"
},
"files": [
"electron/**/*",
"src/**/*",
"package.json"
],
"mac": {
"icon": "resources/icons/icon.icns"
},
"win": {
"icon": "resources/icons/icon.ico"
},
"linux": {
"icon": "resources/icons/icon.png"
}
}
}
4.2 electron-builder.yml #
yaml
appId: com.example.myapp
productName: My App
copyright: Copyright © 2024
directories:
output: dist
buildResources: resources
files:
- electron/**/*
- src/**/*
- package.json
- "!**/*.map"
- "!**/node_modules/*/{CHANGELOG.md,README.md,readme.md}"
extraResources:
- resources/icons/**/*
mac:
icon: resources/icons/icon.icns
category: public.app-category.productivity
hardenedRuntime: true
gatekeeperAssess: false
entitlements: build/entitlements.mac.plist
entitlementsInherit: build/entitlements.mac.plist
win:
icon: resources/icons/icon.ico
target:
- target: nsis
arch:
- x64
- ia32
linux:
icon: resources/icons/icon.png
category: Utility
target:
- AppImage
- deb
nsis:
oneClick: false
allowToChangeInstallationDirectory: true
createDesktopShortcut: true
createStartMenuShortcut: true
publish:
provider: github
owner: your-username
repo: your-repo
4.3 .npmrc #
text
registry=https://registry.npmmirror.com
electron_mirror=https://npmmirror.com/mirrors/electron/
electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/
4.4 .gitignore #
text
# Dependencies
node_modules/
# Build output
dist/
out/
build/
# Logs
logs/
*.log
npm-debug.log*
# OS files
.DS_Store
Thumbs.db
# IDE
.idea/
.vscode/
*.swp
*.swo
# Environment
.env
.env.local
.env.*.local
# Test
coverage/
# Temporary
tmp/
temp/
五、命名规范 #
5.1 文件命名 #
| 类型 | 规范 | 示例 |
|---|---|---|
| 主进程文件 | 小写 + 连字符 | main.js, window-manager.js |
| 渲染进程组件 | 大驼峰 | Button.js, Modal.js |
| 样式文件 | 小写 + 连字符 | main.css, button.css |
| 工具函数 | 小写 + 连字符 | file-utils.js, date-helpers.js |
| 常量文件 | 大写 + 下划线 | API_CONSTANTS.js |
5.2 目录命名 #
| 类型 | 规范 | 示例 |
|---|---|---|
| 功能目录 | 小写 | components/, utils/ |
| 页面目录 | 小写 | pages/, views/ |
| 资源目录 | 小写 | assets/, resources/ |
5.3 变量命名 #
javascript
// 常量:大写 + 下划线
const API_BASE_URL = 'https://api.example.com';
const MAX_RETRY_COUNT = 3;
// 变量:小驼峰
let mainWindow = null;
let clickCount = 0;
// 函数:小驼峰
function createWindow() {}
function handleClick() {}
// 类:大驼峰
class WindowManager {}
class IpcHandler {}
// 私有变量:下划线前缀
let _privateVar = null;
function _privateMethod() {}
六、模块化组织 #
6.1 主进程模块化 #
javascript
// electron/main/index.js
const { app } = require('electron');
const { createMainWindow } = require('./window');
const { setupMenu } = require('./menu');
const { setupTray } = require('./tray');
const { setupIpc } = require('../ipc');
const { setupShortcuts } = require('./shortcuts');
app.whenReady().then(() => {
createMainWindow();
setupMenu();
setupTray();
setupIpc();
setupShortcuts();
});
javascript
// electron/main/window.js
const { BrowserWindow } = require('electron');
const path = require('path');
let mainWindow = null;
function createMainWindow() {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, '../preload/index.js'),
nodeIntegration: false,
contextIsolation: true
}
});
mainWindow.loadFile(path.join(__dirname, '../../src/index.html'));
return mainWindow;
}
function getMainWindow() {
return mainWindow;
}
module.exports = {
createMainWindow,
getMainWindow
};
6.2 IPC 模块化 #
javascript
// electron/ipc/channels.js
module.exports = {
FILE: {
READ: 'file:read',
WRITE: 'file:write',
DELETE: 'file:delete'
},
SYSTEM: {
INFO: 'system:info',
PATHS: 'system:paths'
},
APP: {
VERSION: 'app:version',
QUIT: 'app:quit'
}
};
javascript
// electron/ipc/handlers/file.js
const { ipcMain } = require('electron');
const fs = require('fs').promises;
const CHANNELS = require('../channels');
function setupFileHandlers() {
ipcMain.handle(CHANNELS.FILE.READ, async (event, filePath) => {
const content = await fs.readFile(filePath, 'utf-8');
return content;
});
ipcMain.handle(CHANNELS.FILE.WRITE, async (event, filePath, content) => {
await fs.writeFile(filePath, content);
return true;
});
}
module.exports = { setupFileHandlers };
javascript
// electron/ipc/index.js
const { setupFileHandlers } = require('./handlers/file');
const { setupSystemHandlers } = require('./handlers/system');
const { setupAppHandlers } = require('./handlers/app');
function setupIpc() {
setupFileHandlers();
setupSystemHandlers();
setupAppHandlers();
}
module.exports = { setupIpc };
七、最佳实践 #
7.1 代码组织原则 #
text
1. 按功能模块划分
2. 主进程与渲染进程代码分离
3. 共享代码抽取到独立模块
4. 配置文件集中管理
5. 资源文件统一存放
7.2 安全配置 #
javascript
// electron/main/window.js
function createMainWindow() {
const mainWindow = new BrowserWindow({
webPreferences: {
nodeIntegration: false, // 禁用 Node.js 集成
contextIsolation: true, // 启用上下文隔离
enableRemoteModule: false, // 禁用 remote 模块
sandbox: true, // 启用沙箱
webSecurity: true, // 启用 Web 安全
allowRunningInsecureContent: false
}
});
return mainWindow;
}
7.3 开发与生产环境区分 #
javascript
// electron/main/index.js
const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged;
if (isDev) {
// 开发环境配置
require('electron-reload')(__dirname);
mainWindow.webContents.openDevTools();
} else {
// 生产环境配置
mainWindow.setMenu(null);
}
八、总结 #
8.1 核心要点 #
| 要点 | 说明 |
|---|---|
| 目录分离 | 主进程、渲染进程、预加载脚本分离 |
| 模块化 | 按功能划分,职责单一 |
| 命名规范 | 统一的文件和变量命名 |
| 配置集中 | 配置文件统一管理 |
8.2 下一步 #
现在你已经了解了 Electron 项目结构,接下来让我们学习 主进程与渲染进程,深入理解 Electron 的核心架构!
最后更新:2026-03-28