Node.js的3m安装法
原文地址:https://cnodejs.org/topic/57f628098489e7ca69f4e839
安裝Node.js
Node.js是支持多個(gè)平臺(tái),Mac、Linux以及Windows,但在Windows平臺(tái)下面問(wèn)題較多,很多莫名其妙的問(wèn)題,一般開(kāi)發(fā)環(huán)境推薦用Mac或Linux(Ubuntu桌面版)。在生產(chǎn)環(huán)境,推薦使用CentOS或Ubuntu,選用對(duì)應(yīng)的64位的LTS長(zhǎng)期支持版本即可。
所以,這里推薦Linux安裝作為標(biāo)準(zhǔn)配置,先講一下3m安裝法,之后講一下如何從源碼去編譯,便于大家深入理解。
<!-- toc -->
3m安裝法
在各個(gè)平臺(tái)都有相關(guān)的包管理工具,比如ubuntu下面有apt-get,centos下面有yum,mac下面有brew等,它們都是安裝軟件的非常方便的利器。但對(duì)于Node.js這個(gè)版本帝而言,它們是不合適的,首先Node.js的版本更新非常快,開(kāi)發(fā)機(jī)器上可能要同時(shí)存在幾個(gè)Node.js的大版本,而npm又有2.x和3.x版本的差異,國(guó)內(nèi)網(wǎng)訪問(wèn)npmjs.org的鏡像非常慢,綜上種種問(wèn)題,這里給出我總結(jié)的比較好的實(shí)踐,具體如下
- nvm(Node.js Version Manager):解決多版本共存、切換問(wèn)題
- npm(Node.js Package Manager):解決Node.js模塊安裝問(wèn)題,其本身也是一個(gè)Node.js 模塊
- nrm(Node.js Registry Manager):解決npm鏡像訪問(wèn)慢的問(wèn)題,提供測(cè)速,切換registry功能
nvm
nvm是一個(gè)開(kāi)源的Node版本管理器,通過(guò)簡(jiǎn)單的bash腳本來(lái)管理、切換多個(gè)Node.js版本。和nvm提供類似功能的還有tj寫的n,它們的功能大同小異,整體來(lái)說(shuō)nvm要稍強(qiáng)大一下。值得注意的是nvm和n目前都不支持windows版本。
官方介紹
Node Version Manager - Simple bash script to manage multiple active node.js versions
安裝nvm
在安裝Node.js之前,需要先安裝nvm,然后通過(guò)nvm去安裝多個(gè)版本的Node.js。
首先,在終端里執(zhí)行如下命令
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash顯示結(jié)果
% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed 100 7731 100 7731 0 0 37998 0 --:--:-- --:--:-- --:--:-- 38083 => Downloading nvm from git to '/home/ubuntu/.nvm' => Cloning into '/home/ubuntu/.nvm'... remote: Counting objects: 4715, done. remote: Compressing objects: 100% (3/3), done. remote: Total 4715 (delta 0), reused 0 (delta 0), pack-reused 4712 Receiving objects: 100% (4715/4715), 1.24 MiB | 265.00 KiB/s, done. Resolving deltas: 100% (2801/2801), done. Checking connectivity... done. * (HEAD detached at v0.29.0)master=> Appending source string to /home/ubuntu/.bashrc => Close and reopen your terminal to start using nvm它的意思是通過(guò)curl下載install.sh腳本,并執(zhí)行它。待執(zhí)行完成后,它會(huì)把nvm命令的執(zhí)行路徑放到~/.bashrc文件里
我們可以用cat命令查看一下
$ cat ~/.bashrc|grep nvm export NVM_DIR="/home/ubuntu/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm確認(rèn)存在以上配置后,通過(guò)執(zhí)行source命令,使環(huán)境變量生效
$ source ~/.bashrc至此,我們就把nvm安裝完成了。然后通過(guò)在終端里執(zhí)行nvm --version查看nvm的版本號(hào):
$ nvm --version 0.25.1如果能夠打印出版本號(hào)就證明nvm已經(jīng)安裝成功了。
如果系統(tǒng)使用的是zsh,可以把環(huán)境變量放到~/.zshrc里
$ vi ~/.zshrc追加一下內(nèi)容到~/.zshrc里
export NVM_DIR="/home/ubuntu/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm然后,通過(guò)執(zhí)行source命令,使環(huán)境變量生效,其他和bash里操作相同
$ source ~/.zshrc查看可安裝版本
在安裝之前,我們需要了解nvm可以安裝哪些版本的Node.js
$ nvm ls-remotev0.1.14...v0.1.104v0.2.0...v0.2.6v0.3.0...v0.3.8v0.4.0...v0.4.12v0.5.0...v0.5.10v0.6.0...v0.6.21v0.7.0...v0.7.12v0.8.0...v0.8.28v0.9.0...v0.10.0... v0.10.45v0.11.0...v0.11.16v0.12.0...v0.12.14iojs-v1.0.0...iojs-v3.3.1v4.0.0...v4.4.5v5.0.0...v5.11.1v6.0.0v6.1.0v6.2.0v6.2.1這么多版本,讀者不需要一一了解,只需要了解LTS和Current這2個(gè)最新版本就好
說(shuō)明
- LTS版本指的是長(zhǎng)期支持版本(Long-term Support),有官方支持,推薦給絕大多數(shù)用戶使用,一般在生成環(huán)境上
- Current版本指的是當(dāng)前正在開(kāi)發(fā)的版本,它通常較新,功能點(diǎn)有變動(dòng),但沒(méi)有完全穩(wěn)定,在經(jīng)過(guò)一段時(shí)間之后,當(dāng)前版本可能會(huì)變?yōu)長(zhǎng)TS版本,一般用于學(xué)習(xí)
以下圖,Node.js官方網(wǎng)站為例,當(dāng)前的LTS版本是4.4.5,而Current版本6.2.1
八卦一下
Node.js的版本是非常多的,比如5.x作為一個(gè)過(guò)渡版本,硬生生的給拋棄了…
安裝Node.js
目前4.4.5是LTS長(zhǎng)期支持版本,無(wú)論是開(kāi)發(fā)還是產(chǎn)品模式都推薦使用4.4.5版本。
$ nvm install 4.4.5 Downloading https://nodejs.org/dist/v4.4.5/node-v4.4.5-linux-x64.tar.xz... ######################################################################## 100.0% Now using node v4.4.5 (npm v2.15.5) Creating default alias: default -> 4.4.5 (-> v4.4.5)如果想默認(rèn)使用4.4.5版本進(jìn)行編譯,需要指定一個(gè)default別名,具體操作如下:
$ nvm alias default 4.4.5 default -> 4.4.5 (-> v4.4.5)此時(shí),你輸入node -v
$ node -v v4.4.5這樣需要說(shuō)明一下,當(dāng)安裝完Node.js之后,會(huì)把node命令在環(huán)境變量里,你可以在終端里任何位置使用它。node命令是用于執(zhí)行Node.js代碼的,因?yàn)镴avaScript是腳本語(yǔ)言,所以node命令實(shí)際上是Node.js代碼的的解釋器。
前面講了,4.4.5版本是LTS長(zhǎng)期支持版本,那么如果我想玩玩更多es6的東西呢?
目前現(xiàn)狀是4.4.5支持58%的es6特性,而6.2.1支持96%的es6特性,比如let等在4.x下的非嚴(yán)格模式是不支持 ,這時(shí)候我就需要使用6.x版本了。
安裝最新的6.x版本
$ nvm install 6 Downloading https://nodejs.org/dist/v6.2.1/node-v6.2.1-linux-x64.tar.xz... ######################################################################## 100.0% Now using node v6.2.1 (npm v3.9.3)切換到6.x版本下面
$ nvm use 6 Now using node v6.2.1 (npm v3.9.3) $ node -v v6.2.1此時(shí),你的Node.js代碼就在6.x版本下執(zhí)行了,可以使用任何6.x支持的特性。
那么,如何知道我本機(jī)安裝過(guò)哪些Node.js版本呢?
$ nvm lsv4.4.5 -> v6.2.1system default -> 4.4.5 (-> v4.4.5) node -> stable (-> v6.2.1) (default) stable -> 6.2 (-> v6.2.1) (default) iojs -> iojs- (-> system) (default)說(shuō)明
- 一共有3個(gè)版本,一個(gè)是system系統(tǒng)默認(rèn),另外2個(gè)是通過(guò)nvm安裝的
- -> v6.2.1 代表當(dāng)前是6.x版本
- default -> 4.4.5 (-> v4.4.5)
- iojs -> iojs- (-> system) (default) 此處不同機(jī)器可能不一樣,如果之前通過(guò)apit-get或brew安裝node,此處會(huì)有顯示
總結(jié)一下,這節(jié)一共講了nvm的5個(gè)常用命令
- 安裝:nvm install 4.4.5
- 設(shè)置默認(rèn): nvm alias default 4.4.5
- 切換版本:nvm use 6
- 列出當(dāng)前本地版本:nvm ls
- 列出遠(yuǎn)端可安裝版本:nvm ls-remote
可以說(shuō)這5個(gè)命令在開(kāi)發(fā)過(guò)程中足夠用,其實(shí)nvm還有很多高級(jí)特性,比如在項(xiàng)目根目錄創(chuàng)建.npmrc指定特定的Node.js版本,它就切換到對(duì)應(yīng)版本,類似的很多,就不一一列舉了,讀者自行體會(huì)吧。
Hello Node.js
通過(guò)nvm已經(jīng)安裝完成Node.js,是時(shí)候來(lái)個(gè) hello world 代碼了。一般我們用Node.js做的最多是web server開(kāi)發(fā),就來(lái)個(gè)最簡(jiǎn)單的http server吧。
創(chuàng)建hello_node.js文件,寫下下面的代碼
var http = require('http');http.createServer(function (req, res) {res.writeHead(200, {'Content-Type': 'text/plain'});res.end('Hello Node.js\n'); }).listen(3000, "127.0.0.1");console.log('Server running at http://127.0.0.1:3000/');說(shuō)明
- 1)引用了Node.js內(nèi)置的http模塊
- 2)通過(guò)http.createServer創(chuàng)建了一個(gè)http服務(wù)
- 3)通過(guò)listen方法,指定端口和ip,啟動(dòng)該服務(wù)
- 4)res是http協(xié)議里的response(響應(yīng))的別名,通過(guò)res控制對(duì)瀏覽器的操作,設(shè)置返回狀態(tài)碼是200,設(shè)置header里的’Content-Type’是’text/plain’類型,最后返回’Hello Node.js\n’文本。
通過(guò)短短幾行代碼就可以創(chuàng)建一個(gè)http服務(wù),是不是非常簡(jiǎn)單啊?
執(zhí)行如下
> node hello_node.js Server running at http://127.0.0.1:3000/通過(guò)node解釋器,執(zhí)行hello_node.js文件里的Node.js代碼,這是典型的Node.js執(zhí)行過(guò)程,腳本不需要編譯,整體來(lái)說(shuō)還是比較簡(jiǎn)單的。
訪問(wèn)瀏覽器,結(jié)果如圖
我們把代碼稍稍改一下,創(chuàng)建hello_node_es6.js文件,寫下下面的代碼
// "use strict"; const http = require('http');http.createServer((req, res) => {let status = 200;res.writeHead(status, {'Content-Type': 'text/plain'});res.end('Hello Node.js\n'); }).listen(3000, "127.0.0.1");console.log('Server running at http://127.0.0.1:3000/');說(shuō)明
- var變成了const
- http.createServer里的匿名函數(shù)變成 es6 里的箭頭函數(shù)
- 為了演示方便,用let聲明了status變量
實(shí)現(xiàn)的效果和原理都是一模一樣的,只是語(yǔ)法上有些許不同而已。
首先,我們?cè)?.x下執(zhí)行看看
$ nvm use 4 Now using node v4.4.5 (npm v2.15.5) $ node hello_node_es6.js /Users/sang/workspace/17koa/book-source/nodejs/hello_node_es6.js:4let status = 200;^^^SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict modeat exports.runInThisContext (vm.js:53:16)at Module._compile (module.js:413:25)at Object.Module._extensions..js (module.js:452:10)at Module.load (module.js:355:32)at Function.Module._load (module.js:310:12)at Function.Module.runMain (module.js:475:10)at startup (node.js:117:18)at node.js:951:3這里報(bào)的是語(yǔ)法錯(cuò)誤,塊作用域聲明(let, const, function, class) 在嚴(yán)格模式外是不支持的。也就是說(shuō)在Node.js 4.x版本里,如果你不是用嚴(yán)格模式,你是無(wú)法是let、const、 function、class這些關(guān)鍵字的。不是Node.js的4.x版本不支持它們,而是嚴(yán)格模式外是不支持。
如果是在文件第一行增加如下代碼
"use strict";它就是可以正常執(zhí)行的,上面的代碼是把這行注釋掉的,目的就是為了演示在6.x下,即使非嚴(yán)格模式,這些語(yǔ)法也是可以正常識(shí)別的,下面我們切換到6.x下面
$ nvm use 6 Now using node v6.2.1 (npm v3.9.3) $ node hello_node_es6.js Server running at http://127.0.0.1:3000/至此,我們分別演示了使用nvm在Node.js 的 4.x和6.x版本下的版本切換,希望大家可以理解nvm的作用,以及對(duì)Node.js和es6有一個(gè)簡(jiǎn)單的認(rèn)識(shí),后面章節(jié)會(huì)詳細(xì)講解。
npm
NPM(node package manager),通常稱為node包管理器。顧名思義,它的主要功能就是管理node包,包括:安裝、卸載、更新、查看、搜索、發(fā)布等。它最開(kāi)始的初衷是只是Node.js包管理器,隨著前端技術(shù)react、webpack、browserify等發(fā)展,目前npm的定位是廣義的包管理器,包括js、react、mobile、angularjs、browsers、jquery、cordova、bower、gulp、grunt、browserify、docpad、nodebots、tessel等,是開(kāi)源世界里最大、生態(tài)最健全的包管理器,包的總數(shù)已經(jīng)超過(guò)29.4萬(wàn)個(gè),日下載量超過(guò)1.7億。
NPM是隨同Node.js一起安裝的包管理工具,能解決Node.js代碼部署上的很多問(wèn)題,常見(jiàn)的使用場(chǎng)景有以下幾種:
- 允許用戶從NPM服務(wù)器下載別人編寫的第三方包到本地使用。
- 允許用戶從NPM服務(wù)器下載并安裝別人編寫的命令行程序到本地使用。
- 允許用戶將自己編寫的包或命令行程序上傳到NPM服務(wù)器供別人使用。
由于新版的Node.js已經(jīng)集成了npm,所以之前安裝Node.js時(shí)npm也一并安裝好了。同樣可以通過(guò)輸入 “npm -v” 來(lái)測(cè)試是否成功安裝。命令如下,出現(xiàn)版本提示表示安裝成功:
$ npm -v 2.3.0安裝npm
如果你安裝的是舊版本的 npm,可以很容易得通過(guò) npm 命令來(lái)升級(jí),命令如下:
$ [sudo] npm install npm -g /home/ubuntu/.nvm/versions/node/v4.4.5/bin/npm -> /home/ubuntu/.nvm/versions/node/v4.4.5/lib/node_modules/npm/bin/npm-cli.js npm@3.9.5 /home/ubuntu/.nvm/versions/node/v4.4.5/lib/node_modules/npm如果Node.js是通過(guò)nvm安裝的,可以不使用sudo臨時(shí)授權(quán)的。當(dāng)然,也可以安裝指定的某個(gè)版本,比如npm 2.9之后支持了私有模塊
$ node -v v4.0.0 $ npm -v 2.14.2 $ [sudo]npm install -g npm@2.9使用 npm 安裝模塊
npm 的包安裝分為本地安裝(local)、全局安裝(global)兩種,從敲的命令行來(lái)看,差別只是有沒(méi)有 -g 而已,
語(yǔ)法格式如下:
$ npm install [-g] <Module Name>本地安裝
以下實(shí)例,我們使用 npm 命令安裝常用的 Node.js 調(diào)試模塊 debug:
$ npm install debug安裝好之后,debug 包就放在了工程目錄下的 node_modules 目錄中,因此在代碼中只需要通過(guò) require('debug') 的方式就好,無(wú)需指定第三方包路徑。
var debug = require('debug')('xxx');全局安裝
采用nvm安裝Node.js之后,基本不會(huì)遇到全局安裝時(shí)權(quán)限問(wèn)題。安裝包放的是用戶目錄的nvm版本對(duì)應(yīng)的bin目錄里,當(dāng)然不用加sudo了,尤其對(duì)于初學(xué)者,經(jīng)常被Linux的權(quán)限坑死。
區(qū)分npm版本
npm 2.x和3.x是不一樣的,需要區(qū)分,避免很多問(wèn)題,比如有的模塊在2.x是正常的,而在3.x下就莫名其妙的不好用,所以值得大家花點(diǎn)時(shí)間理解一下這個(gè)問(wèn)題
首先,看一下2.x的npm結(jié)構(gòu),為了演示方便,我們統(tǒng)一在2.x和3.x里都安裝一個(gè)名為debug的用于根據(jù)環(huán)境變量來(lái)決定是否打印調(diào)試日志的Node.js模塊
$ cd book-source/nodejs/npm/2.x // 初始化package.json,一路回車即可 $ npm init $ nvm use 4 Now using node v4.4.5 (npm v2.15.5) $ npm -v 2.15.5 $ npm i -S debug npm WARN package.json 2.x@1.0.0 No description npm WARN package.json 2.x@1.0.0 No repository field. npm WARN package.json 2.x@1.0.0 No README data debug@2.2.0 node_modules/debug └── ms@0.7.1 $ tree . . ├── node_modules │?? └── debug │?? ├── History.md │?? ├── Makefile │?? ├── Readme.md │?? ├── bower.json │?? ├── browser.js │?? ├── component.json │?? ├── debug.js │?? ├── node.js │?? ├── node_modules │?? │?? └── ms │?? │?? ├── History.md │?? │?? ├── LICENSE │?? │?? ├── README.md │?? │?? ├── index.js │?? │?? └── package.json │?? └── package.json └── package.json這里使用的NPM@2.x版本,它的依賴是嵌套依賴的,比如當(dāng)模塊依賴debug模塊,而debug模塊又依賴ms模塊,這樣就導(dǎo)致里如下結(jié)構(gòu)
下面篩選一下,tree命令的-d選項(xiàng)是只顯示目錄的意思
tree . -d . └── node_modules└── debug└── node_modules└── ms4 directories很明顯,它們的依賴關(guān)系很清晰,但如果不同模塊里依賴了相同模塊呢?彼此互相依賴、各種版本的依賴交織在一起就非常痛苦,所以npm被詬病比較慢,才出現(xiàn)了ied這樣的npm替代方案
實(shí)際上,npm也是做了改進(jìn)的,npm@3.x里有改善的
$ cd book-source/nodejs/npm/3.x // 初始化package.json,一路回車即可 $ npm init $ nvm use 6 Now using node v6.0.0 (npm v3.8.6) $ npm i -S debug 2.x@1.0.0 /Users/sang/workspace/17koa/book-source/nodejs/npm/2.x └─┬ debug@2.2.0 └── ms@0.7.1 $ tree . . ├── node_modules │?? ├── debug │?? │?? ├── History.md │?? │?? ├── Makefile │?? │?? ├── Readme.md │?? │?? ├── bower.json │?? │?? ├── browser.js │?? │?? ├── component.json │?? │?? ├── debug.js │?? │?? ├── node.js │?? │?? └── package.json │?? └── ms │?? ├── History.md │?? ├── LICENSE │?? ├── README.md │?? ├── index.js │?? └── package.json └── package.json3 directories, 15 files這里同樣是debug模塊,不過(guò)在3.x下面,debug和ms是同級(jí)的
$ tree . -d . └── node_modules├── debug└── ms3 directoriesnpm3現(xiàn)在的模塊目錄結(jié)構(gòu)扁平了,但又保持了樹(shù)和依賴版本共存的可能性,node 5.0之后已經(jīng)升級(jí)到了npm3,也就是npm3已經(jīng)普遍可用了。更多npm3變更見(jiàn)官方文檔
最簡(jiǎn)單的理解如下圖
- npm 2.x依賴都在當(dāng)前模塊下面,所以路徑會(huì)比較深
- npm 3.x是扁平式結(jié)構(gòu),當(dāng)依賴多個(gè)版本的時(shí)候,才會(huì)像npm 2.x的方式
使用 cnpm 加速 npm
同理 nvm , npm 默認(rèn)是從國(guó)外的源獲取和下載包信息, 不慢才奇怪. 可以通過(guò)簡(jiǎn)單的 ---registry 參數(shù), 使用國(guó)內(nèi)的鏡像?https://registry.npm.taobao.org?:
$ npm --registry=https://registry.npm.taobao.org install koa于是屏幕又嘩啦嘩啦地一大片輸出:
$ npm --registry=https://registry.npm.taobao.org install koa npm http GET https://registry.npm.taobao.org/koa npm http 200 https://registry.npm.taobao.org/koa ... npm http 200 https://registry.npm.taobao.org/negotiator npm http 200 https://registry.npm.taobao.org/keygrip koa[@0](/user/0).5.2 node_modules/koa ├── koa-compose[@2](/user/2).2.0 ├── statuses[@1](/user/1).0.2 ├── finished[@1](/user/1).1.1 ├── escape-html[@1](/user/1).0.1 ├── only[@0](/user/0).0.2 ├── debug[@0](/user/0).8.0 ├── fresh[@0](/user/0).2.2 ├── type-is[@1](/user/1).0.1 ├── delegates[@0](/user/0).0.3 ├── mime[@1](/user/1).2.11 ├── co[@3](/user/3).0.5 ├── accepts[@1](/user/1).0.1 (negotiator[@0](/user/0).4.2) └── cookies[@0](/user/0).4.0 (keygrip[@1](/user/1).0.0)但是畢竟鏡像跟官方的 npm 源還是會(huì)有一個(gè)同步時(shí)間差異, 目前 cnpm 的默認(rèn)同步時(shí)間間隔是 15 分鐘. 如果你是模塊發(fā)布者, 或者你想馬上同步一個(gè)模塊, 那么推薦你安裝 cnpm cli:
$ npm --registry=https://registry.npm.taobao.org install cnpm -g通過(guò) cnpm 命令行, 你可以快速同步任意模塊:
$ cnpm sync koa connect mocha呃, 我就是不想安裝 cnpm cli 怎么辦? 哈哈, 早就想到你會(huì)這么懶了, 于是我們還有一個(gè) web 頁(yè)面:
例如我想馬上同步 koa, 直接打開(kāi)瀏覽器:?https://npm.taobao.org/sync/koa
或者你是命令行控, 通過(guò) open 命令打開(kāi):
$ open https://npm.taobao.org/sync/koa如果你安裝的模塊依賴了 C++ 模塊, 需要編譯, 肯定會(huì)通過(guò) node-gyp 來(lái)編譯, node-gyp 在第一次編譯的時(shí)候, 需要依賴 node 源代碼, 于是又會(huì)去 node dist 下載, 于是大家又會(huì)吐槽, 怎么 npm 安裝這么慢…
好吧, 于是又要提到 --disturl 參數(shù), 通過(guò)七牛的鏡像來(lái)下載:
$ npm --registry=https://registry.npm.taobao.org --disturl=https://npm.taobao.org/mirrors/node install microtime再次要提到 cnpm cli, 它已經(jīng)默認(rèn)將 --registry 和 --disturl 都配置好了, 誰(shuí)用誰(shuí)知道 如果不想使用cnpm cli,可以
npm config set registry https://registry.npm.taobao.org --global npm config set disturl https://npm.taobao.org/dist --globalnrm
Node.js和其他語(yǔ)言一樣,默認(rèn)將模塊托管在npmjs.org,這是官方的registry(源),registry是指從哪個(gè)源下載Node.js模塊,當(dāng)然其他組織或個(gè)人也是可以自建npm registry(源)的,這些非官方的鏡像會(huì)定期的和npm官方registry(源)進(jìn)行同步,一般在10分鐘左右一次。
npm官方registry(源)在國(guó)外托管,所以對(duì)于國(guó)內(nèi)來(lái)說(shuō),速度上有慢一些,而且Node.js本身又是小而美哲學(xué)導(dǎo)致的多模塊依賴,有時(shí)慢的讓人抓狂,所以就近選擇一些速度更快的源是剛需。
其實(shí)npm是提供了這種配置的
$ npm config set registry <registry url>比如官方的registry(源)是https://registry.npmjs.org/
$ npm config set registry https://registry.npmjs.org/如果同時(shí)有幾個(gè)registry(源)需要切換,整個(gè)人都要崩潰了。。。
Nrm就是專門用于解決這個(gè)問(wèn)題,它可以幫助你簡(jiǎn)單、快速的在不同的npm registry(源)之間進(jìn)行切換,它默認(rèn)內(nèi)置了很多常用的源,包括npm、cnpm、taobao、 nj、rednpm、npmMirror,當(dāng)然你可以自己通過(guò)nrm add維護(hù)自己的源。
安裝nrm
nrm本身是Node.js模塊,所以它是通過(guò)npm來(lái)安裝的,它是一個(gè)二進(jìn)制模塊,需要使用--global參數(shù)進(jìn)行全局安裝
$ [sudo] npm install --global nrm測(cè)速
為了確定哪個(gè)registry(源)下載速度更快,我們需要進(jìn)行測(cè)速,通過(guò)測(cè)速結(jié)果,來(lái)決定具體使用哪個(gè)registry(源)
測(cè)試使用nrm test命令,非常簡(jiǎn)單、實(shí)用:
$ nrm test* npm ---- 1623mscnpm --- 561mstaobao - 2184msnj ----- 2382msrednpm - Fetch ErrornpmMirror 3999ms從測(cè)速結(jié)果上,可以看出cnpm是最快的,雖然每次測(cè)速都有浮動(dòng),但整體來(lái)說(shuō)cnpm和taobao的源還是比較快的,尤其是在阿里云上部署,按需取用就好。
查看源
一般,我們需要了解自己當(dāng)前使用的是哪個(gè)registry(源),這取決于2點(diǎn)
- 知道當(dāng)前使用的從哪個(gè)registry(源),是否下載速度最快的
- Node.js模塊只能發(fā)布在官方源,如果是其他源,是無(wú)法publish(發(fā)布)成功的
查看源的狀態(tài)通過(guò)nrm ls命令即可
$ nrm ls* npm ---- https://registry.npmjs.org/cnpm --- http://r.cnpmjs.org/taobao - http://registry.npm.taobao.org/nj ----- https://registry.nodejitsu.com/rednpm - http://registry.mirror.cqupt.edu.cnnpmMirror https://skimdb.npmjs.com/registry說(shuō)明
- *標(biāo)識(shí)說(shuō)明它是當(dāng)前使用的registry(源)
- npm是registry(源)名字,可以在nrm里用于切換的名字
- 當(dāng)前版本nrm共提供了6個(gè)registry(源)
切換源
記住registry具體url地址可能有點(diǎn)難為人,那換成名字呢?nrm就是通過(guò)名字來(lái)切換的。
通過(guò)nrm use <registry name>可以快速的切換registry(源)
$ nrm use cnpmRegistry has been set to: http://r.cnpmjs.org/此時(shí),查看一下npm源的情況,就會(huì)知道當(dāng)前采用的是cnpm源
$ nrm lsnpm ---- https://registry.npmjs.org/ * cnpm --- http://r.cnpmjs.org/taobao - http://registry.npm.taobao.org/nj ----- https://registry.nodejitsu.com/rednpm - http://registry.mirror.cqupt.edu.cnnpmMirror https://skimdb.npmjs.com/registry從源碼編譯
Node.js源碼是典型的c/c++項(xiàng)目,使用make作為構(gòu)建工具,所以和其他c/c++從源碼編譯沒(méi)什么區(qū)別,傳統(tǒng)的3步,只是準(zhǔn)備好依賴即可
安裝依賴
sudo apt-get install g++ curl libssl-dev apache2-utils git-core build-essential下載源碼,并編譯
git clone https://github.com/nodejs/node.git cd node ./configure make sudo make install總結(jié)
本節(jié)沒(méi)有采用apt-get或brew這樣的直接安裝方式,而是通過(guò)nvm進(jìn)行安裝,希望大家能夠體會(huì)在Node.js快速發(fā)展的今天,可以隨時(shí)切換版本,在線上環(huán)境保守,在學(xué)習(xí)時(shí)超前,無(wú)論出于哪種目的,3m安裝法都是比較好的選擇。
最后講了如何從源碼進(jìn)行編譯,這部分主要是c/c++項(xiàng)目的通用編譯法,如果可以,盡量掌握,在后面npm里開(kāi)發(fā)c/c++ addons的時(shí)候會(huì)用到的。
總結(jié)
以上是生活随笔為你收集整理的Node.js的3m安装法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WEB 3.0(非技术版)
- 下一篇: Linux下GCC与G++的区别和联系