每次啟動項目的服務,電腦竟然乖乖的幫我打開了瀏覽器,100行源碼揭秘!

1. 前言

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12 參與,已進行三個月了,大家一起交流學習,共同進步。

想學源碼,極力推薦之前我寫的《學習源碼整體架構系列》 包含jQueryunderscorelodashvuexsentryaxiosreduxkoavue-devtoolsvuex4koa-composevue-next-releasevue-thiscreate-vue玩具vite等10余篇源碼文章。

本文倉庫 open-analysis,求個star^_^[1]

最近組織了源碼共讀活動,大家一起學習源碼。于是搜尋各種值得我們學習,且代碼行數不多的源碼。

我們經常遇到類似場景:每次啟動項目的服務,電腦竟然乖乖的幫我打開了瀏覽器。當然你也可能沒有碰到過,但可能有這樣的需求。而源碼300行左右,核心源碼不到100行。跟我們工作息息相關,非常值得我們學習。

之前寫過據說 99% 的人不知道 vue-devtools 還能直接打開對應組件文件?本文原理揭秘,也是跟本文類似原理。

閱讀本文,你將學到:

1.?電腦竟然乖乖的幫我打開了瀏覽器原理和源碼實現
2.?學會使用?Node.js?強大的?child_process?模塊
3.?學會調試學習源碼
4.?等等

2. 使用

2.1 在 webpack 中使用

devServer.open[2]

告訴 dev-server[3] 在服務器啟動后打開瀏覽器。將其設置為 true 以打開您的默認瀏覽器。

webpack.config.js

module.exports?=?{//...devServer:?{open:?true,},
};

Usage via the CLI:

npx?webpack?serve?--open

To disable:

npx?webpack?serve?--no-open

現在大多數都不是直接用 webpack 配置了。而是使用腳手架。那么接著來看我們熟悉的腳手架中,打開瀏覽器的功能是怎么使用的。

2.2 在 vue-cli 使用

npx?@vue/cli?create?vue3-project
#?我的?open-analysis?項目中?vue3-project?文件夾
#?npm?i?-g?yarn
#?yarn?serve?不會自動打開瀏覽器
yarn?serve
#?--open?參數后會自動打開瀏覽器
yarn?serve?--open

2.3 在 create-react-app 使用

npx?create-react-app?react-project
#?我的?open-analysis?項目中?react-project?文件夾
#?npm?i?-g?yarn
#?默認自動打開了瀏覽器
yarn?start
3383b191e938bddb248873de8297191c.png
為此我截了圖

終端我用的是 window terminal,推薦我之前的文章:使用 ohmyzsh 打造 windows、ubuntu、mac 系統高效終端命令行工具,用過都說好。

webpackvue-clicreate-react-app,它們三者都有個特點就是不約而同的使用了open[4]

引用 open 分別的代碼位置是:

  • webpack-dev-server[5]

  • vue-cli[6]

  • create-react-app[7]

接著我們來學習open原理和源碼。

3. 原理

npm 之王 @sindresorhus[8] 的 open README文檔[9]中,英文描述中寫了為什么使用它的幾條原因。

為什么推薦使用 open

積極維護。
支持應用參數。
更安全,因為它使用?spawn?而不是?exec。
修復了大多數 node-open 的問題。
包括適用于 Linux 的最新 xdg-open 腳本。
支持 Windows 應用程序的 WSL 路徑。

一句話概括open原理則是:針對不同的系統,使用Node.js的子進程 child_process 模塊的spawn方法,調用系統的命令打開瀏覽器。

對應的系統命令簡單形式則是:

#?mac
open?https://lxchuan12.gitee.io
#?win
start?https://lxchuan12.gitee.io
#?linux
xdg-open?https://lxchuan12.gitee.io

windows start 文檔[10]

open包描述信息:open[11]

在這里可以看到有哪些 npm 包依賴了 open[12]

