聊聊 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 优雅地获取系统版本啦。
聊聊 node 如何优雅地获取 mac 系统版本的更多相关文章
- Delphi 10.3版本获取windows系统版本和CPU信息
procedure TForm1.Button1Click(Sender: TObject); var mm:TRegistry; cpu:string; begin mm:=TRegistry.Cr ...
- 获取iOS系统版本 --- UIDevice
UIDevice类是一个单例,其唯一的实例( [UIDevice currentDevice] ) 代表了当前使用的设备. 通过这个实例,可以获得设备的相关信息(包括系统名称,版本号,设备模式等等). ...
- 查看mac系统版本
打开终端, 输入命令 uname -a 回车 x86_64 表示系统为64位 i686 表示系统32位的
- Node.js获取mac网卡地址
一.关于getmac node.js没有直接获取mac网卡地址的模块,此时我们需要借助于第三方模块getmac.getmac 可以帮助我们 获取当前机器上的mac地址.gatmac 下载地址为:htt ...
- 通过JAVA代码获取手机的一些基本信息(本机号码,SDK版本,系统版本,手机型号)
代码如下: package com.zzw.getPhoneInfos; import android.app.Activity; import android.content.Context; im ...
- mac 下获取 os x 的系统版本,使用 oc cocoa
mac 下获取 os x 的系统版本,使用 oc cocoa 1: #import <CoreServices/CoreServices.h> SInt32 major, minor, b ...
- C# 获取Windows系统:Cpu使用率,内存使用率,Mac地址,磁盘使用率
一.获取CPU使用率: #region 获取CPU使用率 #region AIP声明 [DllImport("IpHlpApi.dll")] ...
- Node+GitLab实现小程序CI系统
为什么要实现自动部署 小程序开发迭代里,有以下几个个头痛的问题, 如何准确并快速的的把小程序上传去后台,并让测试人员进行测试? 测试同事找开发要二维码,效率较低 本地生成的二维码会出现携带本地代码.未 ...
- 新买苹果电脑,mac系统中小白应该了解哪些东西?
本文旨在分享新买了mac电脑,应该做哪些设置,帮助苹果电脑小白轻松上手使用mac电脑,当然,新电脑肯定是需要安装各种软件,这里,小编推荐一下可以看看小编写的mac软件装机必备Mac 装机必备软件推荐, ...
随机推荐
- javascript的比较运算符
JavaScript一共提供了8个比较运算符: > 大于运算符 < 小于运算符 <= 小于等于运算符 >= 大于等于运算符 == 相等运算符 === 严格相等运算符 != 不相 ...
- Future和FutureTask的区别
java中有Future和FutureTask这两个类 Future是一个接口,代表可以取消的任务,并可以获得任务的执行结果 FutureTask 是基本的实现了Future和runnable接口 ...
- 我们如何监视所有 Spring Boot 微服务?
Spring Boot 提供监视器端点以监控各个微服务的度量.这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助.但是,使用监视器的一个主要缺点或困 ...
- Dubbo 和 Dubbox 之间的区别?
Dubbox 是继 Dubbo 停止维护后,当当网基于 Dubbo 做的一个扩展项目,如 加了服务可 Restful 调用,更新了开源组件等.
- Switch语句的条件只能接受什么类型的值
switch语句只能针对基本数据类型使用,这些类型包括int.char.枚举.bool等.对于其他类型,则必须使用if语句. 在一个 switch 中可以有任意数量的 case 语句.每个 case ...
- 解释 AOP 模块?
AOP 模块用于发给我们的 Spring 应用做面向切面的开发, 很多支持由 AOP 联 盟提供,这样就确保了 Spring 和其他 AOP 框架的共通性.这个模块将元数据编 程引入 Spring.
- logback日志级别动态切换的终极方案(asm使用)
背景 一切皆有因果,所有事情,都有事件驱动.本方案的日志级别切换是由这样的背景下产生的: 单个生产环境上,有几百近千个微服务 日志级别切换不重启服务,要求即时生效果 由业务开发人员去修改代码或增加相关 ...
- CSS揭秘之《背景图案》
网格 html { background: #58a; background-image: linear-gradient(white 2px, transparent 0), linear-grad ...
- 前端每日实战:134# 视频演示如何用 CSS 和 GSAP 创作一个树枝发芽的 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/LJmpXZ 可交互视频 此视频是可 ...
- 软件构造实验-百度图像识别api
识别结果: 识别结果: