文/ 風虎
Node.js讓開發者可以用JavaScript編寫服務端程序,它基於用C++編寫的JavaScript的V8引擎構建,所以它很快(你是否想說C更快?但要知道比起那些用Java編寫的中間件來說,C++已經很快了)。
起初,NodeJS主要是設計為做服務端程序開發的,但慢慢的,開發者們把它應用於構建本地自動化工具鏈。自此開放出了一片新的NodeJS生態環境(例如Grunt和Gulp),讓新一代的前端開發者們逐漸形成了工程化的思想。
為了利用好這些工具(或者包),我們需要以一種良好的方式去安裝和管理它們(就像Windows的添加刪除程序一樣)。於是npm就誕生了,npm以你希望的方式安裝這些工具,並且提供了一個易用的接口組織這些工具。在我介紹之前,首先要在你的額系統中安裝Node.js。
去官網的下載頁可以獲取你需要的版本。Windows和Mac都有現成的安裝包。
而對於Linux平臺來說也準備了預編譯好的二進位文件和原始碼。另外,你也可以用對應Linux發行版的包管理工具來安裝。
下面讓我們看看如何查看Node的安裝路徑以及版本:
$ which node/usr/local/bin/node$ node --versionv5.7.0
我們通過來嘗試Node的REPL(交互式解釋器)來驗證一下是否安裝成功。
$ 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一起裝好了,無需額外安裝。
$ which npm/usr/local/bin/npm$ npm --version3.6.0
npm可以在你的某個項目中單獨安裝模塊,也可以在你的電腦中全局安裝。在某個項目中單獨安裝的時候,npm會下載所有的文件到你項目中的一個叫做node_modules的文件夾內。
這個文件夾的所有者是當前用戶(在Linux中,對文件夾的所有者權限敏感,其他用戶如果沒有授權是無法查看另一個用戶擁有的文件的,Windows中雖然也有這個概念,但通常我們個人電腦用戶都很單一,所以並不是很重視這個概念)。全局模塊會被安裝到{prefix}/lib/node_modules/這個目錄下,目錄的擁有者是root用戶({prefix}通常是/usr/或者/usr/local/)。這意味著如果你要在某個Linux發行版下全局安裝模塊,需要用sudo命令,否則會引發權限錯誤。
首先讓我們看一下npm config這個命令會輸出什麼
$ npm config list; cli configsuser-agent = "npm/3.6.0 node/v5.7.0 linux x64"; node bin location = /usr/local/bin/node; cwd = /home/sitepoint; HOME = /home/sitepoint; 'npm config ls -l' to show all defaults.
這裡列出了npm的基本配置信息,重點是這裡
$ npm config get prefix/usr/local
列出了全局安裝模塊的路徑。我們通過下面的命令可以在我們的用戶主目錄下新建一個文件夾,然後把全局模塊安裝路徑更改到這個目錄下。
$ cd && mkdir .node_modules_global$ npm config set prefix=$HOME/.node_modules_global
這樣,我們就更改了全局模塊的安裝位置了。做了責怪操作以後,我們同時也會得到一個自動新建的.npmrc文件。
$ npm config get prefix/home/sitepoint/.node_modules_global$ cat .npmrcprefix=/home/sitepoint/.node_modules_global
但對於有強迫症的開發者來說,這樣還不夠,我們的npm還停留在root目錄下呢。不要緊,我們可以用下面的命令重新安裝npm到我們的本地目錄中。
$ npm install npm --global/home/sitepoint/.node_modules_global/bin/npm -> /home/sitepoint/.node_modules_global/lib/node_modules/npm/bin/npm-cli.js/home/sitepoint/.node_modules_global/lib└── npm@3.7.5
好了,最後一步,我們把.node_modules_global/bin添加到環境變量$PATH中,我們輸入npm命令的時候,就不會去root目錄下尋找,而是在我們自己的主目錄下尋找了。
export PATH="$HOME/.node_modules_global/bin:$PATH"
現在我們用which命令可以確認我們現在用的npm是來自哪個目錄的了。
$ which npm/home/sitepoint/.node_modules_global/bin/npm$ npm --version3.7.5
ok,這樣依賴,我們就不需要再用sudo來進行全局安裝了。
第一個例子,我們來裝一個包,叫做UglifyJS。這是一個JS壓縮工具。我們用--global這個參數來告訴npm我們要進行全局安裝,這個參數也可以簡寫為-g
$ npm list --global├─┬ npm@3.7.5│ ├── abbrev@1.0.7│ ├── ansi-regex@2.0.0│ ├── ansicolors@0.3.2│ ├── ansistyles@0.1.3└─┬ uglify-js@2.6.2 ├── async@0.2.10 ├── source-map@0.5.3 ├── uglify-to-browserify@1.0.2
大家可以看到,這個輸出相當複雜,我們在安裝其他包的時候,有可能會更慘不忍睹。我們可以用--depth=0來告訴控制臺只輸出一個層級的信息。
$ npm list -g --depth=0├── npm@3.7.5└── uglify-js@2.6.2
好了,接下來你就可以直接用uglifyjs這個命令在shell中壓縮文件了。
$ uglifyjs example.js -o example.min.js
不帶任何參數,直接用npm install命令即可在單獨的項目目錄中安裝模塊了。新的包會安裝到項目文件夾下的一個叫做node_modules的目錄中。例如,下面我們在本地安裝一個叫做underscore模塊(Underscore 是一個 JavaScript 工具庫,它提供了一整套函數式編程的實用功能):
$ mkdir ~/project && cd ~/project$ npm install underscore/home/sitepoint/project└── underscore@1.8.3$ lsnode_modules$ ls node_modulesunderscore
我們可以通過npm list來列出自己項目已經安裝過的模塊
$ npm list/home/sitepoint/project└── underscore@1.8.3
這就表示,我們可以在另一個項目目錄中,安裝另一個版本的underscore模塊。
還是以underscore為例,讓我們卸載後並檢查這個模塊是否還存在:
$ npm uninstall underscore- underscore@1.8.3 node_modules/underscore$ npm list/home/sitepoint/project└── (empty)
默認情況下,npm總會尋找最新版本的包來安裝,但我們仍然可以通過參數指定安裝特定版本的模塊:
$ npm install underscore@1.8.2/home/sitepoint/project└── underscore@1.8.2$ npm list/home/sitepoint/project└── underscore@1.8.2
如果我們以前安裝的某個包,有了新版本,例如修復bug,那我們需要一條命令能直接對這個包進行升級。
$ npm update underscoreunderscore@1.8.3 node_modules/underscore$ npm list/home/sitepoint/project└── underscore@1.8.3
註:我們需要在package.json中標記underscore為依賴才能讓上面的命令生效。(參見下面的「管理依賴」一節)
我們在Linux通常會使用mkdir這個命令,那麼npm中是否有這樣一種包能達到一樣的效果呢。在這個場景下,我們就可能會需要搜索某個具有特定功能的模塊,那麼我們可以用如下命令去搜索:
$ npm search mkdirnpm WARN Building the local index for the first time, please be patient
我們發現,還真有一個,叫做mkdirp。那我們試試直接安裝它
$ npm install mkdirp/home/sitepoint/project└─┬ mkdirp@0.5.1 └── minimist@0.0.8
然後我們試試看是否真的是我們想要的包
var mkdirp = require('mkdirp');mkdirp('foo', function (err) { if (err) console.error(err) else console.log('Directory created!')});
運行結果如下
$ node. mkdir.jsDirectory created!
ok,還真成功了~
管理緩存通常,我們在用npm安裝了一個模塊以後,npm會保留一份安裝包到本地的.npm目錄中,以加速下次安裝同樣的包的速度。例如在Linux發行版,這個目錄是~
$ ls ~/.npm_locks minimist mkdirp registry.npmjs.org underscore
但日積月累,這個目錄下一定會積攢很多文件,所以我們需要一個命令清理它。
$ npm cache clean
現在,我們已經裝過2個包了,但是這以後肯定會需要更多包,所以我們每次都手動安裝並非明智之舉,這種時候,我們經常在github項目中看到的package.json就派上用場了。我們可以通過這個文件來管理我們的包安裝。而這個文件可以用npm init命令創建。
$ npm initThis utility will walk you through creating a package.json file.Press ^C at any time to quit.name: (project) demoversion: (1.0.0)description: Demo of package.jsonentry point: (index.js)test command:git repository:keywords:author: Sitepointlicense: (ISC)
然後在項目根目錄會生成這樣一個package.json文件。我們對這個文件添加我們的依賴項,並設置一些參數:
JavaScript
{ "name": "demo", "version": "1.0.0", "description": "Demo package.json", "main": "main.js", "dependencies": { "mkdirp": "^0.5.1", "underscore": "^1.8.3" }, "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Sitepoint", "license": "ISC"}下面這個命令可以省略大段的輸入參數,直接創建一個配置文件:
$ npm init --yes
package.json中的name參數將會用你項目的文件夾名字來自動設定。
我們可以通過添加private:true這個配置項來阻止不小心發布了私有的倉庫,而且可以阻止在執行npm install的時候會產生的警告。讓我們創建一個目錄,然後試試用package.json來下載模塊。$ mkdir ~/demo && cd ~/demo$ cp ~/project/package.json ~/demo$ npm install$ npm listdemo@1.0.0 /home/sitepoint/demo├─┬ mkdirp@0.5.1│ └── minimist@0.0.8└── underscore@1.8.3
又有新問題了,如果我們要手動安裝新包的時候(不試用package.json,直接在shell用npm install命令),如何保持這個文件也能同步修改呢?我們可以用--save參數。例如下面,我們用--save參數安裝一個叫做request的新包
$ npm install request --save$ npm list --depth=0demo@1.0.0 /home/sitepoint/demo├── mkdirp@0.5.1├── request@2.53.0└── underscore@1.8.3
然後,我們的package.json文件就會被自動更新為
JavaScript
"dependencies": { "mkdirp": "^0.5.1", "request": "^2.53.0", "underscore": "^1.8.3"}可以看到對應的包已經被加入了package.json中了,這全部過程不需要我們修改文件。
##版本管理器##
有幾個工具可以讓我們在同一臺機器上使用不同版本的Node.js。其中一個叫做n。另一個叫做nvm(Node Version Manager)。尚學堂:每天推送IT新技術文章,跟著我們擴展技術視野吧。
點個讚再走唄!即刻起關注尚學堂,發送「要課程」,
IT課程免費送!