NodeJS中的命令行程序、工程目錄、NPM
使用NodeJS編寫(xiě)的東西,要么是一個(gè)包,要么是一個(gè)命令行程序,而前者最終也會(huì)用于開(kāi)發(fā)后者,一般我們會(huì)同時(shí)提供命令行模式和API模式兩種使用方式,并且我們會(huì)借助三方包來(lái)編寫(xiě)代碼,NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問(wèn)題。本文介紹了使用NodeJS編寫(xiě)代碼前需要做的準(zhǔn)備工作,包括NPM的介紹。
命令行程序
使用NodeJS編寫(xiě)的東西,要么是一個(gè)包,要么是一個(gè)命令行程序,而前者最終也會(huì)用于開(kāi)發(fā)后者。因此我們?cè)诓渴鸫a時(shí)需要一些技巧,讓用戶覺(jué)得自己是在使用一個(gè)命令行程序。
例如我們用NodeJS寫(xiě)了個(gè)程序,可以把命令行參數(shù)原樣打印出來(lái)。該程序很簡(jiǎn)單,在主模塊內(nèi)實(shí)現(xiàn)了所有功能。并且寫(xiě)好后,我們把該程序部署在/home/user/bin/node-echo.js
這個(gè)位置。為了在任何目錄下都能運(yùn)行該程序,我們需要使用以下終端命令。
$ node /home/user/bin/node-echo.js Hello World Hello World
這種使用方式看起來(lái)不怎么像是一個(gè)命令行程序,下邊的才是我們期望的方式。
$ node-echo Hello World
Linux
在Linux系統(tǒng)下,我們可以把JS文件當(dāng)作shell腳本來(lái)運(yùn)行,從而達(dá)到上述目的,具體步驟如下:
在shell腳本中,可以通過(guò)
#!
注釋來(lái)指定當(dāng)前腳本使用的解析器。所以我們首先在node-echo.js
文件頂部增加以下一行注釋,表明當(dāng)前腳本使用NodeJS解析。#! /usr/bin/env node
NodeJS會(huì)忽略掉位于JS模塊首行的
#!
注釋,不必?fù)?dān)心這行注釋是非法語(yǔ)句。然后,我們使用以下命令賦予
node-echo.js
文件執(zhí)行權(quán)限。$ chmod +x /home/user/bin/node-echo.js
最后,我們?cè)赑ATH環(huán)境變量中指定的某個(gè)目錄下,例如在
/usr/local/bin
下邊創(chuàng)建一個(gè)軟鏈文件,文件名與我們希望使用的終端命令同名,命令如下:$ sudo ln -s /home/user/bin/node-echo.js /usr/local/bin/node-echo
這樣處理后,我們就可以在任何目錄下使用node-echo
命令了。
Windows
在Windows系統(tǒng)下的做法完全不同,我們得靠.cmd
文件來(lái)解決問(wèn)題。假設(shè)node-echo.js
存放在C:\Users\user\bin
目錄,并且該目錄已經(jīng)添加到PATH環(huán)境變量里了。接下來(lái)需要在該目錄下新建一個(gè)名為node-echo.cmd
的文件,文件內(nèi)容如下:
@node "C:\User\user\bin\node-echo.js" %*
這樣處理后,我們就可以在任何目錄下使用node-echo
命令了。
工程目錄
了解了以上知識(shí)后,現(xiàn)在我們可以來(lái)完整地規(guī)劃一個(gè)工程目錄了。以編寫(xiě)一個(gè)命令行程序?yàn)槔?,一般我們?huì)同時(shí)提供命令行模式和API模式兩種使用方式,并且我們會(huì)借助三方包來(lái)編寫(xiě)代碼。除了代碼外,一個(gè)完整的程序也應(yīng)該有自己的文檔和測(cè)試用例。因此,一個(gè)標(biāo)準(zhǔn)的工程目錄都看起來(lái)像下邊這樣。
- /home/user/workspace/node-echo/ # 工程目錄 - bin/ # 存放命令行相關(guān)代碼 node-echo + doc/ # 存放文檔 - lib/ # 存放API相關(guān)代碼 echo.js - node_modules/ # 存放三方包 + argv/ + tests/ # 存放測(cè)試用例 package.json # 元數(shù)據(jù)文件 README.md # 說(shuō)明文件
其中部分文件內(nèi)容如下:
/* bin/node-echo */ var argv = require('argv'), echo = require('../lib/echo'); console.log(echo(argv.join(' '))); /* lib/echo.js */ module.exports = function (message) { return message; }; /* package.json */ { "name": "node-echo", "main": "./lib/echo.js" }
以上例子中分類存放了不同類型的文件,并通過(guò)node_moudles
目錄直接使用三方包名加載模塊。此外,定義了package.json
之后,node-echo
目錄也可被當(dāng)作一個(gè)包來(lái)使用。
NPM
NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問(wèn)題,常見(jiàn)的使用場(chǎng)景有以下幾種:
允許用戶從NPM服務(wù)器下載別人編寫(xiě)的三方包到本地使用。
允許用戶從NPM服務(wù)器下載并安裝別人編寫(xiě)的命令行程序到本地使用。
允許用戶將自己編寫(xiě)的包或命令行程序上傳到NPM服務(wù)器供別人使用。
可以看到,NPM建立了一個(gè)NodeJS生態(tài)圈,NodeJS開(kāi)發(fā)者和用戶可以在里邊互通有無(wú)。以下分別介紹這三種場(chǎng)景下怎樣使用NPM。
下載三方包
需要使用三方包時(shí),首先得知道有哪些包可用。雖然npmjs.org提供了個(gè)搜索框可以根據(jù)包名來(lái)搜索,但如果連想使用的三方包的名字都不確定的話,就請(qǐng)百度一下吧。知道了包名后,比如上邊例子中的argv
,就可以在工程目錄下打開(kāi)終端,使用以下命令來(lái)下載三方包。
$ npm install argv ... argv@0.0.2 node_modules\argv
下載好之后,argv
包就放在了工程目錄下的node_modules
目錄中,因此在代碼中只需要通過(guò)require('argv')
的方式就好,無(wú)需指定三方包路徑。
以上命令默認(rèn)下載最新版三方包,如果想要下載指定版本的話,可以在包名后邊加上@
,例如通過(guò)以下命令可下載0.0.1版的argv
。
$ npm install argv@0.0.1 ... argv@0.0.1 node_modules\argv
如果使用到的三方包比較多,在終端下一個(gè)包一條命令地安裝未免太人肉了。因此NPM對(duì)package.json
的字段做了擴(kuò)展,允許在其中申明三方包依賴。因此,上邊例子中的package.json
可以改寫(xiě)如下:
{ "name": "node-echo", "main": "./lib/echo.js", "dependencies": { "argv": "0.0.2" } }
這樣處理后,在工程目錄下就可以使用npm install
命令批量安裝三方包了。更重要的是,當(dāng)以后node-echo
也上傳到了NPM服務(wù)器,別人下載這個(gè)包時(shí),NPM會(huì)根據(jù)包中申明的三方包依賴自動(dòng)下載進(jìn)一步依賴的三方包。例如,使用npm install node-echo
命令時(shí),NPM會(huì)自動(dòng)創(chuàng)建以下目錄結(jié)構(gòu)。
- project/ - node_modules/ - node-echo/ - node_modules/ + argv/ ... ...
如此一來(lái),用戶只需關(guān)心自己直接使用的三方包,不需要自己去解決所有包的依賴關(guān)系。
安裝命令行程序
從NPM服務(wù)上下載安裝一個(gè)命令行程序的方法與三方包類似。例如上例中的node-echo
提供了命令行使用方式,只要node-echo
自己配置好了相關(guān)的package.json
字段,對(duì)于用戶而言,只需要使用以下命令安裝程序。
$ npm install node-echo -g
參數(shù)中的-g
表示全局安裝,因此node-echo
會(huì)默認(rèn)安裝到以下位置,并且NPM會(huì)自動(dòng)創(chuàng)建好Linux系統(tǒng)下需要的軟鏈文件或Windows系統(tǒng)下需要的.cmd
文件。
- /usr/local/ # Linux系統(tǒng)下 - lib/node_modules/ + node-echo/ ... - bin/ node-echo ... ... - %APPDATA%\npm\ # Windows系統(tǒng)下 - node_modules\ + node-echo\ ... node-echo.cmd ...
發(fā)布代碼
第一次使用NPM發(fā)布代碼前需要注冊(cè)一個(gè)賬號(hào)。終端下運(yùn)行npm adduser
,之后按照提示做即可。賬號(hào)搞定后,接著我們需要編輯package.json
文件,加入NPM必需的字段。接著上邊node-echo
的例子,package.json
里必要的字段如下。
{ "name": "node-echo", # 包名,在NPM服務(wù)器上須要保持唯一 "version": "1.0.0", # 當(dāng)前版本號(hào) "dependencies": { # 三方包依賴,需要指定包名和版本號(hào) "argv": "0.0.2" }, "main": "./lib/echo.js", # 入口模塊位置 "bin" : { "node-echo": "./bin/node-echo" # 命令行程序名和主模塊位置 } }
之后,我們就可以在package.json
所在目錄下運(yùn)行npm publish
發(fā)布代碼了。
版本號(hào)
使用NPM下載和發(fā)布代碼時(shí)都會(huì)接觸到版本號(hào)。NPM使用語(yǔ)義版本號(hào)來(lái)管理代碼,這里簡(jiǎn)單介紹一下。
語(yǔ)義版本號(hào)分為X.Y.Z
三位,分別代表主版本號(hào)、次版本號(hào)和補(bǔ)丁版本號(hào)。當(dāng)代碼變更時(shí),版本號(hào)按以下原則更新。
+ 如果只是修復(fù)bug,需要更新Z位。 + 如果是新增了功能,但是向下兼容,需要更新Y位。 + 如果有大變動(dòng),向下不兼容,需要更新X位。
版本號(hào)有了這個(gè)保證后,在申明三方包依賴時(shí),除了可依賴于一個(gè)固定版本號(hào)外,還可依賴于某個(gè)范圍的版本號(hào)。例如"argv": "0.0.x"
表示依賴于0.0.x
系列的最新版argv
。NPM支持的所有版本號(hào)范圍指定方式可以查看官方文檔。
更多
除了本章介紹的部分外,NPM還提供了很多功能,package.json
里也有很多其它有用的字段。除了可以在npmjs.org/doc/查看官方文檔外,這里再介紹一些NPM常用命令。
NPM提供了很多命令,例如
install
和publish
,使用npm help
可查看所有命令。使用
npm help
可查看某條命令的詳細(xì)幫助,例如npm help install
。在
package.json
所在目錄下使用npm install . -g
可先在本地安裝當(dāng)前命令行程序,可用于發(fā)布前的本地測(cè)試。使用
npm update
可以把當(dāng)前目錄下node_modules
子目錄里邊的對(duì)應(yīng)模塊更新至最新版本。使用
npm update -g
可以把全局安裝的對(duì)應(yīng)命令行程序更新至最新版。使用
npm cache clear
可以清空NPM本地緩存,用于對(duì)付使用相同版本號(hào)發(fā)布新版本代碼的人。使用
npm unpublish @
可以撤銷發(fā)布自己發(fā)布過(guò)的某個(gè)版本代碼。
相關(guān)文章
Node解決簡(jiǎn)單重復(fù)問(wèn)題系列之Excel內(nèi)容的獲取
這篇文章主要給大家介紹了關(guān)于利用Node解決簡(jiǎn)單重復(fù)問(wèn)題系列之Excel內(nèi)容獲取的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧。2018-01-01Node環(huán)境中JS代碼缺少window對(duì)象的原因和解決方案
你可能會(huì)在某些情況下需要在Node環(huán)境下運(yùn)行JavaScript代碼,但你也可能會(huì)遇到一個(gè)常見(jiàn)的問(wèn)題:缺少window環(huán)境,在本文中,我們將深入探討這個(gè)問(wèn)題的原因,并提供解決方案,需要的朋友可以參考下2023-08-08Linux環(huán)境部署node服務(wù)并啟動(dòng)詳細(xì)步驟
最近用node.js開(kāi)發(fā)了一個(gè)web項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于Linux環(huán)境部署node服務(wù)并啟動(dòng)的詳細(xì)步驟,文中通過(guò)圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05使用nodejs搭建微信小程序支付接口的詳細(xì)過(guò)程
前段時(shí)間做微信支付,遇到了很多坑,網(wǎng)上也沒(méi)有講解的特別明白的,通過(guò)借鑒各路人才的經(jīng)驗(yàn),最后也完成了,下面這篇文章主要給大家介紹了關(guān)于使用nodejs搭建微信小程序支付接口的詳細(xì)過(guò)程,需要的朋友可以參考下2022-12-12Nodejs中調(diào)用系統(tǒng)命令、Shell腳本和Python腳本的方法和實(shí)例
這篇文章主要介紹了Nodejs中調(diào)用系統(tǒng)命令、Shell腳本和Python腳本的方法和實(shí)例,本文給出了利用子進(jìn)程調(diào)用系統(tǒng)命令、執(zhí)行系統(tǒng)命令、調(diào)用傳參數(shù)的shell腳本、調(diào)用python腳本的例子,需要的朋友可以參考下2015-01-01node實(shí)現(xiàn)將json轉(zhuǎn)為excel
平時(shí)我們寫(xiě)代碼處理的數(shù)據(jù)格式一般都是json格式的數(shù)據(jù),但有時(shí)候我們也需要將數(shù)據(jù)轉(zhuǎn)為excel格式進(jìn)行保存或分享,所以下面我們就來(lái)學(xué)習(xí)一下如何通過(guò)node實(shí)現(xiàn)json轉(zhuǎn)excel吧2024-11-11深入理解Puppeteer的入門(mén)教程和實(shí)踐
這篇文章主要介紹了深入理解Puppeteer的入門(mén)教程和實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03