npm使用理解

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 --savenpm 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倉庫,它後面可以跟字符串,也可以跟正則表達式。

$ 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命令安裝。

每個模塊可以“全局安裝”,也可以“本地安裝”。“全局安裝”指的是將一個模塊安裝到系統目錄中,各個項目都可以調用。一般來說,全局安裝只適用於工具模塊,比如eslintgulp。“本地安裝”指的是將一個模塊下載到當前項目的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字段指定了兩項命令linttest。命令行輸入npm run-script lint或者npm run lint,就會執行jshint **.js,輸入npm run-script test或者npm run test,就會執行mocha test/npm runnpm run-script的縮寫,一般都使用前者,但是後者可以更好地反應這個命令的本質。

npm run命令會自動在環境變量$PATH添加node_modules/.bin目錄,所以scripts字段裏面調用命令時不用加上路徑,這就避免了全局安裝NPM模塊。

npm run如果不加任何參數,直接運行,會列出package.json裏面所有可以執行的腳本命令。

npm內置了兩個命令簡寫,npm test等同於執行npm run testnpm 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.jsonscript屬性裏面,不帶路徑的引用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

其中,starttest屬於特殊命令,可以省略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-serverlive-reloadopener,現在只要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,會按下面的順序執行相應的命令。

  1. pretest
  2. test
  3. 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腳本,prerestartpostrestart會依次執行stop和start腳本。

另外,不能在pre腳本之前再加pre,即prepretest腳本不起作用。

注意,即使Npm可以自動運行prepost腳本,也可以手動執行它們。

$ 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添加precommitprepush等鉤子。

{
    "scripts": {
        "lint": "eslint yourJsFiles.js",
        "precommit": "npm run test && npm run lint",
        "prepush": "npm run test && npm run lint",
        "...": "..."
    }
}

類似作用的模塊還有pre-commitprecommit-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

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文件,就會只安裝裏面提到的模塊,且版本也會保持一致。

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章