我们经常会看到一些脚手架会在启动完devServer后自动打开一个页面,大多数都是使用open这个库,开发体验很不错。但是如果你停止server,重新执行命令,会发现浏览器再次打开一个新的(tab)标签页,随着多次执行,会有一堆标签页,这时候就显得没那么优雅了(对于一个强迫症来说)。看到cra(create-react-app)就没有这个问题,直接复用之前打开的页面,感觉很神奇。搜索一番,看到SO上的回答,原来是使用了appleScript自动化(点击这里)去实现的,而且仅支持mac OS,其他平台fallback到open这个库的行为。
核心流程如下:
1. 先使用execSync同步执行shell命令判断浏览器进程是否存在,如果不存在会抛错误,不会执行后续流程
2.使用execSync同步执行shell命令,使用macos下独有的命令`osascript`去执行appleScript(如果你想实现同样的功能,react团队已经为我们写好了,可以直接拷贝源码),这个script主要逻辑如下:
2.1 解析启动脚本时传入的参数,第一个参数为url,第二个参数为浏览器名称(没有指定默认使用Google Chrome)。
2.2 打开指定的浏览器,查找窗口(因为可以打开多个窗口,这里是多对多的关系),如果没有窗口可用,则新建窗口。
2.3 遍历窗口下所有的标签页(双重循环),判断当前标签页url是否包含传入的url
2.3.1 如果包含,刷新当前标签页,并且激活标签页所在的窗口(切换焦点), 终止循环
2.3.2 如果不包含,查找是否有空标签页,如果有直接复用,反之,创建一个空标签页打开目标url
顺便提一下appleScript,他是mac OS实现自动化的主要手段,可以操控系统App,完成一些繁琐重复的工作。
感兴趣的童鞋可以看这篇文章,传送门
如下图所示,打开一个系统对话框