我們熟悉的很多 npm 包都依賴了open。這里列舉幾個。

  • webpack-dev-server[13]

  • react-dev-utils[14]

  • @vue/cli-shared-utils[15]

  • patch-package[16]

  • lighthouse[17]

  • release-it[18]

4. 閱讀源碼前的準備工作

#?推薦克隆我的項目,保證與文章同步,同時測試文件齊全
git?clone?https://github.com/lxchuan12/open-analysis.git
#?npm?i?-g?yarn
cd?open?&&?yarn#?或者克隆官方項目
git?clone?https://github.com/sindresorhus/open.git
#?npm?i?-g?yarn
cd?open?&&?yarn

4.1 寫個例子,便于調試源碼

由于測試用例相對較為復雜,我們自己動手寫個簡單的例子,便于我們自己調試。

根據 README,我們在 open-analysis 文件夾下新建一個文件夾 examples ,里面存放一個 index.js。文件內容如下:

//?open-analysis/examples/index.js
(async?()?=>?{const?open?=?require('../open/index.js');await?open('https://lxchuan12.gitee.io');
})();

await open('https://lxchuan12.gitee.io'); 打上斷點。在終端命令行中執行

node?examples/index.js

會自動喚起調試模式。如果不支持先閱讀這個官方文檔配置:Node.js debugging in VS Code[19],如果還是不行,可以升級到最新版VSCode試試。

跟著調試我們可以進入 open 函數。

775ff1aa17dced19f01caf611e69897c.png
調試
19ae5f5bce75b524de7227260be4e205.png
VSCode 調試 Node.js 說明

4.2 open 打開函數

//?open/index.js
const?open?=?(target,?options)?=>?{if?(typeof?target?!==?'string')?{throw?new?TypeError('Expected?a?`target`');}return?baseOpen({...options,target});
};

跟著斷點,我們來看最終調用的 baseOpen。這個函數比較長,重點可以猜到是:const subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);這句,我們可以打上斷點調試。

4.3 baseOpen 基礎打開函數

//?open/index.js
const?childProcess?=?require('child_process');
const?localXdgOpenPath?=?path.join(__dirname,?'xdg-open');const?{platform,?arch}?=?process;
//?調試時我們可以自行調整修改平臺,便于調試各個平臺異同,比如?mac、win、linux
//?const?{arch}?=?process;
//?mac
//?const?platform?=?'darwin';
//?win
//?const?platform?=?'win32';
//?const?platform?=?'其他';const?baseOpen?=?async?options?=>?{options?=?{wait:?false,background:?false,newInstance:?false,allowNonzeroExitCode:?false,...options};//?省略部分代碼//?命令let?command;//?命令行參數const?cliArguments?=?[];//?子進程選項const?childProcessOptions?=?{};if?(platform?===?'darwin')?{command?=?'open';//?省略?mac?部分代碼}?else?if?(platform?===?'win32'?||?(isWsl?&&?!isDocker()))?{//?省略?window?或者?window?子系統代碼const?encodedArguments?=?['Start'];}?else?{const?useSystemXdgOpen?=?process.versions.electron?||platform?===?'android'?||?isBundled?||?!exeLocalXdgOpen;command?=?useSystemXdgOpen???'xdg-open'?:?localXdgOpenPath;//?省略?linux?代碼}//?省略部分代碼const?subprocess?=?childProcess.spawn(command,?cliArguments,?childProcessOptions);//?省略部分代碼subprocess.unref();return?subprocess;
}

由此我們可以看出:

一句話概括open原理則是:針對不同的系統,使用Node.js的子進程 child_process 模塊的spawn方法,調用系統的命令打開瀏覽器。

對應的系統命令簡單形式則是:

#?mac
open?https://lxchuan12.gitee.io
#?win
start?https://lxchuan12.gitee.io
#?linux
xdg-open?https://lxchuan12.gitee.io

5. 總結

