前端面試之輸入npm?run后執(zhí)行原理
引言
在前端開發(fā)的工作當(dāng)中,使用 npm run dev
的命令啟動本地開發(fā)環(huán)境,是再正常不過的事了。那么,當(dāng)輸入完類似 npm run xxx
的命令后,究竟是如何觸發(fā)各種構(gòu)建工具的構(gòu)建命令以及啟動 Node 服務(wù)等功能的呢?
首先我們知道,Node 作為 JavaScript 的運行時,可以把 .js
文件當(dāng)做腳本來運行,像這種:
node index.js
當(dāng)我們使用 npm
來管理項目(或者 yarn
)時,會在根目錄下生成一個 package.json
文件,其中的 scripts
屬性,就是用于配置 npm run xxx
命令的,比如我有如下配置:
// package.json { // ... "scripts": { "start": "node ./src/index.js", "build": "react-scripts build", }, // ... }
當(dāng)執(zhí)行 npm start
時,對于 npm
來說,相當(dāng)于執(zhí)行 npm run start
,則映射為 scripts
屬性下的 start
命令,即
npm start # 相當(dāng)于 npm run start # 相當(dāng)于 node ./src/index.js
這個比較好理解,就是直接使用全局安裝的 Node 命令來執(zhí)行了 ./src
目錄下的 index.js
文件而已。
如上面類似,執(zhí)行 npm run build
即相當(dāng)于執(zhí)行 react-scripts build
命令。這個命令,是使用 create-react-app
搭建 React 項目時默認(rèn)配置的。與 Node 不同,react-scripts
并沒有全局安裝,怎么就能直接執(zhí)行呢?
這時我們不妨看一下,使用 create-react-app
搭建的項目(使用 vue-cli
搭建的項目也一樣),在 npm install
后,其 node_modules
目錄下面的樣子:
如圖可以看到有一個 .bin
目錄,這個目錄不是任何一個 npm
包。目錄下的文件,右面都有一個小箭頭(VS Code 上這樣顯示),表示這是一個軟鏈接,打開文件可以看到文件頂部寫著 #!/user/bin/env node
,表示這是一個通過使用 Node 執(zhí)行的腳本。
由此我們可以知道,當(dāng)使用 npm run build
執(zhí)行 react-scripts build
時,雖然沒有安裝 react-scripts
的全局命令,但是 npm
會到 ./node_modules/.bin
中找到 react-scripts.js
文件作為 Node 腳本來執(zhí)行,則相當(dāng)于執(zhí)行了 ./node_modules/.bin/react-scripts build
(最后的 build
作為參數(shù)傳入)。
npm run build # 相當(dāng)于 ./node_modules/.bin/react-scripts build
前面說過,react-scripts
是一個軟鏈接,那么它的指向是哪里,又是怎么來的呢?
我們可以在 node_modules
目錄下,直接找到 react-scripts
包,查看其目錄結(jié)構(gòu)和 package.json
如下:
從 package.json
中可知,這個包將 ./bin/react-scripts.js
作為 bin
聲明了。所以在 npm install
時,npm
讀到該配置后,就將該文件軟鏈接到 ./node_modules/.bin
目錄下,而 npm
還會自動把node_modules/.bin加入$PATH,這樣就可以直接作為命令運行依賴程序和開發(fā)依賴程序,不用全局安裝了。
假如我們在安裝包時,使用 npm install -g xxx
來安裝,那么會將其中的 bin
文件加入到全局,比如 create-react-app
和 vue-cli
,在全局安裝后,就可以直接使用如 vue-cli projectName
這樣的命令來創(chuàng)建項目了。
以上就是前端面試之輸入npm run后執(zhí)行原理的詳細(xì)內(nèi)容,更多關(guān)于npm run執(zhí)行原理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Node.js數(shù)據(jù)流Stream之Duplex流和Transform流用法
這篇文章介紹了Node.js數(shù)據(jù)流Stream之Duplex流和Transform流的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07nodejs+express實現(xiàn)文件上傳下載管理網(wǎng)站
這篇文章主要為大家詳細(xì)介紹了nodejs+express實現(xiàn)文件上傳下載管理的網(wǎng)站,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03在nodeJs中如何修改json文件中的數(shù)據(jù)
這篇文章主要介紹了在nodeJs中如何修改json文件中的數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10Node.js?操作本地文件及深入了解fs內(nèi)置模塊
這篇文章主要介紹了Node.js?操作本地文件及深入了解fs內(nèi)置模塊,node.js作為服務(wù)端應(yīng)用,肯定少不了對本地文件的操作,像創(chuàng)建一個目錄、創(chuàng)建一個文件、讀取文件內(nèi)容等都是我們開發(fā)中經(jīng)常需要用到的功能2022-09-09使用GruntJS構(gòu)建Web程序之Tasks(任務(wù))篇
任務(wù)(Tasks)是grunt的核心概念,你所做的很多工作比如資源合并(concat)、壓縮(uglify)都是在配置任務(wù)。 每次grunt運行的時候,你指定的一個或多個任務(wù)也在運行,如果你沒有指定任務(wù),那么一個默認(rèn)名為“default”的任務(wù)將自動運行。2014-06-06詳解Nodejs get獲取遠(yuǎn)程服務(wù)器接口數(shù)據(jù)
這篇文章主要介紹了Nodejs get獲取遠(yuǎn)程服務(wù)器接口數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03