macau怎么读的(聊聊 node 如何优雅地获取 mac 系统版本)
背景
今天突然碰到了一个兼容性需求 ,需要根据不同 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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!