一句話概括open原理則是:針對不同的系統,使用Node.js的子進程 child_process 模塊的spawn方法,調用系統的命令打開瀏覽器。

本文從日常常見的場景每次啟動服務就能自動打開瀏覽器出發,先講述了日常在webpackvue-clicreate-react-app如何使用該功能,最后從源碼層面解讀了open[20]的原理和源碼實現。工作常用的知識能做到知其然,知其所以然,就比很多人厲害了。

因為文章不宜過長,所以未全面展開講述源碼中所有細節。非常建議讀者朋友按照文中方法使用VSCode調試 open 源碼。學會調試源碼后,源碼并沒有想象中的那么難

最后可以持續關注我@若川。歡迎加我微信 ruochuan12 交流,參與 源碼共讀 活動,大家一起學習源碼,共同進步。

參考資料

[1]

本文倉庫 open-analysis,求個star^_^: https://github.com/lxchuan12/open-analysis.git

[2]

更多參考資料可以點擊閱讀原文查看


最近組建了一個江西人的前端交流群,如果你是江西人可以加我微信?ruochuan12?私信 江西?拉你進群。

推薦閱讀

1個月,200+人,一起讀了4周源碼
我歷時3年才寫了10余篇源碼文章,但收獲了100w+閱讀

老姚淺談:怎么學JavaScript?

我在阿里招前端,該怎么幫你(可進面試群)

2ee6956259164ba40d0f272156a0d5fa.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》10余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助1000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

3006e44bb5033a9015b3daa80767339b.png

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。歡迎分享、收藏、點贊、在看我的公眾號文章~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275254.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275254.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275254.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初級爬蟲師_初級設計師的4條視覺原則

初級爬蟲師重點 (Top highlight)Like many UXers, I got into the industry from a non-visual background (in my case it was Business and later on Human Cognition). Even though I found great benefits coming from those backgrounds, it also meant I had no UI/Visua…

String類中IndexOf與SubString

IndexOfpublic: int IndexOf( String^ value, int startIndex, int count ) 說明: value類型:System..::.String要查找的 String。 startIndex類型:System..::.Int32搜索起始位置。 count類型:System..::.Int32要檢查的字符位置…

開源監控解決方案OpenFalcon系列(一)

OpenFalcon是由小米的運維團隊開源的一款企業級、高可用、可擴展的開源監控解決方案,,在眾多開源愛好者的支持下,功能越來越豐富,文檔更加的完善,OpenFalcon 已經成為國內最流行的監控系統之一。小米、美團、金山云、快…

如何利用 webpack 在項目中做出亮點

大家好,我是若川。最近這幾年,在前端代碼打包器領域內,webpack 算得上是時下最流行的前端打包工具。它可以分析各個模塊的依賴關系,最終打包成我們常見的靜態文件:.js 、 .css 、 .jpg 、.png,極大地提升了…

[轉]上下拉電阻

上下拉電阻有什么用? 對這個問題,平時沒有留意過,搞設計的時候都是照本宣科,沒有真正弄懂意思. 很多單片機開發的入門者,以及一些從事軟件開發的人,往往在開發單片機的時候遇到上拉電阻、下拉…

yum安裝Mariadb,二進制安裝Mariadb

yum安裝Mariadb 設置Mariadb的yum源 vim /etc/yum.repos.d/mariadb.repo [mariadb] namemariadb baseurlhttps://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.2/centos7-amd64/ gpgcheck0 使用清華yum源安裝Mariadb,可以選擇不同的版本,此處安裝10.2.23 yum in…

Oracle中的wmsys.wm_concat

Oracle中的wmsys.wm_concat主要實現行轉列功能(說白了就是將查詢的某一列值使用逗號進行隔開拼接,成為一條數據)。 wmsys.wm_concat除了單獨使用外還可以和over函數結合使用。 開始看看具體使用方法: select t.rank, t.Name from t_menu_item t; rank…

