NetCmdRegister 应用开发详解(二):项目搭建与窗口创建

本文最后更新于:2025年11月2日 晚上

NetCmdRegister 应用开发详解(二):项目搭建与窗口创建

大家好!我是 NetCmdRegister 的开发者。在上一篇文章中,我们介绍了项目的整体概况和技术架构。今天,我们将深入探讨项目的搭建过程和窗口创建的细节。这是整个应用开发的基础,也是理解 Electron 应用生命周期的关键。

环境准备与项目初始化

开发环境要求

在开始之前,确保你的开发环境满足以下要求:

Node.js 环境

1
2
3
4
5
# 检查 Node.js 版本
node --version # 需要 16.x 或更高版本

# 检查 npm 版本
npm --version # 需要 8.x 或更高版本

推荐开发工具

  • Visual Studio Code - 代码编辑器
  • Git - 版本控制
  • Chrome DevTools - 调试工具(内置在 Electron 中)

项目初始化步骤

1. 创建项目目录

1
2
mkdir net-cmd-register
cd net-cmd-register

2. 初始化 package.json

1
npm init -y

这会生成一个基础的 package.json 文件,我们需要对其进行定制化配置。

深度解析 package.json

基础配置详解

让我们逐行分析 package.json 的关键配置:

1
2
3
4
5
6
7
8
{
"name": "net-cmd-register",
"description": "网络命令注册器,用于测试网口下发不同命令的测试工具。",
"main": "./main.js",
"version": "1.1.4",
"author": "liansixin",
"license": "MIT"
}

字段说明:

  • name: 项目名称,遵循 kebab-case 命名规范
  • description: 项目描述,清晰说明应用用途
  • main: 这是 Electron 应用最重要的配置,指定了主进程的入口文件
  • version: 语义化版本号,遵循 major.minor.patch 规则
  • author: 作者信息
  • license: 开源许可证

脚本命令配置

1
2
3
4
5
6
7
{
"scripts": {
"start": "electron .",
"build": "electron-builder",
"build:linux": "electron-builder --linux"
}
}

脚本命令详解:

npm start - 开发环境启动

1
electron .

这个命令告诉 Electron 从当前目录启动应用,Electron 会自动查找 package.jsonmain 字段指定的入口文件。

npm run build - 应用打包

1
electron-builder

使用 electron-builder 将应用打包为可执行文件,支持 Windows、Linux、macOS。

为什么使用脚本命令?

  • 统一开发流程
  • 简化复杂命令
  • 便于团队协作
  • 集成到 CI/CD 流程

依赖管理

1
2
3
4
5
6
{
"devDependencies": {
"electron": "^37.2.4",
"electron-builder": "^26.0.12"
}
}

依赖选择策略:

Electron 版本选择

  • 选择 LTS(长期支持)版本确保稳定性
  • 避免使用过新的版本,防止兼容性问题
  • 定期更新以获得安全修复

版本号语义

  • ^37.2.4:允许自动更新到 37.x.x 的最新版本
  • 保持依赖更新但避免破坏性变更

安装依赖

1
2
npm install electron --save-dev
npm install electron-builder --save-dev

主进程入口:main.js 深度解析

模块导入与架构设计

1
2
3
4
const { app, BrowserWindow, ipcMain, dialog } = require('electron');
const path = require('path');
const dgram = require('dgram');
const fs = require('fs/promises');

模块导入策略:

Electron 核心模块

  • app: 控制应用生命周期
  • BrowserWindow: 创建和管理窗口
  • ipcMain: 处理进程间通信
  • dialog: 显示原生对话框

Node.js 内置模块

  • path: 路径处理,确保跨平台兼容性
  • dgram: UDP 网络通信核心模块
  • fs: 文件系统操作

为什么使用 require 而不是 import?

  • Electron 基于 CommonJS 模块系统
  • 确保与 Node.js 生态的兼容性
  • 简化构建配置

全局状态管理

1
2
let udpServer = null;
let udpClient = null;

状态管理设计思路:

  1. 单一数据源:所有 UDP 相关状态集中管理
  2. 明确的生命周期:在应用启动时创建,退出时清理
  3. 错误边界:通过 null 检查避免未初始化访问

窗口创建函数详解

1
2
3
4
5
6
7
8
9
10
11
const createWindow = () => {
const win = new BrowserWindow({
width: 1200,
height: 950,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
contextIsolation: true,
nodeIntegration: false
}
});
};

窗口配置参数深度解析:

尺寸设计考量

  • width: 1200:适应大多数现代显示器
  • height: 950:提供充足的工作空间,避免过度滚动

安全配置详解

1
2
3
4
5
webPreferences: {
preload: path.join(__dirname, 'preload.js'), // 预加载脚本
contextIsolation: true, // 启用上下文隔离
nodeIntegration: false // 禁用 Node.js 集成
}

为什么这样的安全配置?

contextIsolation: true

  • 将渲染进程与主进程隔离
  • 防止恶意代码访问 Node.js API
  • 是现代 Electron 应用的安全最佳实践

nodeIntegration: false

  • 渲染进程不能直接访问 Node.js
  • 所有系统访问必须通过预加载脚本
  • 大幅提高应用安全性

preload 路径处理

1
path.join(__dirname, 'preload.js')

使用 path.join__dirname 确保跨平台路径兼容性。

内容加载与开发工具

