VuePress源碼閱讀(一)--初探 VuePress

thumb-1920-1107572.png

最近開發(fā)和寫文章都用到了 VuePress 和 SSR,在深入學(xué)習(xí)的同時(shí)寫點(diǎn)文章記錄一下

一、最簡起步

首先按照 VuePress 的指導(dǎo)創(chuàng)建一個最小的網(wǎng)站:

mkdir vuepress-ssr
cd vuepress-ssr
yarn init -y
yarn add -D vuepress
mkdir docs
echo '# Hello VuePress' > docs/README.md

接著打開 packjge.json 并添加本地調(diào)試 & 打包的命令:

"scripts": {
  "docs:dev": "npx --node-arg=--inspect vuepress dev --debug docs",
  "docs:build": "npx --node-arg=--inspect vuepress build --debug docs"
}

ok 這樣最簡單的準(zhǔn)備就搞定了,不過我們暫時(shí)不急著調(diào)試,可以先來看看代碼.

二、CLI外殼 - vuepress

我們打開剛剛創(chuàng)建的項(xiàng)目的 node_modules,找到 vuepress 文件夾:

image-20210114185426058

看到主邏輯文件只有 cli.js 和 index.js 兩個,再看看 package.json:

image-20210114185924797

可知我們平常使用的 vuepress 調(diào)用的其實(shí)就是 cli.js 文件. 再來看看 cli.js 干了什么:

image-20210114200503449

這里的 cli 其實(shí)是npm包 CAC (命令行工具)返回的操作實(shí)例,這里用到command、option、action 三個方法,執(zhí)行邏輯在 action 中

暫時(shí)忽略命令行相關(guān)的預(yù)處理和后續(xù)處理操作,這里的重點(diǎn)關(guān)注 registerCoreCommands 這個方法,上面腳本中的 vuepress dev docsvuepress build docs 的邏輯就在這里的 action 中:

image-20210114201402659

第 38 行開始就將運(yùn)行方法作為參數(shù)放入 wrapcommand 準(zhǔn)備執(zhí)行,dev、build 都來自 node_modules/@vuepress 的 core 文件夾:

image-20210114201607617

也就是說 node_modules/vuepress 其實(shí)只是個 CLI 殼子,而真正的 dev、build、eject 邏輯都在 node_modules/@vuepress 中!

接下來我們繼續(xù)探究 @vuepress 內(nèi)部的邏輯

三、@vuepress 探究

現(xiàn)在通過 node_modules/@vuepress 的代碼來進(jìn)一步了解:

image-20210114211314418

進(jìn)入 @vuepress/core 的 index.js:

image-20210114211430226

在這里能看到對 dev 和 build 的預(yù)處理相同,都是通過 createApp() 創(chuàng)建一個 app,然后對 app 進(jìn)行 process 處理, 但是之后 dev 和 build 就開始進(jìn)入不同邏輯了.

3.1 createApp

createApp 就在 index.js 中,內(nèi)部返回了 new App(options) 的結(jié)果,App類的構(gòu)造器如下,主要負(fù)責(zé)環(huán)境判斷和解析目錄參數(shù):

image-20210114212219741

當(dāng)然 App類攜帶了很多很多的方法,主最要的 process、dev、build 當(dāng)然是都包括在內(nèi)的.

3.2 process

process 則包含比較多功能,經(jīng)過一番閱讀后將每個階段做的事情描述如下:

截屏2021-01-14_下午11_22_44

現(xiàn)在瀏覽器打開 chrome://inspect/#devices,然后運(yùn)行 yarn docs:dev (直接運(yùn)行 npx --node-arg=--inspect vuepress dev --debug docs 也行),當(dāng) Remote Target 出現(xiàn) Target 時(shí) inspect 進(jìn)到控制臺:

image-20210114224725966

進(jìn)去之后應(yīng)該什么都看不到,不慌,回剛剛代碼的 process 函數(shù)里加上一行 debugger,然后重新運(yùn)行 yarn docs:dev,現(xiàn)在回到調(diào)控制臺就可以按照自己的需要調(diào)試了:

image-20210114224939498

當(dāng)執(zhí)行完 118 行的 await this.resolvePages() 之后就可以看到 pages 添加了一個 Page,也就是我們最簡網(wǎng)站的 README 文件中包含的 Hello VuePress.

image-20210114225759622

整個 process 函數(shù)走完之后,可以看到在 @vuepress/core 文件夾下生成了臨時(shí)文件夾 .temp:

image-20210114230232109

process 函數(shù)將項(xiàng)目資源 & 配置進(jìn)行解析,然后通過加載&運(yùn)行插件,最終生成了臨時(shí)文件. vuepress dev docsvuepress build docs 共享的邏輯就到此為止了.

接下來 vuepress dev docs 會通過引入 WebpackDevServer 來啟動一個服務(wù)器, vuepress build docs 會根據(jù) client & server 的不同配置執(zhí)行 Webpack 打包,最后還會做靜態(tài)HTML渲染,這些內(nèi)容會放在下一篇文章中,敬請期待??ヽ(°▽°)ノ?

歡迎拍磚,覺得還行也歡迎點(diǎn)贊收藏~
新開公號:「無夢的冒險(xiǎn)譚」歡迎關(guān)注(搜索 Nodreame 也可以~)
旅程正在繼續(xù) ??ヽ(°▽°)ノ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容