npm模塊管理器
來自《JavaScript 標準參考教程(alpha)》,by 阮一峯
簡介
npm
有兩層含義。一層含義是Node的開放式模塊登記和管理系統,網址爲npmjs.org。另一層含義是Node默認的模塊管理器,是一個命令行下的軟件,用來安裝和管理Node模塊。
npm
不需要單獨安裝。在安裝Node的時候,會連帶一起安裝npm
。但是,Node附帶的npm
可能不是最新版本,最好用下面的命令,更新到最新版本。
$ npm install npm@latest -g
上面的命令中,@latest
表示最新版本,-g
表示全局安裝。所以,命令的主幹是npm install npm
,也就是使用npm
安裝自己。之所以可以這樣,是因爲npm
本身與Node的其他模塊沒有區別。
然後,運行下面的命令,查看各種信息。
# 查看 npm 命令列表
$ npm help
# 查看各個命令的簡單用法
$ npm -l
# 查看 npm 的版本
$ npm -v
# 查看 npm 的配置
$ npm config list -l
npm init
npm init
用來初始化生成一個新的package.json
文件。它會向用戶提問一系列問題,如果你覺得不用修改默認配置,一路回車就可以了。
如果使用了-f
(代表force)、-y
(代表yes),則跳過提問階段,直接生成一個新的package.json
文件。
$ npm init -y
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 config
$ npm config set prefix $dir
上面的命令將指定的$dir
目錄,設爲模塊的全局安裝目錄。如果當前有這個目錄的寫權限,那麼運行npm install
的時候,就不再需要sudo
命令授權了。
$ npm config set save-prefix ~
上面的命令使得npm install --save
和npm install --save-dev
安裝新模塊時,允許的版本範圍從克拉符號(^
)改成波浪號(~
),即從允許小版本升級,變成只允許補丁包的升級。
$ npm config set init.author.name $name
$ npm config set init.author.email $email
上面命令指定使用npm init
時,生成的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.2
npm search
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 list
加上global參數,會列出全局安裝的模塊。
$ npm list -global
npm list
命令也可以列出單個模塊。
$ npm list underscore
npm install
基本用法
Node模塊採用npm install
命令安裝。
每個模塊可以“全局安裝”,也可以“本地安裝”。“全局安裝”指的是將一個模塊安裝到系統目錄中,各個項目都可以調用。一般來說,全局安裝只適用於工具模塊,比如eslint
和gulp
。“本地安裝”指的是將一個模塊下載到當前項目的node_modules
子目錄,然後只有在項目目錄之中,才能調用這個模塊。
# 本地安裝
$ npm install <package name>
# 全局安裝
$ 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
安裝不同版本
install命令總是安裝模塊的最新版本,如果要安裝模塊的特定版本,可以在模塊名後面加上@和版本號。
$ npm install sax@latest
$ npm install [email protected]
$ npm install sax@">=0.1.0 <0.2.0"
如果使用--save-exact
參數,會在package.json文件指定安裝模塊的確切版本。
$ npm install readable-stream --save --save-exact
install命令可以使用不同參數,指定所安裝的模塊屬於哪一種性質的依賴關係,即出現在packages.json文件的哪一項中。
- –save:模塊名將被添加到dependencies,可以簡化爲參數
-S
。 - –save-dev: 模塊名將被添加到devDependencies,可以簡化爲參數
-D
。
$ npm install sax --save
$ npm install node-tap --save-dev
# 或者
$ npm install sax -S
$ npm install node-tap -D
如果要安裝beta版本的模塊,需要使用下面的命令。
# 安裝最新的beta版
$ npm install <module-name>@beta (latest beta)
# 安裝指定的beta版
$ npm install <module-name>@1.3.1-beta.3
npm install
默認會安裝dependencies
字段和devDependencies
字段中的所有模塊,如果使用--production
參數,可以只安裝dependencies
字段的模塊。
$ npm install --production
# 或者
$ NODE_ENV=production npm install
一旦安裝了某個模塊,就可以在代碼中用require
命令加載這個模塊。
var backbone = require('backbone')
console.log(backbone.VERSION)
避免系統權限
默認情況下,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:$PATH
npm update,npm uninstall
npm update
命令可以更新本地安裝的模塊。
# 升級當前項目的指定模塊
$ 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 update
npm uninstall
命令,卸載已安裝的模塊。
$ npm uninstall [package name]
# 卸載全局模塊
$ npm uninstall [package name] -global
npm 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
這個腳本。
{
"name": "Test Project",
"devDependencies": {
"eslint": "^1.10.3"
},
"scripts": {
"lint": "eslint ."
}
}
等到運行npm run lint
的時候,它會自動執行./node_modules/.bin/eslint .
。
如果直接運行npm run
不給出任何參數,就會列出scripts
屬性下所有命令。
$ npm run
Available scripts in the user-service package:
lint
jshint **.js
test
mocha 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/bash
cd site/main
browserify browser/main.js | uglifyjs -mc > static/bundle.js
假定上面的腳本文件名爲build.sh,並且權限爲可執行,就可以在scripts屬性中引用該文件。
"build-js": "bin/build.sh"
參數
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 test
scripts腳本命令最佳實踐
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
,會按下面的順序執行相應的命令。
pretest
test
posttest
如果執行過程出錯,就不會執行排在後面的腳本,即如果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模塊的時候,有時我們會希望,邊開發邊試用,比如本地調試的時候,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 myModule
npm bin
npm bin
命令顯示相對於當前目錄的,Node模塊的可執行腳本所在的目錄(即.bin
目錄)。
# 項目根目錄下執行
$ npm bin
./node_modules/.bin
npm adduser
npm adduser
用於在npmjs.com註冊一個用戶。
$ npm adduser
Username: YOUR_USER_NAME
Password: YOUR_PASSWORD
Email: [email protected]
npm 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
distribution
npm 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 prune
npm shrinkwrap
npm shrinkwrap
的作用是鎖定當前項目的依賴模塊的版本。
$ npm shrinkwrap
運行該命令後,會在當前項目的根目錄下生成一個npm-shrinkwrap.json
文件,內容是node_modules
目錄下所有已經安裝的模塊,以及它們的精確版本。
下次運行npm install
命令時,npm
發現當前目錄下有npm-shrinkwrap.json
文件,就會只安裝裏面提到的模塊,且版本也會保持一致。
參考鏈接
- James Halliday, task automation with npm run: npm run命令(package.json文件的script屬性)的用法
- Keith Cirkel, How to Use npm as a Build Tool
- justjs, npm link: developing your own npm modules without tears
- hoodie-css, Development Environment Help
- Stephan Bönnemann, How to make use of npm’s package distribution tags to create release channels
- Alex Booker, How to Build and Publish ES6 npm Modules Today, with Babel