Node.js使得在服務器端使用JavaScript編寫應用程序成爲可能。它是基於V8Javascript運行時而且使用C++編寫的,因此它的速度很快。最初,它旨在做爲應用程序的服務器環境,可是開發人員使用它建立工具來幫助他們進行本地任務自動化。從那時起,一個全新的基於Node的工具生態系統(如Grunt,Gulp和Webpack)完全改變了前端開發的面貌。前端
爲了在Node.js中使用這些工具(或者包),咱們須要可以以有效的方式安裝和管理它們。這就是咱們即將要討論的:npm--Node的包管理器。它負責安裝你須要使用的包,而且提供一個有用的界面讓你與它們交互。node
在本文中,我將介紹使用npm的基礎知識。我將向你演示如何在本地和全局模式下安裝包,以及刪除,更新和安裝某個版本的包。我還會告訴你如何使用package.json
處理項目的依賴。若是你更喜歡看視頻,請註冊SitePoint Premium觀看咱們的免費錄屏:什麼是npm以及如何使用?。linux
在開始使用npm以前,首先須要在電腦中安裝Node.js。webpack
去Node.js 下載頁面獲取你須要的版本。能夠得到Windows和Mac環境的安裝包和預編譯的Linux二進制文件以及源代碼。對於Linux環境,你還能夠經過包管理器來安裝Node,如這裏所述。git
本教程咱們將使用v6.10.3穩定版本。在編寫本文時,這是Node的當前長期支持(LTS)版本。github
提示: 你也能夠考慮使用版本管理器來安裝Node。這將消除下面提出的權限問題。web
咱們來看一下Node的安裝位置以及版本。express
$ which node /usr/bin/node $ node --version v6.10.3
使用Node的REPL(交互式解釋器)檢查安裝是否成功。npm
$ node > console.log('Node is running'); Node is running > .help .break Sometimes you get stuck, this gets you out .clear Alias for .break .exit Exit the repl .help Show repl options .load Load JS from a file into the REPL session .save Save all evaluated commands in this REPL session to a file > .exit
Node.js已經安裝成功,如今咱們能夠把注意力集中在npm上,npm已經集成在上述安裝的Node.js中。json
$ which npm /usr/bin/npm $ npm --version 3.10.10
npm能夠以本地或全局模式安裝包。在本地模式下,將包安裝在父工做目錄中的node_modules
文件夾中。該位置由當前用戶所擁有。安裝在{prefix}/lib/node_modules/
中的全局包由user根目錄所擁有({prefix}
一般是/usr/
或 /usr/local
)。這意味着你將不得不使用sudo全局安裝包,這可能會在解決第三方依賴時致使權限錯誤,也可能致使安全問題。下面讓咱們更改一下:
讓咱們看看運行npm config list
輸出了什麼:
$ npm config list ; cli configs user-agent = "npm/3.10.10 node/v6.10.3 linux x64" ; userconfig /home/sitepoint/.npmrc prefix = "/home/sitepoint/.node_modules_global" ; node bin location = /usr/bin/nodejs ; cwd = /home/sitepoint ; HOME = /home/sitepoint ; "npm config ls -l" to show all defaults.
輸出給了咱們有關npm的安裝信息。如今,重要的是獲取當前的全局位置。
$ npm config get prefix /usr
爲了在主目錄中安裝全局包,咱們須要更改這個前綴。爲此,你能夠在主文件夾中建立一個新目錄。
$ cd ~ && mkdir .node_modules_global $ npm config set prefix=$HOME/.node_modules_global
經過這個簡單的配置更改,咱們將這個新目錄位置設置爲全局Node包安裝的位置。這個更改同時會在咱們的主目錄中建立了一個.npmrc文件。
$ npm config get prefix /home/sitepoint/.node_modules_global $ cat .npmrc prefix=/home/sitepoint/.node_modules_global
咱們仍然將npm安裝在由user根目錄全部的位置。可是要注意咱們已經在配置中改變了全局包安裝的位置。咱們須要再次安裝npm,可是這一次是安裝在新用戶所在的位置。固然,安裝的將是npm的最新版本。
$ npm install npm --global └─┬ npm@5.0.2 ├── abbrev@1.1.0 ├── ansi-regex@2.1.1 .... ├── wrappy@1.0.2 └── write-file-atomic@2.1.0
最後,咱們須要添加.node_modules_global/bin
到$PATH環境變量中,以即可以從命令行運行全局包。爲了作到這一點,你能夠把下面這一行添加到.profile
,.bash_profile
或者.bashrc
文件中並從新啓動終端。
export PATH="$HOME/.node_modules_global/bin:$PATH"
如今咱們能夠找到npm的所在目錄.node_modules_global/bin
而且使用合適的npm版本。
$ which npm /home/sitepoint/.node_modules_global/bin/npm $ npm --version 5.0.2
目前咱們只有一個安裝在全局的包-那就是npm包自己。下面咱們來安裝UglifyJS包(一個JavaScript的壓縮工具)。咱們使用--global標記,也能夠縮寫爲-g。
$ npm install uglify-js --global /home/sitepoint/.node_modules_global/bin/uglifyjs -> /home/sitepoint/.node_modules_global/lib/node_modules/uglify-js/bin/uglifyjs + uglify-js@3.0.15 added 4 packages in 5.836s
從輸出能夠看出,還安裝了其餘包, 這些包都是UglifyJS包的依賴項。
咱們可使用npm list
命令列出全局包。
$ npm list --global home/sitepoint/.node_modules_global/lib ├─┬ npm@5.0.2 │ ├── abbrev@1.1.0 │ ├── ansi-regex@2.1.1 │ ├── ansicolors@0.3.2 │ ├── ansistyles@0.1.3 .................... └─┬ uglify-js@3.0.15 ├─┬ commander@2.9.0 │ └── graceful-readlink@1.0.1 └── source-map@0.5.6
然而,輸出十分冗長。咱們可使用--depth=0
選項進行優化。
$ npm list -g --depth=0 /home/sitepoint/.node_modules_global/lib ├── npm@5.0.2 └── uglify-js@3.0.15
咱們發現這要更友好 -- 只顯示咱們安裝的包及其版本號。
咱們能夠在命令行中使用任何全局安裝包。例如:下面的命令展示瞭如何使用Uglify 包將example.js
壓縮到example.min.js
:
$ uglifyjs example.js -o example.min.js
當你在本地安裝包時,一般會使用package.json文件進行安裝。下面讓咱們建立這樣的一個文件。
$ npm init package name: (project) version: (1.0.0) description: Demo of package.json entry point: (index.js) test command: git repository: keywords: author: license: (ISC)
按Enter
接受默認值,而後鍵入yes
確認。這樣將會在項目的根目錄下建立一個package.json
文件。內容以下:
{ "name": "project", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
提示:你可使用
npm init --y
命令以更快的方式生成package.json文件
除了main
和scripts
外,其餘字段應該是一目瞭然的。main
字段是你程序的主入口,scripts
字段容許你指定在包的生命週期中的不一樣時間運行的腳本命令。咱們暫時不討論這些東西,可是若是你想了解更多相關信息,請參閱《npm中的package.json文檔》和《使用npm做爲構建工具》。
如今讓咱們來安裝underscore包。
$ npm install underscore npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN project@1.0.0 No description npm WARN project@1.0.0 No repository field. + underscore@1.8.3 added 1 package in 0.344s
注意這裏建立了一個文件,咱們稍後會講到它。
打開package.json文件咱們會看到dependencies
字段已經添加到了文件中:
{ ... "dependencies": { "underscore": "^1.8.3" } }
如你所見,underscore v1.8.3安裝到了咱們的項目中。版本號前面的(^)符號表示安裝時,npm將安裝最高版本的包,npm還能夠找到主版本能夠匹配的惟一位置(除非存在package-lock.json
文件)。在咱們的例子中,這是V2.0.0版本如下的全部版本。版本控制依賴(major.minor.patch)的這種方法被稱爲語義化版本控制。你能夠在《語義化版本控制:爲何你應該使用它?》文章中瞭解更多相關知識。
還要注意,underscore被保存爲dependencies字段的屬性。這是最新版本npm的默認設置,用於運行應用程序所需的包(如underscore)。也能夠經過指定--save-dev
標誌將包保存爲devDependency。devDependencies是用於開發目的的包,例如運行測試或解析代碼。
你也能夠給package.json文件添加private: true
以防止意外發布私有倉庫而且阻止全部運行npm install
時生成的警告。
其實使用package.json
指定項目依賴的最大好處是可移植性。例如,當你克隆別人的代碼時,你只須要在根目錄運行npm i
便可,而後npm將解析並獲取全部運行該應用程序必需的包。稍後咱們再來看這個。
在結束此部份內容以前,咱們快速檢查一下underscore是否正在工做。在項目根目錄下建立名爲test.js的文件並寫入下列內容:
const _ = require('underscore'); console.log(_.range(5));
使用node test.js
運行文件,你應該看到[0, 1, 2, 3, 4]輸出到了屏幕。
npm是一個包管理器,因此它確定能夠卸載一個包。咱們假設當前的underscore包致使了兼容性問題。咱們能夠卸載這個包並安裝舊版本,以下所示:
$ npm uninstall underscore removed 2 packages in 0.107s $ npm list project@1.0.0 /home/sitepoint/project └── (empty)
咱們經過使用@符號加一個版本號來安裝特定版本的underscore包。
$ npm install underscore@1.8.2 + underscore@1.8.2 added 1 package in 1.574s $ npm list project@1.0.0 /home/sitepoint/project └── underscore@1.8.2
讓咱們檢查一下underscore包是否存在新版本:
$ npm outdated Package Current Wanted Latest Location underscore 1.8.2 1.8.3 1.8.3 project
Current
列告訴咱們當前安裝的版本。Latest
列告訴咱們包的最新版本。 Wanted
列告訴咱們在不破壞現有的代碼的前提下能夠升級到的最新版本的包。
還記得以前的package-lock.json
文件嗎?它是在npm v5中引入的,目的是確保安裝在計算機上的全部項目的依賴保持不變。當npm修改node_modules文件夾或package.json文件時它會自動生成。
若是你喜歡,你能夠繼續嘗試。刪除node_modules
文件夾,而後從新運行npm i
。最新版本的npm將安裝underscore v1.8.2(由於這是package-lock.json文件中指定的)。根據語義化版本控制的規範,v1 .8.3將向下兼容早期版本。在過去,不一致的包版本對開發人員來講很頭痛的事情。這個問題一般經過使用必須手動建立的npm-shrinkwrap.json
文件來解決。
如今,咱們假設最新版本的underscore修復了咱們以前提到的兼容性錯誤,咱們但願將包更新爲該版本。
$ npm update underscore + underscore@1.8.3 updated 1 package in 0.236s $ npm list project@1.0.0 /home/sitepoint/project └── underscore@1.8.3
提示:爲了使上述命令工做正常,underscore必須被列爲package.json的依賴項。若是咱們有更多的過期模塊,咱們也能夠執行
npm update
。
在本教程中咱們已經屢次使用了mkdir
命令。是否存在一個包作相同的事情呢?讓咱們使用npm search
命令看一下。
$ npm search mkdir NAME | DESCRIPTION | AUTHOR | DATE | VERSION mkdir | Directory crea… | =joehewitt | 2012-04-17 | 0.0.2 fs-extra | fs-extra conta… | =jprichardson… | 2017-05-04 | 3.0.1 mkdirp | Recursively mkdir,… | =substack | 2015-05-14 | 0.5.1 ...
這裏有一個mkdirp
包,咱們來安裝它。
$ npm install mkdirp + mkdirp@0.5.1 added 2 packages in 3.357s
建立mkdir.js
文件並複製粘貼此代碼:
const mkdirp = require('mkdirp'); mkdirp('foo', function (err) { if (err) console.error(err) else console.log('Directory created!') });
從終端運行這個文件:
$ node mkdir.js Directory created!
咱們先安裝一個包:
$ npm install request + request@2.81.0 added 54 packages in 15.92s
檢查package.json
文件。
"dependencies": { "mkdirp": "^0.5.1", "request": "^2.81.0", "underscore": "^1.8.2" },
注意依賴項列表會自動更新。在之前的npm版本中,你將不得不執行npm install request --save
以保存package.json
中的依賴關係。若是你想安裝一個包而不在package.json中保存它,只需使用--no-save
參數。
假設你將項目源代碼克隆到了另外一臺計算機,如今須要安裝依賴項。咱們先刪除node_modules
文件夾而後執行npm install
。
$ rm -R node-modules $ npm list project@1.0.0 /home/sitepoint/project ├── UNMET DEPENDENCY mkdirp@^0.5.1 ├── UNMET DEPENDENCY request@^2.81.0 └── UNMET DEPENDENCY underscore@^1.8.2 npm ERR! missing: mkdirp@^0.5.1, required by project@1.0.0 npm ERR! missing: request@^2.81.0, required by project@1.0.0 npm ERR! missing: underscore@^1.8.2, required by project@1.0.0 $ npm install added 57 packages in 1.595s
注意觀察node_modules
文件夾,你會發現它已經被從新建立。像這樣,你就能夠輕鬆地與他人共享你的代碼,而不會致使你的項目和源依賴倉庫膨脹。
當npm安裝一個包時,其實它保存了一個副本。因此下次你安裝這個包的時候就不須要再鏈接網絡。這些副本緩存在你的主路徑下的.npm
目錄中。
$ ls ~/.npm anonymous-cli-metrics.json _cacache _locks npm registry.npmjs.org
這個目錄會隨着時間的推移而變得亂七八糟,因此有時候要清理它。
$ npm cache clean
若是你要清理系統上的多個Node項目,還能夠從工做區清除全部node_module
文件夾。
find . -name "node_modules" -type d -exec rm -rf '{}' +
可能你已經注意到,運行npm命令有多種方式。如下是一些經常使用的npm別名的簡要列表:
npm i <package>
- 安裝本地包
npm i -g <package>
- 安裝全局包
npm un <package>
- 卸載本地包
npm up
- npm更新包
npm t
- 運行測試
npm ls
- 列出已安裝的模塊
npm ll
或npm la
- 在列出模塊時打印附加包信息
你也能夠一次安裝多個軟件包:
$ npm i express momemt lodash mongoose body-parser webpack
若是想要學習全部常見的npm命令,執行npm help
獲取完整的命令列表。你也能夠在個人《10個技巧,使你成爲npm忍者》文章中學到更多相關知識。
有幾種有用的工具可讓你在同一臺機器上管理多個版本的Node.js。其中一個就是n
,另外一個是nvm
(Node 版本管理器)。若是這是你感興趣的內容,能夠看看咱們的教程:《使用nvm安裝多個版本的Node.js》。
在本教程中,我介紹了使用npm的基礎知識,演示瞭如何從下載頁面安裝Node.js,如何更改全局包的位置(因此咱們能夠避免使用sudo)以及如何在本地和全局模式下安裝包。我還介紹了刪除,更新和安裝某個版本的包,以及管理項目的依賴。若是你想了解有關最新版本中的新功能的更多信息,能夠訪問npm Github發行頁面。
隨着版本5的發行,npm正在向前端開發的世界邁進。根據其首席運營官的介紹,npm用戶基礎正在發生變化,其中大多數開發者使用它們並無使用它來編寫Node。相反,它正在成爲人們在前端開發中整合JavaScript的工具(你可使用它來安裝任何東西)而且它正在成爲編寫現代JavaScript的組成部分。你在你的項目中使用npm了嗎?若是沒有,如今是開始使用它的好時機。