首页IT科技macau怎么读的(聊聊 node 如何优雅地获取 mac 系统版本)

macau怎么读的(聊聊 node 如何优雅地获取 mac 系统版本)

时间2025-09-19 09:05:17分类IT科技浏览5280
导读:背景 今天突然碰到了一个兼容性需求,需要根据不同 macOS 版本,进行不同的兼容性处理。...

背景

今天突然碰到了一个兼容性需求                ,需要根据不同 macOS 版本                         ,进行不同的兼容性处理                。

没想到看似简单的需求         ,中间也经历了一番波折        ,好在最后解决了问题                         。

在此记录一下解决问题的过程                         ,也方便其他有类似需求的同学参考         。

获取系统类型

既然需要针对 mac 系统进行兼容性处理                 ,首先需要区分系统类型        ,好在 node 提供了相关的 API                         ,只需使用 os.platform() 即可直接获取系统类型        。

import { platform } from os; console.log(platform()); // darwin

值得一提的是                 ,macOS 对应的名称不是 macOS 而是 darwin                         。

除了可以通过 os 这个包获取系统类型,我们还可以通过 process.platform 来获取                 。

import { platform } from process; console.log(platform); // darwin

获取系统版本

很多熟悉 node 的同学这时候会说了                         ,可以通过 os.release() 快速获取系统版本        。但是                          ,当你执行 os.release() ,你会发现                ,它的结果并符合常规认知                         。

比如                          ,我的系统版本是 12.0.1         ,但是                ,os.release() 的执行结果却是 21.1.0                 。

查看 node 官方文档可以发现                         ,node 是通过 uname(3) 来确定操作系统的         ,所以执行结果比较违背常规认知。

通过命令行获取系统版本

既然 os.release() 获取的系统版本很难让人理解        ,那么有没有什么方案可以直接获取实际的系统版本号呢?

mac 上存在 sw_vers 命令                         ,可以直接获取系统信息                         。

$ sw_vers ProductName: macOS ProductVersion: 12.0.1 BuildVersion: 21A559

可以看到 sw_vers 命令直接获取到了系统版本:12.0.1                          。

如果不需要其他系统信息                 ,我们可以通过添加命令行参数        ,过滤命令行结果                         ,直接获取系统版本。

$ sw_vers -ProductVersion 12.0.1

由于命令行不区分大小写                 ,所以命令行参数无所谓大小写,你也可以写成 -productversion 或者 -ProductVersion                。

既然知道命令行怎么写                         ,接下来我们只需要在 node 中调用命令行即可                          。

import { execSync } from child_process; console.log(execSync(sw_vers -ProductVersion, { encoding: utf-8 })); // 12.0.1

优雅地获取系统版本

通过 node 子进程执行命令行命令                          ,可以获取正确的系统版本         。但是这种方式有着性能方面的缺陷,需要创建子进程执行命令行                ,相对于 os.release() 的方式                          ,开销较大                。

之前使用 os.release() 的问题在于返回结果比较违反常规认知         ,但是它的结果其实是正确的                ,只不过需要进行一次映射                         。

所以                         ,通过 os.release() 配合映射表即可优雅地获取系统版本         。

import os from os; const macVersionMap = new Map([ [21, [Monterey, 12]], [20, [Big Sur, 11]], [19, [Catalina, 10.15]], [18, [Mojave, 10.14]], [17, [High Sierra, 10.13]], [16, [Sierra, 10.12]], [15, [El Capitan, 10.11]], [14, [Yosemite, 10.10]], [13, [Mavericks, 10.9]], [12, [Mountain Lion, 10.8]], [11, [Lion, 10.7]], [10, [Snow Leopard, 10.6]], [9, [Leopard, 10.5]], [8, [Tiger, 10.4]], [7, [Panther, 10.3]], [6, [Jaguar, 10.2]], [5, [Puma, 10.1]], ]); const getMacRelease = (release: string) => { const macRelease = release ?? os.release(); const firstReleaseVersion = Number(macRelease.split(.)[0]); const [name, version] = macVersionMap.get(firstReleaseVersion) || [ Unknown, , ]; return { name, version, }; }; console.log(getMacRelease()) // 12

为了方便 mac 新发布系统后依然能够识别         ,将新系统版本名称识别为 Unknow        ,新版本识别为空字符串        。

此举是学习移动端机型打分平台                         ,如果出现版本为空时                 ,默认为高版本        ,不影响低版本的兼容性处理                         。

现在                         ,我们就能够通过 node 优雅地获取系统版本啦                 。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
提高电脑关机速度(如何加快Windows关机速度)