Skip to main content

NodeJS

Nodejs 是 Electron 桌面端的核心,他主要负责与操作系统交互、链接第三方插件、通知网页端执行结果、数据分发中心、记录日志、软件更新等等,所以我们可以按模块划分不同的职责。


与操作系统交互

使用 Nodejs 可以很方便的执行 cmd 命令并获取返回结果,比如:

  • 获取操作系统版本和位数
  • MAC 地址
  • 检查端口号是否被占用
  • 启动某些文件
  • 杀进程、判断进程是否正在运行
  • 检查目录是否有写入权限
  • 判断当前应用是否有管理员权限
  • 其他

当执行时我们需要考虑:

  • 是否需要管理员权限
  • 路径中是否带空格
  • cmd 命令的执行效率、连带效果、兼容性。

链接第三方插件 (Window)

第三方插件的来源是多种多样的,一般使用的就是 exe 文件和 dll 文件 或者两者搭配。

对第三方插件的要求主要是:

  • 兼容 Win7 32 位及以上系统
  • 最好是开源免费,也可付费无限次使用
  • 支持命令行
  • 无感集成(可以隐藏执行窗口,最好托盘图标都隐藏)

我在实践过程中使用的满足上述条件的第三方插件:

  • Everything: 磁盘文件快速搜索的不二选择!!!!!!
  • aria2: 比肩迅雷的下载器,支持多任务断点续传
  • elevate: 只是给 CMD 命令或者启动文件提升权限而已...
  • ffm32: 音视频格式转换。
  • ReduceMemory: 优化内存,可优化进程列表内所有进程,也可优化单独进程
  • NiuniuCapture: 截图插件,免费的...
  • AutoHotKey: 办公自动化神器,可以访问 VBA Com 对象(你懂得!)
  • 7z: 压缩解压,到现在没犯过错误。
  • MicroSIP: 很强大的软电话(需要搭建 SIP 服务器)
  • CCleaner: C 盘清理插件
  • 自定义插件: 自己写个插件,Python、C++、Go、甚至是易语言都可以尝试一下!

通知网页端执行结果

当任务执行完毕,我们需要把结果通知给网页端,网页端弹窗或者其他形式呈现给用户,这时候要考虑统一消息格式,比如约定一个格式(标题-内容-描述等等),之后我们要对消息 API 进行封装,根据业务添加参数,具体代码因人而异。

.send-.on 发送消息可能会导致消息队列消息堆积,可以再发送消息之前调用 API 清空消息队列。


数据分发中心

无论多页应用还是实时数据都可以存储在 Nodejs 对象或者 Sqlite 数据库中,也就是说以 Nodejs 为中控分发数据。


记录日志

之前我以为记录日志是很简单的事,就把日志都记到了同一个日志文件里,根据后来业务和实际情况的复杂度不断提升,日志也需要更加细化,有时甚至因为其他什么原因软件崩溃或是其他任务抢占了日志文件都会引起日志记录的不全或丢失。 还有我们记录的日志是能够精准推算出用户使用软件的全生命周期,而不是通过日志只能大概推算用户干了什么,这会让我们很被动,解决问题也是充满荆棘,不知道用户干了什么导致哪些问题。当我们遇到及其难以理解的问题这时日志很可能会成为我们的最后一根救命稻草。

基于以上顾虑做出如下对策:

  • 根据不同业务类型创建不同日志目录。
  • 根据日期创建日志目录。
  • 每次启动时创建对应时间的日志文件,可以正好记录启动时间。
  • 创建整点日志。
  • 可以设置只保留最近一周的日志。

软件更新

软件更新在我的实践中他代表了一部分开发者的能力,因为软件更新就是软件生命周期的命脉,如果更新出现问题,那就代表软件的生命周期被迫停止,无论想更新什么都要停滞。 所以我们既要保证更新流程的兼容性完整性健壮性,也要给予用户多个途径进行更新。

在写更新逻辑时 我们要预测一部分问题,比如没联网,中途断网,服务器故障,磁盘满了,目录没有写入权限,安全软件弹窗干扰或者直接把安装包删掉,等等。

根据我的实践,更新分为两种:

  • 增量更新:只更新源码和插件文件,通过自定义解压器下载器 或者 http模块aria2进行下载解压,当文件覆盖之后还需要帮用户启动。
  • 全量更新:下载最新安装包,下载完毕后自动启动安装包。