原文地址:https://blog.csdn.net/u013022210/article/details/77740519
1.以下為報錯具體詳情;node 8.1.2 版本問題:其他空間安裝成功但是安裝webpack 總是報以下錯誤:解決辦法為重新安裝node
2.
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
用來初始化生成一個新的package.json
文件。它會向用戶提問一系列問題,如果你覺得不用修改默認配置,一路回車就可以了。
如果使用了-f
(代表force)、-y
(代表yes),則跳過提問階段,直接生成一個新的package.json
文件。
$ npm init -y
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 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
命令可以查看每個模塊的具體信息。比如,查看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倉庫,它后面可以跟字符串,也可以跟正則表達式。
$ 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
加上global參數,會列出全局安裝的模塊。
$ npm list -global
npm list
命令也可以列出單個模塊。
$ npm list underscore
基本用法
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 sax@0.1.1 $ 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 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
不僅可以用於模塊管理,還可以用於執行腳本。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模塊的時候,有時我們會希望,邊開發邊試用,比如本地調試的時候,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
命令顯示相對於當前目錄的,Node模塊的可執行腳本所在的目錄(即.bin
目錄)。
# 項目根目錄下執行 $ npm bin ./node_modules/.bin
npm adduser
用於在npmjs.com注冊一個用戶。
$ npm adduser
Username: YOUR_USER_NAME
Password: YOUR_PASSWORD
Email: YOUR_EMAIL@domain.com
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 my-thing@"< 0.2.3" "critical bug fixed in v0.2.3"
運行上面的命令以后,小於0.2.3
版本的模塊的package.json
都會寫入一行警告,用戶安裝這些版本時,這行警告就會在命令行顯示。
模塊的維護者可以發布新版本。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
文件,就會只安裝里面提到的模塊,且版本也會保持一致。