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

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

时间2025-08-04 14:17:57分类IT科技浏览4781
导读:背景 今天突然碰到了一个兼容性需求,需要根据不同 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
网站优化流程(网站怎样进行优化) 帝国cms做商城(帝国CMS[!–no.num–]标签怎么用)