npm 详解
npm 官方文檔:https://docs.npmjs.com/cli/v6/commands/npm-install/
npm 模塊管理器:http://javascript.ruanyifeng.com/nodejs/npm.html
npm 常用命令詳解:https://blog.csdn.net/sxs1995/article/details/80729069
1. 什么是 NPM
NPM 的全稱是 Node Package Manager,是隨同 NodeJS 一起安裝的包管理和分發工具,它很方便讓 JavaScript 開發者下載、安裝、上傳以及管理已經安裝的包。
npm 之于 Node.js ,就像 pip 之于 Python, gem 之于 Ruby, pear 之于 PHP 。
npm 是 Node.js 官方提供的包管理工具,他已經成了 Node.js 包的標準發布平臺,用于 Node.js 包的發布、傳播、依賴控制。
npm 提供了命令行工具,使你可以方便地下載、安裝、升級、刪除包,也可以讓你作為開發者發布并維護包。
2. 為什么要使用 NPM
npm 是隨同 Node.js 一起安裝的包管理工具,能解決 Node.js 代碼部署上的很多問題,常見的場景有以下幾種:
- 允許用戶從 npm 服務器下載別人編寫的第三方包到本地使用。
- 允許用戶從 npm 服務器下載并安裝別人編寫的命令行程序到本地使用。
- 允許用戶將自己編寫的包或命令行程序上傳到 npm 服務器供別人使用。
npm 的背后,是基于 couchdb 的一個數據庫,詳細記錄了每個包的信息,包括作者、版本、依賴、授權信息等。它的一個很重要的作用就是:將開發者從繁瑣的包管理工作(版本、依賴等)中解放出來,更加專注于功能的開發。
3. 如何使用 NPM
npm 安裝、升級
npm 不需要單獨安裝。在安裝 Node 的時候,會連帶一起安裝 npm 。但 Node 附帶的 npm 可能不是最新版本,最后用下面的命令,更新到最新版本。
$ sudo npm install npm@latest -g # Linux 命令 npm install npm -g # Window 系統使用這個命令也就是使用 npm 安裝自己。之所以可以這樣,是因為 npm 本身與 Node 的其他模塊沒有區別。$ npm help # 查看 npm 命令列表 $?npm?-l # 查看各個命令的簡單用法 $?npm?-v # 查看 npm 的版本 $?npm?config list -l # 查看 npm 的配置注意:npm install npm@latest -g 安裝完之后,如果報錯( 報找不到 npm ),可以再執行?curl -L https://npmjs.com/install.sh | sh 即可。。。
常用命令:
npm version ?查看 npm 和 node 的版本
npm list --depth=0 [-g] ?查看[全局]安裝的包
npm root [-g] ?查看[全局的]包的安裝路徑
npm install 安裝到指定目錄時,需要設置目錄,例如:npm config set prefix "f:\node" ,然后再執行 npm install 包名
npm install 到指定目錄
默認情況下,在哪個文件夾下運行 npm,npm 就在當前目錄創建一個文件夾 node_modules,然后將要安裝的程序安裝到文件夾 node_modules 里面。?這時候其他路徑項目無法引用到該目錄下的模塊!
如果我們需要自主配置的話
- 1.? 在目標目錄下建立 "node_global" 及 "node_cache" 兩個文件夾。
- 2.? 在 cmd 中輸入? ? ? ??? ? ? ??
? ? ? ? npm config set prefix "F:\14npm\node_global" ? ? ? ?// 設置 npm 安裝程序時的默認位置
? ? ? ? npm config set cache "F:\14npm\node_cache"? ? ? ?// 設置 npm 安裝程序時的緩存位置
? ? ? ? 但是這時候還是無法 require 這些模塊,需要在環境變量中進行設置!!!!! - 3. 在環境變量中添加 模塊保存路徑的變量 NODE_PATH(告訴系統 用戶下載的全局模塊在此處)。新建 NODE_PATH 值為 F:\14npm\node_global\node_modules
- 4.? 在 PATH 變量里面,添加 nodejs 路徑 ;C:\Program Files\nodejs;
-
5.? 最后安裝程序命令:$ npm install cheerio?-g? ? 需要加上 -g,不加 -g 關鍵字仍會安裝在你運行 npm 的文件夾下
nodejs 安裝、升級
- window 系統升級 nodejs 。只能到 nodejs 官網下載 window 安裝包來覆蓋之前的 nodejs。
- linux 系統升級 nodejs。
首先使用 npm 全局安裝一個管理node版本的管理模板n,就是n,不用懷疑。
?? ??? ?n 的 github地址: https://github.com/tj/n安裝命令: npm i -g n ?或者 npm i -g n --force
升級 node 版本,管理板塊n的命令有很多
? ? n 10.0.0 ? ? ?# "n 版本號" 升級到指定的版本
? ? n latest? ? ? ?# 安裝最新的版本
?? ?n --stable ? ?# 安裝最近的穩定版本
執行 node -v 查看版本
n 命令 幫助:n help
$ n helpUsage: n [options] [COMMAND] [args]Commands:n Display downloaded node versions and install selectionn latest Install the latest node release (downloading if necessary)n lts Install the latest LTS node release (downloading if necessary)n <version> Install node <version> (downloading if necessary)n run <version> [args ...] Execute downloaded node <version> with [args ...]n which <version> Output path for downloaded node <version>n exec <vers> <cmd> [args...] Execute command with modified PATH, so downloaded node <version> and npm firstn rm <version ...> Remove the given downloaded version(s)n prune Remove all downloaded versions except the installed versionn --latest Output the latest node version availablen --lts Output the latest LTS node version availablen ls Output downloaded versionsn ls-remote [version] Output matching versions available for downloadn uninstall Remove the installed node and npmOptions:-V, --version Output version of n-h, --help Display help information-p, --preserve Preserve npm and npx during install of node (requires rsync)-q, --quiet Disable curl output (if available)-d, --download Download only-a, --arch Override system architecture--all ls-remote displays all matches instead of last 20--insecure Turn off certificate checking for https requests (may be needed from behind a proxy server)--use-xz/--no-use-xz Override automatic detection of xz support and enable/disable use of xz compressed node downloads.Aliases:which: binrun: use, asls: listlsr: ls-remoterm: -lts: stablelatest: currentVersions:Numeric version numbers can be complete or incomplete, with an optional leading 'v'.Versions can also be specified by label, or codename,and other downloadable releases by <remote-folder>/<version>4.9.1, 8, v6.1 Numeric versionslts Newest Long Term Support official releaselatest, current Newest official releaseauto Read version from file: .n-node-version, .node-version, .nvmrc, or package.jsonboron, carbon Codenames for release streamslts_latest node support aliasesand nightly, chakracore-release/latest, rc/10 et alnpm init 初始化一個 package.json 文件
在項目中引導創建一個 package.json 文件,安裝包的信息可保持到項目的 package.json 文件中,以便后續的其它的項目開發或者他人合作使用,也說 package.json 在項目中是必不可少的。npm init?用來初始化生成一個新的 package.json 文件。它會向用戶提問一系列問題,如果你覺得不用修改默認配置,一路回車就可以了。
如果使用了 -f(代表force)、-y(代表yes),則跳過提問階段,直接生成一個新的 package.json 文件。
用法: npm init [-f|--force|-y|--yes] $ npm init -ynpm help 查看命令幫助
查看某條命令的詳細幫助 。基礎語法:npm help <term> [<terms..>]
例如:輸入 npm help install,系統在默認的瀏覽器或者默認的編輯器中打開本地 nodejs 安裝包的文件/nodejs/node_modules/npm/html/doc/cli/npm-install.html
npm?root?查看包的安裝路徑
輸出?node_modules 的路徑
$ npm root [-g]npm config?管理npm的配置路徑
基礎語法
npm config set <key> <value> [-g|--global] npm config get <key> npm config delete <key> npm config list npm config edit npm get <key> npm set <key> <value> [-g|--global]對于 config 這塊用得最多應該是設置代理,解決 npm 安裝一些模塊失敗的問題。
將指定的$dir目錄,設為模塊的全局安裝目錄。如果當前有這個目錄的寫權限,那么運行npm install的時候,就不再需要sudo命令授權
$ npm config set prefix $dir命令使得?npm install --save?和?npm install --save-dev?安裝新模塊時,允許的版本范圍從克拉符號(^)改成波浪號(~),即從允許小版本升級,變成只允許補丁包的升級。
$ npm config set save-prefix ~命令指定使用?npm init?時,生成的?package.json?文件的字段默認值。
$ npm config set init.author.name $name $ npm config set init.author.email $email設置代理示例:在公司內網,因為公司的防火墻原因,無法完成任何模塊的安裝時,可以執行下面命令
npm config set proxy=http://xxx又如國內的網絡環境問題,某官方的 IP 可能被和諧了,幸好國內有好心人,搭建了鏡像,此時我們簡單設置鏡像
npm config set registry="http://r.cnpmjs.org"也可以臨時配置,如安裝淘寶鏡像
npm install -g cnpm --registry=https://registry.npm.taobao.orgnpm cache 管理模塊的緩存
基礎語法
npm cache add <tarball file> npm cache add <folder> npm cache add <tarball url> npm cache add <name>@<version>npm cache ls [<path>]npm cache clean [<path>]最常用命令無非清除 npm 本地緩存:npm cache clean
npm start 啟動模塊
基礎語法:npm start [-- <args>]
該命令寫在 package.json 文件 scripts 的 start 字段中,可以自定義命令來配置一個服務器環境和安裝一系列的必要程序,如
"scripts": {"start": "gulp -ws" }此時在 cmd 中輸入 npm start 命令相當于執行 gulpfile.js 文件自定義的 watch 和 server 命令。
如果 package.json 文件沒有設置 start,則將直接啟動 node server.js
npm stop 停止模塊
基礎語法:npm stop [-- <args>]
npm restart 重新啟動模塊
基礎語法:npm restart [-- <args>]
npm test 測試模塊
基礎語法
npm test [-- <args>] npm tst [-- <args>]該命令寫在 package.json 文件 scripts 的 test 字段中,可以自定義該命令來執行一些操作,如
"scripts": {"test": "gulp release" },此時在 cmd 中輸入 npm test 命令相當于執行 gulpfile.js 文件自定義的 release 命令。
npm version 查看模塊版本
基礎語法
npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease | from-git]npm [-v | --version] to print npm version npm view <pkg> version to view a package's published version npm ls to inspect current package/dependency versions查看模塊的版本:npm version
npm view 查看模塊的注冊信息
基礎語法 npm view [<@scope>/]<name>[@<version>] [<field>[.<subfield>]...] aliases: info, show, vnpm view gulp dependencies 查看模塊 gulp 的依賴關系 npm view gulp repository.url 查看模塊 gulp 的源文件地址 npm view npm contributors 查看模塊 npm 的貢獻者,包含郵箱地址npm?adduser 用戶登錄
基礎語法:npm adduser [--registry=url] [--scope=@orgname] [--always-auth]
發布模板到 npm 社區前需要先登錄,然后再進入發布的操作
npm publish?發布模塊
基礎語法
npm publish [<tarball>|<folder>] [--tag <tag>] [--access <public|restricted>]Publishes '.' if no argument supplied Sets tag 'latest' if no --tag specifiednpm access?在發布的包上設置訪問級別
基礎語法
npm access public [<package>] npm access restricted [<package>]npm access grant <read-only|read-write> <scope:team> [<package>] npm access revoke <scope:team> [<package>]npm access ls-packages [<user>|<scope>|<scope:team>] npm access ls-collaborators [<package> [<user>]] npm access edit [<package>]npm set?用來設置環境變量
npm set?用來設置環境變量
$ npm set init-author-name 'Your name' $ npm set init-author-email 'Your email' $ npm set init-author-url 'http://yourdomain.com' $ npm set init-license 'MIT'上面命令等于為?npm init?設置了默認值,以后執行?npm init?的時候,package.json 的作者姓名、郵件、主頁、許可證字段就會自動寫入預設的值。這些信息會存放在用戶主目錄的 ~/.npmrc文件,使得用戶不用每個項目都輸入。如果某個項目有不同的設置,可以針對該項目運行?npm config。
$ npm set save-exact true上面命令設置加入模塊時,package.json?將記錄模塊的確切版本,而不是一個可選的版本范圍。
npm info?查看模塊信息
npm info?命令可以查看每個模塊的具體信息。比如,查看 underscore 模塊的信息。
$ npm info underscore { name: 'underscore',description: 'JavaScript\'s functional programming helper library.','dist-tags': { latest: '1.5.2', stable: '1.5.2' },repository:{ type: 'git',url: 'git://github.com/jashkenas/underscore.git' },homepage: 'http://underscorejs.org',main: 'underscore.js',version: '1.5.2',devDependencies: { phantomjs: '1.9.0-1' },licenses:{ type: 'MIT',url: 'https://raw.github.com/jashkenas/underscore/master/LICENSE' },files:[ 'underscore.js','underscore-min.js','LICENSE' ],readmeFilename: 'README.md'}上面命令返回一個 JavaScript 對象,包含了 underscore 模塊的詳細信息。這個對象的每個成員,都可以直接從 info 命令查詢。
$ npm info underscore description JavaScript's functional programming helper library.$ npm info underscore homepage http://underscorejs.org$ npm info underscore version 1.5.2npm search?搜索 npm 倉庫
npm search?命令用于搜索 npm 倉庫,它后面可以跟字符串,也可以跟正則表達式。
$ npm search <搜索詞>$ npm search node-gyp // NAME DESCRIPTION // autogypi Autogypi handles dependencies for node-gyp projects. // grunt-node-gyp Run node-gyp commands from Grunt. // gyp-io Temporary solution to let node-gyp run `rebuild` under… // ...npm list?列出安裝的模塊
npm list?命令以樹形結構列出當前項目安裝的所有模塊,以及它們依賴的模塊。
基礎語法npm ls [[<@scope>/]<pkg> ...]aliases: list, la, ll$ npm list # 注意:這個是列出本地( 即當前目錄 )安裝的模塊 $?npm?list -global # 加上 global 參數,會列出全局安裝的模塊 $ npm ls -g # 查看全局安裝的模塊及依賴? $?npm?list underscore # npm list 命令也可以列出單個模塊npm install?( 本地安裝、全局安裝?)
npm 安裝包的命令格式:npm [install/i] [package_name]
基礎語法: npm install (with no args, in package dir) npm install [<@scope>/]<name> npm install [<@scope>/]<name>@<tag> npm install [<@scope>/]<name>@<version> npm install [<@scope>/]<name>@<version range> npm install <tarball file> npm install <tarball url> npm install <folder> alias: npm i common options: [-S|--save|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [--dry-run]Node 模塊采用?npm install?命令安裝,每個模塊可以 “全局安裝”,也可以 “本地安裝”。“全局安裝” 指的是將一個模塊安裝到系統目錄中,各個項目都可以調用。
一般來說,
- 全局安裝 只適用于工具模塊,比如?eslint?和?gulp。
- 本地安裝?指的是將一個模塊下載到當前項目的?node_modules子目錄,然后只有在項目目錄之中,才能調用這個模塊。(?本地模式不會注冊 PATH 環境變量 )
關于使用全局模式,多數時候并不是因為許多程序都有可能用到了它,而是為了減少多重副本才使用全局模式。同時?本地模式不會注冊 PATH 環境變量。
本地模式 和 全局模式 的特點如下:
| 本地模式 | 是 | 否 |
| 全局模式 | 否 | 是 |
本地模式?和?全局模式
npm 在默認情況下會從?http://npmjs.org?搜索或下載包,將包安裝到當前目錄的 node_modules 子目錄下。
如果你熟悉 Ruby 的 gem 或者 Python 的 pip,你會發現 npm 與它們的行為不同,
- gem 或 pip 總是以 全局模式 安裝,使包可以供所有的程序使用,
- 而 npm 默認會把包安裝到當前目錄下,即?本地安裝?或者 本地模式。"本地安裝" 指的是將一個模塊下載到當前項目的 node_modules 子目錄,然后只有在項目目錄之中,才能調用這個模塊。這反映了 npm 不同的設計哲學:如果把包安裝到全局,可以提供程序的重復利用程度,避免同樣的內容的多分副本,但壞處是難以處理不同的版本依賴。如果把包安裝到當前目錄,或者說本地,則不會有不同程序依賴不同版本的包的沖突問題,同時還減輕了包作者的 API 兼容性壓力,但缺陷則是同一個包可能會被安裝許多次。
例如:如果安裝?supervisor 的時候使用了?npm install -g supervisor?命令,就是以全局模式安裝 supervisor 。這里注意一點的就是,supervisor 必須安裝到全局,如果你不安裝到全局,錯誤命令會提示你安裝到全局。如果不想安裝到默認的全局,也可以自己修改全局路徑到當前路徑?npm config set prefix "路徑"?安裝完以后就可以用 supervisor 來啟動服務了。supervisor 可以幫助你實現這個功能,它會監視你對代碼的驅動,并自動重啟 Node.js 。
# 本地安裝(local) $ npm install <package name># 全局安裝(global),使用 -g 或 --global $?sudo?npm?install?-global?<package name> $?sudo?npm?install?-g?<package name>npm install 也支持直接輸入 Github 代碼庫地址。 $ npm install git://github.com/package/path.git $ npm install git://github.com/package/path.git#0.1.0安裝之前,npm install 會先檢查,node_modules?目錄之中是否已經存在指定模塊。如果存在,就不再重新安裝了,即使遠程倉庫已經有了一個新版本,也是如此。
# 如果你希望,一個模塊不管是否安裝過, npm 都要強制重新安裝,可以使用 -f 或 --force 參數。 $ npm install <packageName> --force# 如果你希望,所有模塊都要強制重新安裝,那就刪除node_modules目錄,重新執行npm install。 $ rm -rf node_modules $ npm install安裝不同版本
- nmp install 命令總是安裝模塊的最新版本,
- 如果要安裝模塊的特定版本,可以在模塊名后面加上 @ 和 版本號。
如果使用 --save-exact 參數,會在 package.json 文件指定安裝模塊的確切版本。
$ npm install readable-stream --save --save-exact使用 npm install 安裝模塊的模塊的時候 ,一般會使用下面這幾種命令形式:
- npm install moduleName? ? ? ? # 安裝模塊到項目目錄下
- npm install -g moduleName? ? ? # -g 的意思是將模塊安裝到全局,具體安裝到磁盤哪個位置,要看 npm config prefix 的位置。
- npm install -save moduleName? ? ? # -save 的意思是將模塊安裝到項目目錄下,并在package文件的dependencies節點寫入依賴。
- npm install -save-dev moduleName? ? ?# -save-dev 的意思是將模塊安裝到項目目錄下,并在package文件的devDependencies節點寫入依賴。
下面對這四個命令進行對比,看完后你就不再這么問了。
npm install moduleName 命令
1. 安裝模塊到項目node_modules目錄下。
2. 不會將模塊依賴寫入devDependencies或dependencies 節點。
3. 運行 npm install 初始化項目時不會下載模塊。
npm install -g moduleName 命令
1. 安裝模塊到全局,不會在項目node_modules目錄中保存模塊包。
2. 不會將模塊依賴寫入devDependencies或dependencies 節點。
3. 運行 npm install 初始化項目時不會下載模塊。
npm install -save moduleName 命令
1. 安裝模塊到項目node_modules目錄下。
2. 會將模塊依賴寫入dependencies 節點。
3. 運行 npm install 初始化項目時,會將模塊下載到項目目錄下。
4. 運行npm install --production或者注明NODE_ENV變量值為production時,會自動下載模塊到node_modules目錄中。
npm install -save-dev moduleName 命令
1. 安裝模塊到項目node_modules目錄下。
2. 會將模塊依賴寫入devDependencies 節點。
3. 運行 npm install 初始化項目時,會將模塊下載到項目目錄下。
4. 運行npm install --production或者注明NODE_ENV變量值為production時,不會自動下載模塊到node_modules目錄中。
總結
devDependencies 節點下的模塊是我們在開發時需要用的,比如項目中使用的 gulp ,壓縮css、js的模塊。這些模塊在我們的項目部署后是不需要的,所以我們可以使用 -save-dev 的形式安裝。像 express 這些模塊是項目運行必備的,應該安裝在 dependencies 節點下,所以我們應該使用 -save 的形式安裝。
--save、--save-dev、--save-optional、--save-exact
--save 和 --save-dev
- --save 會把依賴包名稱添加到 package.json 文件 dependencies 鍵下,dependencies 是運行時依賴,
- --save-dev 則添加到 package.json 文件 devDependencies 鍵下,devDependencies 是開發時的依賴。即 devDependencies 下列出的模塊,是開發時用的
?比如,我們安裝 js的壓縮包 gulp-uglify 時,我們采用的是 “npm install --save-dev gulp-uglify ”命令安裝,因為我們在發布后用不到它,而只是在我們開發才用到它。dependencies 下的模塊,則是我們發布后還需要依賴的模塊,譬如像 jQuery庫或者 Angular 框架類似的,我們在開發完后后肯定還要依賴它們,否則就運行不了。
install 命令可以使用不同參數,指定所安裝的模塊屬于哪一種性質的依賴關系,即出現在 packages.json 文件的哪一項中。
--save:模塊名將被添加到 dependencies,可以簡化為參數 -S。?
--save-dev:模塊名將被添加到 devDependencies,可以簡化為參數 -D 。
$ npm install sax --save? ? ? ? ? ? ? ? ? ? ? # 或者? npm install sax -S
$ npm install node-tap --save-dev? ? ? # 或者? npm install node-tap -D
-S, --save 安裝包信息將加入到dependencies(生產階段的依賴)。示例:npm install gulp --save 或 npm install gulp -S
package.json 文件的 dependencies 字段:
"dependencies": {"gulp": "^3.9.1" }-D, --save-dev 安裝包信息將加入到devDependencies(開發階段的依賴),所以開發階段一般使用它。
示例:npm install gulp --save-dev 或 npm install gulp -D? ,package.json 文件的 devDependencies字段:
"devDependencies": {"gulp": "^3.9.1" }-O, --save-optional 安裝包信息將加入到 optionalDependencies(可選階段的依賴)。
示例:npm install gulp --save-optional 或 npm install gulp -O?,package.json 文件的 optionalDependencies 字段:
"optionalDependencies": {"gulp": "^3.9.1" }-E, --save-exact 精確安裝指定模塊版本。npm install gulp --save-exact 或 npm install gulp -E?。
輸入命令 npm install gulp -ES,留意 package.json 文件的 dependencies 字段,以看出版本號中的^消失了
"dependencies": {"gulp": "3.9.1" }模塊的依賴都被寫入了 package.json 文件后,他人打開項目的根目錄(項目開源、內部團隊合作),使用 npm install 命令可以根據 dependencies 配置安裝所有的依賴包
安裝 beta 版本的模塊
如果要安裝 beta 版本的模塊,需要使用下面的命令。
# 安裝最新的beta版 $ npm install <module-name>@beta (latest beta)# 安裝指定的beta版 $ npm install <module-name>@1.3.1-beta.3npm install?默認會安裝?dependencies?字段和?devDependencies?字段中的所有模塊,如果使用?--production?參數,可以只安裝?dependencies?字段的模塊。
$ npm install --production # 或者 $ NODE_ENV=production npm install一旦安裝了某個模塊,就可以在代碼中用?require?命令加載這個模塊。
var backbone = require('backbone') console.log(backbone.VERSION)npm uninstall?卸載模塊?
npm uninstall命令,卸載已安裝的模塊。
基礎語法 npm uninstall [<@scope>/]<pkg>[@<version>]... [-S|--save|-D|--save-dev|-O|--save-optional]$ npm uninstall [package name] aliases: remove, rm, r, un, unlink# 卸載全局模塊 $ npm uninstall [package name] -global如卸載開發版本的模塊 $ npm uninstall gulp --save-devnpm update?更新模塊
npm update?命令可以更新本地安裝的模塊。基礎語法:npm update [-g] [<pkg>...]
# 升級當前項目的指定模塊 $ npm update [package name]# 升級全局安裝的模塊 $ npm update -global [package name]它會先到遠程倉庫查詢最新版本,然后查詢本地版本。如果本地版本不存在,或者遠程版本較新,就會安裝。
使用?-S?或?--save?參數,可以在安裝的時候更新?package.json?里面模塊的版本號。
// 更新之前的package.json dependencies: {dep1: "^1.1.1" }// 更新之后的package.json dependencies: {dep1: "^1.2.2" }注意,從 npm v2.6.1 開始,npm update?只更新頂層模塊,而不更新依賴的依賴,以前版本是遞歸更新的。如果想取到老版本的效果,要使用下面的命令。
$ npm --depth 9999 updatenpm outdated?檢查模塊是否已經過時
基礎語法:npm outdated [[<@scope>/]<pkg> ...]
此命令會列出所有已經過時的包,可以及時進行包的更新
避免系統權限
默認情況下,Npm 全局模塊都安裝在系統目錄(比如/usr/local/lib/),普通用戶沒有寫入權限,需要用到sudo命令。這不是很方便,我們可以在沒有root權限的情況下,安裝全局模塊。
首先,在主目錄下新建配置文件.npmrc,然后在該文件中將?prefix?變量定義到主目錄下面。
prefix = /home/yourUsername/npm然后在主目錄下新建?npm?子目錄。
$ mkdir ~/npm此后,全局安裝的模塊都會安裝在這個子目錄中,npm也會到~/npm/bin目錄去尋找命令。最后,將這個路徑在.bash_profile文件(或.bashrc文件)中加入PATH變量。
export PATH=~/npm/bin:$PATHnpm run
npm?不僅可以用于模塊管理,還可以用于執行腳本。package.json?文件有一個?scripts?字段,可以用于指定腳本命令,供?npm?直接調用。
{"name": "myproject","devDependencies": {"jshint": "latest","browserify": "latest","mocha": "latest"},"scripts": {"lint": "jshint **.js","test": "mocha test/"} }上面代碼中,scripts?字段指定了兩項命令?lint?和?test。
命令行輸入?npm run-script lint?或者?npm run lint,就會執行?jshint **.js,輸入?npm run-script test?或者?npm run test,就會執行?mocha test/。
- npm run?是?npm run-script?的縮寫,一般都使用前者,但是后者可以更好地反應這個命令的本質。
- npm run?命令會自動在環境變量?$PATH?添加?node_modules/.bin?目錄,所以?scripts?字段里面調用命令時不用加上路徑,這就避免了全局安裝NPM模塊。
- npm run?如果不加任何參數,直接運行,會列出?package.json?里面所有可以執行的腳本命令。
- npm 內置了兩個命令簡寫,npm test等同于執行?npm run test,npm start?等同于執行npm run start。
- npm run?會創建一個 Shell,執行指定的命令,并臨時將?node_modules/.bin?加入 PATH 變量,這意味著本地模塊可以直接運行。
比如:執行 ESLint 的安裝命令:$ npm i eslint --save-dev?后,會產生兩個結果。
- 首先,ESLint 被安裝到當前目錄的?node_modules?子目錄;
- 其次,node_modules/.bin?目錄會生成一個符號鏈接?node_modules/.bin/eslint,指向 ESLint 模塊的可執行腳本。
- 然后,你就可以在?package.json?的?script?屬性里面,不帶路徑的引用?eslint?這個腳本。
等到運行?npm run lint?的時候,它會自動執行?./node_modules/.bin/eslint 。如果直接運行?npm run?不給出任何參數,就會列出?scripts?屬性下所有命令。
$ npm run Available scripts in the user-service package:lintjshint **.jstestmocha test/下面是另一個?package.json?文件的例子。
"scripts": {"watch": "watchify client/main.js -o public/app.js -v","build": "browserify client/main.js -o public/app.js","start": "npm run watch & nodemon server.js","test": "node test/all.js" },上面代碼在?scripts?項,定義了四個別名,每個別名都有對應的腳本命令。
$ npm run watch $ npm run build $ npm run start $ npm run test其中,start?和?test?屬于特殊命令,可以省略?run。
$ npm start $ npm test如果希望一個操作的輸出,是另一個操作的輸入,可以借用 Linux 系統的管道命令,將兩個操作連在一起。
"build-js": "browserify browser/main.js | uglifyjs -mc > static/bundle.js"但是,更方便的寫法是引用其他?npm run?命令。
"build": "npm run build-js && npm run build-css"上面的寫法是先運行?npm run build-js,然后再運行?npm run build-css,兩個命令中間用?&&?連接。如果希望兩個命令同時平行執行,它們中間可以用?&?連接。
下面是一個流操作的例子。
"devDependencies": {"autoprefixer": "latest","cssmin": "latest" },"scripts": {"build:css": "autoprefixer -b 'last 2 versions' < assets/styles/main.css | cssmin > dist/main.css" }寫在?scripts?屬性中的命令,也可以在?node_modules/.bin?目錄中直接寫成bash腳本。下面是一個 bash 腳本。
#!/bin/bashcd site/main browserify browser/main.js | uglifyjs -mc > static/bundle.js假定上面的腳本文件名為 build.sh,并且權限為可執行,就可以在 scripts 屬性中引用該文件。
"build-js": "bin/build.sh"npm run 添加參數
npm run?命令還可以添加參數。
"scripts": {"test": "mocha test/" }上面代碼指定?npm test,實際運行?mocha test/。如果要通過?npm test?命令,將參數傳到 mocha,則參數之前要加上兩個連詞線。
$ npm run test -- anothertest.js # 等同于 $ mocha test/ anothertest.js上面命令表示,mocha 要運行所有test子目錄的測試腳本,以及另外一個測試腳本anothertest.js。
npm run本身有一個參數-s,表示關閉npm本身的輸出,只輸出腳本產生的結果。
// 輸出npm命令頭 $ npm run test// 不輸出npm命令頭 $ npm run -s testscripts 腳本命令最佳實踐
scripts字段的腳本命令,有一些最佳實踐,可以方便開發。首先,安裝npm-run-all模塊。
$ npm install npm-run-all --save-dev這個模塊用于運行多個scripts腳本命令。
# 繼發執行 $ npm-run-all build:html build:js # 等同于 $ npm run build:html && npm run build:js# 并行執行 $ npm-run-all --parallel watch:html watch:js # 等同于 $ npm run watch:html & npm run watch:js# 混合執行 $ npm-run-all clean lint --parallel watch:html watch:js # 等同于 $ npm-run-all clean lint $ npm-run-all --parallel watch:html watch:js# 通配符 $ npm-run-all --parallel watch:*(1)start 腳本命令
? ? start?腳本命令,用于啟動應用程序:"start": "npm-run-all --parallel dev serve"
? ? 上面命令并行執行?dev?腳本命令和?serve?腳本命令,等同于:$ npm run dev & npm run serve
? ? 如果 start 腳本沒有配置,npm start?命令默認執行下面的腳本,前提是模塊的根目錄存在一個 server.js 文件:$ node server.js
(2)dev 腳本命令
? ? dev腳本命令,規定開發階段所要做的處理,比如構建網頁資源。:"dev": "npm-run-all dev:*"
? ? 上面命令用于繼發執行所有dev的子命令。
? ? :"predev:sass": "node-sass --source-map src/css/hoodie.css.map --output-style nested src/sass/base.scss src/css/hoodie.css"
? ? 上面命令將 sass 文件編譯為 css 文件,并生成 source map文件。
? ? :"dev:sass": "node-sass --source-map src/css/hoodie.css.map --watch --output-style nested src/sass/base.scss src/css/hoodie.css"
? ? 上面命令會監視sass文件的變動,只要有變動,就自動將其編譯為css文件。
? ? :"dev:autoprefix": "postcss --use autoprefixer --autoprefixer.browsers \"> 5%\" --output src/css/hoodie.css src/css/hoodie.css"
? ? 上面命令為css文件加上瀏覽器前綴,限制條件是只考慮市場份額大于5%的瀏覽器。
(3)serve 腳本命令
serve腳本命令用于啟動服務。:"serve": "live-server dist/ --port=9090"
上面命令啟動服務,用的是?live-server?模塊,將服務啟動在9090端口,展示dist子目錄。
live-server模塊有三個功能。
- 啟動一個HTTP服務器,展示指定目錄的index.html文件,通過該文件加載各種網絡資源,這是file://協議做不到的。
- 添加自動刷新功能。只要指定目錄之中,文件有任何變化,它就會刷新頁面。
- npm run serve命令執行以后,自動打開瀏覽器。、
以前,上面三個功能需要三個模塊來完成:http-server、live-reload和opener,現在只要live-server一個模塊就夠了。
(4)test 腳本命令
test?腳本命令用于執行測試。
"test": "npm-run-all test:*", "test:lint": "sass-lint --verbose --config .sass-lint.yml src/sass/*"上面命令規定,執行測試時,運行lint腳本,檢查腳本之中的語法錯誤。
(5)prod 腳本命令
prod?腳本命令,規定進入生產環境時需要做的處理。
"prod": "npm-run-all prod:*", "prod:sass": "node-sass --output-style compressed src/sass/base.scss src/css/prod/hoodie.min.css", "prod:autoprefix": "postcss --use autoprefixer --autoprefixer.browsers "> 5%" --output src/css/prod/hoodie.min.css src/css/prod/hoodie.min.css"上面命令將sass文件轉為css文件,并加上瀏覽器前綴。
(6)help 腳本命令
help?腳本命令用于展示幫助信息。
"help": "markdown-chalk --input DEVELOPMENT.md"上面命令之中,markdown-chalk模塊用于將指定的markdown文件,轉為彩色文本顯示在終端之中。
(7)docs 腳本命令
docs腳本命令用于生成文檔。
"docs": "kss-node --source src/sass --homepage ../../styleguide.md"上面命令使用?kss-node?模塊,提供源碼的注釋生成 markdown 格式的文檔。
pre- 和 post- 腳本
npm run?為每條命令提供了?pre-?和?post-?兩個鉤子(hook)。以?npm run lint?為例,執行這條命令之前,npm 會先查看有沒有定義 prelint 和 postlint 兩個鉤子,如果有的話,就會先執行?npm run prelint,然后執行?npm run lint,最后執行?npm run postlint。
{"name": "myproject","devDependencies": {"eslint": "latest""karma": "latest"},"scripts": {"lint": "eslint --cache --ext .js --ext .jsx src","test": "karma start --log-leve=error karma.config.js --single-run=true","pretest": "npm run lint","posttest": "echo 'Finished running tests'"} }上面代碼是一個?package.json?文件的例子。如果執行?npm test,會按下面的順序執行相應的命令。
如果執行過程出錯,就不會執行排在后面的腳本,即如果 prelint 腳本執行出錯,就不會接著執行 lint 和 postlint 腳本。
下面是一個例子。
{"test": "karma start","test:lint": "eslint . --ext .js --ext .jsx","pretest": "npm run test:lint" }上面代碼中,在運行?npm run test?之前,會自動檢查代碼,即運行?npm run test:lint?命令。
下面是一些常見的?pre-?和?post-?腳本。
- prepublish:發布一個模塊前執行。
- postpublish:發布一個模塊后執行。
- preinstall:用戶執行npm install命令時,先執行該腳本。
- postinstall:用戶執行npm install命令時,安裝結束后執行該腳本,通常用于將下載的源碼編譯成用戶需要的格式,比如有些模塊需要在用戶機器上跟本地的C++模塊一起編譯。
- preuninstall:卸載一個模塊前執行。
- postuninstall:卸載一個模塊后執行。
- preversion:更改模塊版本前執行。
- postversion:更改模塊版本后執行。
- pretest:運行npm test命令前執行。
- posttest:運行npm test命令后執行。
- prestop:運行npm stop命令前執行。
- poststop:運行npm stop命令后執行。
- prestart:運行npm start命令前執行。
- poststart:運行npm start命令后執行。
- prerestart:運行npm restart命令前執行。
- postrestart:運行npm restart命令后執行。
對于最后一個?npm restart?命令,如果沒有設置?restart?腳本,prerestart?和?postrestart?會依次執行 stop 和 start 腳本。
另外,不能在?pre?腳本之前再加?pre,即?prepretest?腳本不起作用。
注意,即使 Npm 可以自動運行?pre?和?post?腳本,也可以手動執行它們。
$ npm run prepublish下面是?post install?的例子。
{"postinstall": "node lib/post_install.js" }上面的這個命令,主要用于處理從Git倉庫拉下來的源碼。比如,有些源碼是用TypeScript寫的,可能需要轉換一下。
下面是?publish?鉤子的一個例子。
{"dist:modules": "babel ./src --out-dir ./dist-modules","gh-pages": "webpack","gh-pages:deploy": "gh-pages -d gh-pages","prepublish": "npm run dist:modules","postpublish": "npm run gh-pages && npm run gh-pages:deploy" }上面命令在運行?npm run publish?時,會先執行 Babel 編譯,然后調用 Webpack 構建,最后發到 Github Pages 上面。
以上都是 npm 相關操作的鉤子,如果安裝某些模塊,還能支持Git相關的鉤子。下面以husky模塊為例。
$ npm install husky --save-dev安裝以后,就能在package.json添加precommit、prepush等鉤子。
{"scripts": {"lint": "eslint yourJsFiles.js","precommit": "npm run test && npm run lint","prepush": "npm run test && npm run lint","...": "..."} }類似作用的模塊還有pre-commit、precommit-hook等。
內部變量
scripts 字段可以使用一些內部變量,主要是 package.json 的各種字段。
比如,package.json 的內容是{"name":"foo", "version":"1.2.5"},那么變量?npm_package_name?的值是 foo,變量?npm_package_version?的值是1.2.5。
{"scripts":{"bundle": "mkdir -p build/$npm_package_version/"} }運行?npm run bundle?以后,將會生成?build/1.2.5/?子目錄。
config?字段也可以用于設置內部字段。
"name": "fooproject","config": {"reporter": "xunit"},"scripts": {"test": "mocha test/ --reporter $npm_package_config_reporter"}上面代碼中,變量?npm_package_config_reporter?對應的就是 reporter。
通配符
npm 的通配符的規則如下。
- *? ? ? ? ? ? ?匹配0個或多個字符
- ?? ? ? ? ? ? ?匹配1個字符
- [...]? ? ? 匹配某個范圍的字符。如果該范圍的第一個字符是!或^,則匹配不在該范圍的字符。
- !(pattern|pattern|pattern)? ? ?匹配任何不符合給定的模式
- ?(pattern|pattern|pattern)? ? ?匹配0個或1個給定的模式
- +(pattern|pattern|pattern)? ? ?匹配1個或多個給定的模式
- *(a|b|c)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配0個或多個給定的模式
- @(pattern|pat*|pat?erN)? ? ? ? ? 只匹配給定模式之一
- **? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果出現在路徑部分,表示0個或多個子目錄。
npm link?創建全局鏈接
npm 提供了一個有趣的命令?npm link,它的功能是在本地包和全局包之間創建符號鏈接。我們說過使用全局模式安裝的包不能直接通過?require?使用。但通過?npm link?命令可以打破這一限制。舉個例子,我們已經通過?npm install -g express?安裝了 express,這時在工程的目錄下運行命令:
npm link express ./node_modules/express -> /user/local/lib/node_modules/express我們可以在?node_modules?子目錄中發現一個指向安裝到全局的包的符號鏈接。通過這種方法,我們就可以把全局包當做本地包來使用了。
除了將全局的包鏈接到本地以外,使用 npm link 命令還可以將本地的包鏈接到全局。使用方法是在包目錄(package.json 所在目錄)中運行 npm link 命令。如果我們要開發一個包,利用這種方法可以非常方便地在不同的工程間進行測試。
開發 NPM 模塊的時候,有時我們會希望,邊開發邊試用,比如本地調試的時候,require('myModule')會自動加載本機開發中的模塊。Node 規定,使用一個模塊時,需要將其安裝到全局的或項目的?node_modules?目錄之中。對于開發中的模塊,解決方法就是在全局的?node_modules?目錄之中,生成一個符號鏈接,指向模塊的本地目錄。npm link?就能起到這個作用,會自動建立這個符號鏈接。
請設想這樣一個場景,你開發了一個模塊?myModule,目錄為?src/myModule,你自己的項目?myProject?要用到這個模塊,項目目錄為?src/myProject。首先,在模塊目錄(src/myModule)下運行?npm link?命令。
src/myModule$ npm link上面的命令會在 NPM 的全局模塊目錄內,生成一個符號鏈接文件,該文件的名字就是?package.json?文件中指定的模塊名。
/path/to/global/node_modules/myModule -> src/myModule這個時候,已經可以全局調用?myModule?模塊了。但是,如果我們要讓這個模塊安裝在項目內,還要進行下面的步驟。
切換到項目目錄,再次運行?npm link?命令,并指定模塊名。
src/myProject$ npm link myModule上面命令等同于生成了本地模塊的符號鏈接。
src/myProject/node_modules/myModule -> /path/to/global/node_modules/myModule然后,就可以在你的項目中,加載該模塊了。
var myModule = require('myModule');這樣一來,myModule?的任何變化,都可以直接反映在?myProject?項目之中。但是,這樣也出現了風險,任何在?myProject?目錄中對?myModule?的修改,都會反映到模塊的源碼中。
如果你的項目不再需要該模塊,可以在項目目錄內使用?npm unlink?命令,刪除符號鏈接。
src/myProject$ npm unlink myModulenpm bin
npm bin命令顯示相對于當前目錄的,Node 模塊的可執行腳本所在的目錄(即.bin目錄)。
# 項目根目錄下執行 $ npm bin ./node_modules/.binnpm adduser
npm adduser?用于在 npmjs.com 注冊一個用戶。
$ npm adduser Username: YOUR_USER_NAME Password: YOUR_PASSWORD Email: YOUR_EMAIL@domain.comnpm publish
npm publish?用于將當前模塊發布到?npmjs.com。執行之前,需要向?npmjs.com?申請用戶名。
$ npm adduser如果已經注冊過,就使用下面的命令登錄。
$ npm login登錄以后,就可以使用?npm publish?命令發布。
$ npm publish如果當前模塊是一個beta版,比如1.3.1-beta.3,那么發布的時候需要使用tag參數,將其發布到指定標簽,默認的發布標簽是latest。
$ npm publish --tag beta如果發布私有模塊,模塊初始化的時候,需要加上scope參數。只有npm的付費用戶才能發布私有模塊。
$ npm init --scope=<yourscope>如果你的模塊是用ES6寫的,那么發布的時候,最好轉成ES5。首先,需要安裝Babel。
$ npm install --save-dev babel-cli@6 babel-preset-es2015@6然后,在package.json里面寫入build腳本。
"scripts": {"build": "babel source --presets babel-preset-es2015 --out-dir distribution","prepublish": "npm run build" }運行上面的腳本,會將source目錄里面的ES6源碼文件,轉為distribution目錄里面的ES5源碼文件。然后,在項目根目錄下面創建兩個文件.npmignore和.gitignore,分別寫入以下內容。
// .npmignore source// .gitignore node_modules distributionnpm deprecate
如果想廢棄某個版本的模塊,可以使用?npm deprecate?命令。
$ npm deprecate my-thing@"< 0.2.3" "critical bug fixed in v0.2.3"運行上面的命令以后,小于0.2.3版本的模塊的?package.json?都會寫入一行警告,用戶安裝這些版本時,這行警告就會在命令行顯示。
npm owner
模塊的維護者可以發布新版本。npm owner?命令用于管理模塊的維護者。
# 列出指定模塊的維護者 $ npm owner ls <package name># 新增維護者 $ npm owner add <user> <package name># 刪除維護者 $ npm owner rm <user> <package name>其他命令
npm home,npm repo
npm home?命令可以打開一個模塊的主頁,npm repo?命令則是打開一個模塊的代碼倉庫。
$ npm home $package $ npm repo $package這兩個命令不需要模塊先安裝。
npm outdated
npm outdated?命令檢查當前項目所依賴的模塊,是否已經有新版本。
$ npm outdated它會輸出當前版本(current version)、應當安裝的版本(wanted version)和最新發布的版本(latest version)。
npm prune
npm prune檢查當前項目的?node_modules?目錄中,是否有?package.json?里面沒有提到的模塊,然后將所有這些模塊輸出在命令行。
$ npm prunenpm shrinkwrap
npm shrinkwrap的作用是鎖定當前項目的依賴模塊的版本。
$ npm shrinkwrap運行該命令后,會在當前項目的根目錄下生成一個npm-shrinkwrap.json文件,內容是node_modules目錄下所有已經安裝的模塊,以及它們的精確版本。
下次運行npm install命令時,npm發現當前目錄下有npm-shrinkwrap.json文件,就會只安裝里面提到的模塊,且版本也會保持一致。
dependencies 依賴
這個可以說是我們 npm 核心一項內容,依賴管理,這個對象里面的內容就是我們這個項目所依賴的 js 模塊包。下面這段代碼表示我們依賴了?markdown-it?這個包,版本是?^8.1.0?,代表最小依賴版本是?8.1.0?,如果這個包有更新,那么當我們使用?npm install?命令的時候,npm 會幫我們下載最新的包。當別人引用我們這個包的時候,包內的依賴包也會被下載下來。
"dependencies": {"markdown-it": "^8.1.0" }devDependencies 開發依賴
在我們開發的時候會用到的一些包,只是在開發環境中需要用到,但是在別人引用我們包的時候,不會用到這些內容,放在 devDependencies 的包,在別人引用的時候不會被 npm 下載。
"devDependencies": {"autoprefixer": "^6.4.0",0","babel-preset-es2015": "^6.0.0","babel-preset-stage-2": "^6.0.0","babel-register": "^6.0.0","webpack": "^1.13.2","webpack-dev-middleware": "^1.8.3","webpack-hot-middleware": "^2.12.2","webpack-merge": "^0.14.1","highlightjs": "^9.8.0" }當你有了一個完整的 package.json 文件的時候,就可以讓人一眼看出來,這個模塊的基本信息,和這個模塊所需要依賴的包。我們可以通過 npm install 就可以很方便的下載好這個模塊所需要的包。
npm install?默認會安裝 dependencies 字段和 devDependencies 字段中的所有模塊,如果使用?--production?參數,可以只安裝 dependencies 字段的模塊。
$ npm install --production # 或者 $ NODE_ENV=production npm install一旦安裝了某個模塊,就可以在代碼中用 require 命令加載這個模塊。
var backbone = require('backbone') console.log(backbone.VERSION) # 項目根目錄下執行 $ npm bin ./node_modules/.bin創建包
包是在模塊基礎上更深一步的抽象,Node.js 的包類似于 C/C++ 的函數庫或者 Java、.Net 的類庫。它將某個獨立的功能封裝起來,用于發布、更新、依賴管理和版本控制。Node.js 根據 CommonJS 規范實現了包機制,開發了 npm 來解決包的發布和獲取需求。
Node.js 的包是一個目錄,其中包含了一個 JSON 格式的包說明文件 package.json。嚴格符合 CommonJS 規范的包應該具備以下特征:
- package.json 必須在包的頂層目錄下;
- 二進制文件應該在 bin 目錄下;
- JavaScript 代碼應該在 lib 目錄下;
- 文檔應該在 doc 目錄下;
- 單元測試應該在 test 目錄下。
Node.js 對包的要求并沒有這么嚴格,只要頂層目錄下有 package.json,并符合一些規范即可。當然為了提高兼容性,我們還是建議你在制作包的時候,嚴格遵守 CommonJS 規范。
我們也可以把文件夾封裝為一個模塊,即所謂的包。包通常是一些模塊的集合,在模塊的基礎上提供了更高層的抽象,相當于提供了一些固定接口的函數庫。通過定制 package.json,我們可以創建更復雜,更完善,更符合規范的包用于發布。
Node.js 在調用某個包時,會首先檢查包中 packgage.json 文件的 main 字段,將其作為包的接口模塊,如果 package.json 或 main 字段不存在,會嘗試尋找 index.js 或 index.node 作為包的接口。
npm package.json 的語法
英文原版:https://docs.npmjs.com/files/package.json
這塊內容好多,國內有好心人整理:《npm的package.json中文文檔》,從這份文檔拷貝出一些比較常見的,如下:
默認值
npm 會根據包內容設置一些默認值。
-
"scripts": {"start": "node server.js"}
如果包的根目錄有server.js文件,npm會默認將start命令設置為node server.js。
-
"scripts":{"preinstall": "node-waf clean || true; node-waf configure build"}
如果包的根目錄有wscript文件,npm會默認將preinstall命令用node-waf進行編譯。
-
"scripts":{"preinstall": "node-gyp rebuild"}
如果包的根目錄有binding.gyp文件,npm會默認將preinstall命令用node-gyp進行編譯。
-
"contributors": [...]
如果包的根目錄有AUTHORS文件,npm會默認逐行按Name <email> (url)格式處理,郵箱和url是可選的。#號和空格開頭的行會被忽略。
package.json 是 CommonJS 規定的用來描述包的文件,完全符合規范的 package.json 文件應該含有以下字段:
- name:? 包的名字,必須是唯一的,由小寫英文字母、數字和下劃線組成,不能包含空格。
- description:? 包的簡要說明。放簡介,字符串,方便在npm search中搜索
- version:? 符合語義化版本識別規范的版本字符串。version 必須能被?node-semver?解析,它被包在npm的依賴中。(要自己用可以執行npm install semver)
可用的“數字”或者“范圍”見semver(7).
- keywords:? 關鍵字,數組、字符串,通常用于搜索。方便在npm search中搜索
- maintainers:? 維護者數組,每個元素要包含 name 、email(可選)、web(可選)字段。
- contributors:? 貢獻者數組,格式與 maintainers 相同。包的作者應該是貢獻者數組的第一個元素。
- bugs:? 提交 bug 的地址,可以是網址或者電子郵件地址。
- licenses:? 許可證數組,每個元素要包含 type(許可證的名稱)和 url(鏈接到許可證文本的地址)字段。
- repositories:? 倉庫托管地址數組,每個元素要包含 type(倉庫的類型,如 git)、URL(倉庫的地址)和 path(相對于倉庫的路徑,可選)字段。
- dependencies:? 包的依賴,一個關聯數組,由包名稱和版本號組成。依賴是給一組包名指定版本范圍的一個hash。這個版本范圍是一個由一個或多個空格分隔的字符串。依賴還可以用tarball或者git URL。請不要將測試或過渡性的依賴放在dependencieshash中。見下文的devDependencies
- scripts:?“scripts” 是一個由腳本命令組成的hash對象,他們在包不同的生命周期中被執行。key是生命周期事件,value是要運行的命令。參考上面的npm start、npm test命令。更多詳細請看?npm-scripts(7)
- config:"config" hash可以用來配置用于包腳本中的跨版本參數。在實例中,如果一個包有下面的配置:{ "name" : "foo", "config" : { "port" : "8080" } },然后有一個 “start” 命令引用了?npm_package_config_port?環境變量,用戶可以通過?npm config set foo:port 8001?來重寫他。
參見?npm-config(7)?和?npm-scripts(7)。
需要說明的是:json 文件不能有注釋
在 package.json 中最重要的就是 name 和 version 字段。他們都是必須的,如果沒有就無法 install。name 和 version 一起組成的標識在假設中是唯一的。改變包應該同時改變version。
name是這個東西的名字。注意:
- 不要把node或者js放在名字中。因為你寫了package.json它就被假定成為了js,不過你可以用"engine"字段指定一個引擎(見后文)。
- 這個名字會作為在URL的一部分、命令行的參數或者文件夾的名字。任何non-url-safe的字符都是不能用的。
- 這個名字可能會作為參數被傳入require(),所以它應該比較短,但也要意義清晰。
- 在你愛上你的名字之前,你可能要去npm registry查看一下這個名字是否已經被使用了。http://registry.npmjs.org/
詳見?semver(7).
- version?必須完全和version一致
- >version?必須比version大
- >=version?同上
- <version?同上
- <=version?同上
- ~version?大約一樣,見semver(7)
- 1.2.x?1.2.0, 1.2.1, 等,但不包括1.3.0
- http://...?見下文'依賴URL'
- *?所有
- ""?空,同*
- version1 - version2?同?>=version1 <=version2.
- range1 || range2?二選一。
- git...?見下文'依賴Git URL'
- user/repo?見下文'GitHub URLs'
比如下面都是合法的:
{ "dependencies" :{ "foo" : "1.0.0 - 2.9999.9999" , "bar" : ">=1.0.2 <2.1.2" , "baz" : ">1.0.2 <=2.3.4" , "boo" : "2.0.1" , "qux" : "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0" , "asd" : "http://asdf.com/asdf.tar.gz" , "til" : "~1.2" , "elf" : "~1.2.3" , "two" : "2.x" , "thr" : "3.3.x" } }包的發布
通過使用?npm init?可以根據交互式回答產生一個符合標準的 package.json。創建一個?index.js?作為包的接口,一個簡單的包就制作完成了。
在發布前,我們還需要獲得一個賬號用于今后維護自己的包,使用?npm adduser?根據提示完成賬號的創建。
完成后可以使用?npm whoami?檢測是否已經取得了賬號。
接下來,在 package.json 所在目錄下運行?npm publish,稍等片刻就可以完成發布了,打開瀏覽器,訪問?http://search.npmjs.org/?就可以找到自己剛剛發布的包了。現在我們可以在世界的任意一臺計算機上使用?npm install neveryumodule?命令來安裝它。
如果你的包將來有更新,只需要在 package.json 文件中修改 version 字段,然后重新使用?npm publish?命令就行了。
如果你對已發布的包不滿意,可以使用?npm unpublish?命令來取消發布。
總結
- 上一篇: VS2019 使用 C/C++ 动态链接
- 下一篇: js 逆向分析的神器 --- v_jst