1
2
3
4
win.loadFile('index.html');

// 开发时取消注释可以打开开发者工具
// win.webContents.openDevTools();

内容加载策略:

win.loadFile('index.html')

  • 加载本地 HTML 文件
  • 相对于应用程序根目录
  • 支持文件协议(file://)

开发者工具管理

  • 开发阶段:启用开发者工具便于调试
  • 生产环境:注释掉,避免用户误操作
  • 可选:通过环境变量控制

应用生命周期深度解析

应用启动流程

1
2
3
4
5
6
7
8
9
app.whenReady().then(() => {
createWindow();

app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
});

生命周期事件详解:

app.whenReady()

  • 应用完成初始化后触发
  • 返回 Promise,便于使用 async/await
  • 这是创建窗口的安全时机

activate 事件(macOS 特有)

  • 当用户点击 Dock 图标时触发
  • 如果没有打开的窗口,创建新窗口
  • 提供类似原生 macOS 应用的行为

应用关闭流程

1
2
3
4
5
6
7
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
if (udpServer) udpServer.close();
if (udpClient) udpClient.close();
app.quit();
}
});

跨平台关闭策略:

平台差异处理

  • Windows/Linux:所有窗口关闭时退出应用
  • macOS:窗口关闭但应用继续运行,符合平台惯例

资源清理最佳实践

1
2
if (udpServer) udpServer.close();
if (udpClient) udpClient.close();
  • 显式释放网络资源
  • 避免端口占用问题
  • 确保干净的应用退出

开发工作流与调试技巧

开发环境搭建

1. 项目结构创建

1
2
3
4
5
6
7
net-cmd-register/
├── main.js
├── preload.js
├── index.html
├── renderer.js
├── package.json
└── styles.css

2. 开发命令配置package.json 中添加开发脚本:

1
2
3
4
5
6
{
"scripts": {
"dev": "electron . --enable-logging",
"dev-debug": "electron . --inspect=5858"
}
}

调试技巧

主进程调试

1
2
3
// 在 main.js 中添加
console.log('主进程启动成功');
console.log('应用路径:', __dirname);

渲染进程调试

  • 使用 win.webContents.openDevTools() 打开开发者工具
  • 或者在渲染进程中按 F12(如果启用)

进程间通信调试

1
2
// 在 preload.js 中添加日志
console.log('预加载脚本执行');

常见问题与解决方案

问题1:窗口创建失败

症状:应用启动但没有显示窗口

排查步骤:

  1. 检查 package.json 中的 main 字段
  2. 确认 main.js 文件路径正确
  3. 查看控制台错误信息

问题2:安全警告

症状:开发时看到安全相关警告

解决方案:

1
2
3
4
5
6
// 正确的安全配置
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
contextIsolation: true,
nodeIntegration: false
}

问题3:路径问题

症状:在不同平台上路径错误

解决方案:

1
2
// 使用 path 模块处理路径
const configPath = path.join(app.getPath('userData'), 'config.json');

最佳实践总结

代码组织

1. 模块化设计

  • 主进程逻辑集中在 main.js
  • 渲染逻辑在 renderer.js
  • 通信桥梁在 preload.js

2. 错误处理

1
2
3
4
5
app.whenReady().then(() => {
createWindow();
}).catch((error) => {
console.error('应用启动失败:', error);
});

3. 资源管理

  • 及时释放网络连接
  • 清理事件监听器
  • 管理窗口引用

性能优化

1. 延迟加载

1
2
3
4
// 非关键功能可以延迟初始化
setTimeout(() => {
initializeSecondaryFeatures();
}, 1000);

2. 内存管理

1
2
3
4
// 及时清除引用
win.on('closed', () => {
win = null;
});

实战练习

为了加深理解,建议你尝试以下练习:

练习1:创建基础窗口

  1. 按照文章步骤初始化项目
  2. 创建基本的 main.js 文件
  3. 实现窗口创建和生命周期管理

练习2:添加安全配置

  1. 配置上下文隔离
  2. 设置预加载脚本路径
  3. 禁用 Node.js 集成

练习3:跨平台测试

  1. 测试不同平台的关闭行为
  2. 验证路径处理的兼容性

结语

通过本章的学习,我们深入掌握了:

  1. 项目初始化:从零搭建 Electron 项目结构
  2. 配置管理:package.json 的详细配置解析
  3. 窗口创建:BrowserWindow 的完整配置选项
  4. 安全实践:现代 Electron 应用的安全配置
  5. 生命周期:应用启动和关闭的完整流程
  6. 调试技巧:开发过程中的问题排查方法

这些知识为后续的功能开发奠定了坚实的基础。在下一篇文章中,我们将深入探讨用户界面的设计与实现,包括 HTML 结构、CSS 样式和前端交互逻辑。

如果你在实践过程中遇到任何问题,欢迎在评论区留言讨论。我会及时回复并提供帮助!

下一篇预告:《NetCmdRegister 应用开发详解(三):UI 界面设计与实现》——我们将使用 HTML 和 Tailwind CSS 构建现代化的工作界面,并实现完整的用户交互逻辑。


NetCmdRegister 应用开发详解(二):项目搭建与窗口创建
https://jinbilianshao.github.io/2025/11/02/NetCmdRegister-应用开发详解(二):项目搭建与窗口创建/
作者
连思鑫
发布于
2025年11月2日
许可协议