Github 王炸功能!Copilot 替代打工人編程?

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12 參與,已進行三個月了,大家一起交流學習,共同進步。大家好,我是皮湯。最近組里在討論一個有意思的工具 Github Copilot&#xff…

ux和ui_糟糕的UI與UX番茄醬模因

ux和uiAt face value, this meme appears to be a quick and easy tool for educating the general public about what the differences are between UI and UX. You might look at the attractive glass bottle labeled “UI” and understand that UI might have to do more …

Linux中的wheel用戶組是什么?

在Linux中wheel組就類似于一個管理員的組。 通常在Linux下,即使我們有系統管理員root的權限,也不推薦用root用戶登錄。一般情況下用普通用戶登錄就可以了,在需要root權限執行一些操作時,再su登錄成為root用戶。但是,任…

ElementUI 組件庫 md-loader 的解析和優化

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12 參與,已進行三個月了,大家一起交流學習,共同進步。背景相信很多同學在學習 webpack 的時候,對 loader 的概念應該有所了解&…

一個html5流星雨源碼

流星會隨著鼠標的方向劃過&#xff0c;按緊鼠標左鍵可以增長流星的尾巴。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang"zh-CN"> <head> <title>流星雨<…

csdn 用戶 螞蟻翹大象_用戶界面設計師房間里的大象

csdn 用戶 螞蟻翹大象Once upon a time, an educated eye detected a new trend in UI designs, particularly, in Dribbble. It was a conceptual proposition, not an actual design for a customer or an app. Trying to explain the characteristics of this new trend, a …

面試官問發布訂閱模式是在問什么?

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;已進行了三個多月&#xff0c;大家一起交流學習&#xff0c;共同進步。本文來自 simonezhou 小姐姐投稿的第八期筆記。面試官常問發布訂閱、觀察者模式&#…

linux服務器內存、根目錄使用率、某進程的監控告警腳本

腳本內容如下 #!/bin/bash#磁盤超過百分之80發送郵件告警DISK_USEDdf -T |sed -n "2p" |awk {print ($4/$3)*100}DISK_percentage80if [ expr "$DISK_USED > $DISK_percentage" ]thenecho "$HOSTNAME服務器當前硬盤使用率為$DISK_USED%" | ma…

figma下載_不用擔心Figma中的間距

figma下載重點 (Top highlight)I spend way too much time caring about spacing when designing interfaces and building design systems. You are probably no stranger to the constant 1 px and 8 px nudging, continuous checking of the bottom or in-between space for…

【建議收藏】面試官賊喜歡問的 32+ vue 修飾符,你掌握幾種啦?

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;已進行了三個多月&#xff0c;大家一起交流學習&#xff0c;共同進步。前言vue簡潔好用體現在很多個地方&#xff0c;比如其內置了32修飾符&#xff0c;可以很…

知識管理系統Data Solution研發日記之一 場景設計與需求列出

在平時開發的過程中&#xff0c;經常會查找一些資料&#xff0c;從網上下載一些網頁&#xff0c;壓縮格式文件到自己的電腦中&#xff0c;然后閱讀。程序有別于其他行業的一個特征是&#xff0c;所有的資料&#xff0c;數據&#xff0c;壓縮文件&#xff0c;只用于產生可以工作…

系列TCP/IP協議-動態IP選路協議(008)

一、引言 前一章已經說過了IP數據包是如何分發的。為啥這一章還要說這個問題&#xff1f;在網絡很小、只有單個連接點、沒有多余的路由的時候&#xff0c;使用靜態選路是可以的。但是一旦網絡變大一點就會出現各種問題。在大網絡中的網絡選路將在該節說明。 ??動態選路協議用…

shields 徽標_我們如何準確地記住著名徽標的特征和顏色?

shields 徽標The logos of global corporations like Apple, Starbucks, Adidas, and IKEA are designed to create instant brand associations in the minds of billions who see them every day. But how accurately can we remember the features and colors of these famo…