我們經常會看到一些腳手架會在啟動完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,完成一些繁瑣重複的工作。
感興趣的童鞋可以看這篇文章,傳送門
如下圖所示,開啟一個系統對話方塊