Node.js&NPM的安裝與配置

猿碼道發表於2017-12-21

1 Node.js安裝與配置

1.1 Windows平臺下的Node.js安裝

在過去,Node.js一直不支援在Windows平臺下原生編譯,需要藉助Cygwin或 MinGW來模擬POSIX系統,才能編譯安裝。幸運的是2011年6月微軟開始與Joyent合作移植Node.js到Windows平臺上 (www.infoq.com/cn/news/201…),這次合作的成果最終呈現在0.6.x的穩定版的釋出上。這次的版本釋出使得Node.js在Windows平臺上的效能大幅度提高,使用方面也更容易和輕巧,完全擺脫掉Cygwin或MinGW等實驗室式的環境,並且在某些細節方面,表現出比Linux下更高的效能,細節參見www.infoq.com/news/2011/1…

在Windows(Windows7)平臺下,我將介紹二種安裝Node.js的方法, 即普通和文藝安裝方法

  1. 普通的安裝方法

    普通安裝方法其實就是最簡單的方法了,對於大多Windows使用者而言,都是不太喜歡折騰的人,你可以從這裡(nodejs.org/dist/v0.6.1…)直接下載到Node.js編譯好的msi檔案。然後雙擊即可在程式的引導下完成安裝。

    在命令列中直接執行:

    node -v
    複製程式碼

    命令列將列印出:

    v0.6.1
    複製程式碼

    該引導步驟會將node.exe檔案 安裝到C:\Program Files (x86)\nodejs\目錄下,並將該目錄新增進PATH環境變數

  2. 文藝的安裝方法

    Windows平臺下的文藝安裝方法主要提供給那些熱愛折騰,喜歡編譯的同學們。在編譯原始碼之前需要注意的是你的Windows系統是否包含編譯原始碼的工具。Node.js的原始碼主要由C++程式碼和JavaScript程式碼構成,但是卻用gyp工具 (code.google.com/p/gyp/)來做原始碼的專案管理,該工具採用Python語言寫成的。在Windows平臺上,Node.js採用gyp來生成Visual Studio Solution檔案,最終通過VC++的編譯器將其編譯為二進位制檔案。所以,你需要滿足以下兩個條件:

    1. Python(Node.js建議使用2.6或更高版本,不推薦3.0),可以從這裡(python.org/)獲取。

    2. VC++編譯器,包含在Visual Studio 2010中(VC++ 2010 Express亦可),VS2010可以從這裡(msdn.microsoft.com/en-us/vstud…)找到。

    下載Node.js的0.6.1版本的原始碼壓縮包(nodejs.org/dist/v0.6.1…)並解壓之。

    通過命令列進入解壓的原始碼目錄,執行vcbuild.bat release命令,然後經歷了漫長的等待後,編譯完成後,在Release目錄下可以找到編譯好的node.exe檔案。通過命令列執行node -v。

    命令列返回結果為:

    v0.6.1
    複製程式碼

1.2 Unix/Linux平臺下的Node.js安裝

由於Node.js尚處於v0.x.x的版本的快速發展中, Unix/Linux平臺的發行版都不會預置Node的二進位制檔案,通過原始碼進行編譯安裝是目前最好的選擇。而且用Unix/Linux系統的同學們多數都是文藝程式設計師,本節只介紹如何通過原始碼進行編譯和安裝。

  1. 安裝條件

    如同在Windows平臺下一樣,Node.js依然是採用gyp工具管理生成專案的,不同的是通過make工具進行最終的編譯。所以Unix/Linux平臺下你需要以下幾個必備條件,才能確保編譯完成:

    • Python。用於gyp,可以通過在shell下執行python命令,檢視是否已安裝python,並確認版本是否符合需求(2.6或更高版本,但不推薦 3.0)。

    • 原始碼編譯器,通常 Unix/Linux平臺都自帶了C++的編譯器 (GCC/G++)。如果沒有,請通過當前發行版的軟體包安裝工具安裝make,g++這些編譯工具。

    a. Debian/Ubuntu下的工具是apt-get
    b. RedHat/centOS下通過yum命令
    c. Mac OS X下你可能需要安裝xcode來獲得編譯器
    複製程式碼
    • 其次, 如果你計劃在Node.js中啟用網路加密,OpenSSL的加密庫也是必須的。該加密庫是libssl-dev,可以通過apt-get install libssl-dev等命令安裝。
  2. 檢查環境並安裝

    完成以上預備條件後,我們獲取原始碼並進行環境檢查吧:

    wget http://nodejs.org/dist/v0.6.1/node-v0.6.1.ta
    tar zxvf node-v0.6.1.tar.gz
    cd node-v0.6.1
    ./configure // 檢查環境是否符合Nodejs的編譯需要
    複製程式碼

    如果檢查沒有通過,請確認上面提到的三個條件是否滿足。如果configure命令 執行成功,就可以進行編譯了:

    make
    make install
    複製程式碼

    Nodejs通過make工具進行編譯和安裝(如果make install不成功,請使用sudo 以確保擁有許可權)。完成以上兩步後,檢查一下是否安裝成功:

    node -v
    複製程式碼

    檢查是否返回:

    v0.6.1
    複製程式碼

至此,Nodejs已經編譯並安裝完成。如需解除安裝,可以執行make uninstall進行解除安裝

1.3 小結

以上介紹了Linux和Windows平臺下Nodejs的安裝,之後可以如同Nodejs官方網站上介紹的那樣,編寫example.js檔案。

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1 337/');
複製程式碼

在命令列中執行它:

node example.js
複製程式碼

你就可以通過瀏覽器訪問http://127.0.0.1:1337得到Hello World的響應。注意:在JavaScript中,一個函式可以作為另一個函式接收一個引數。我們可以先定義一個函式,然後傳遞,也可以在傳遞引數的地方直接定義函式。如下的方式更優雅:

var http = require("http");

function onRequest(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888);
複製程式碼

2 安裝NPM

NPM的全稱是Node Package Manager,如果你熟悉ruby的gem,Python的 PyPL、setuptools,PHP的pear,那麼你就知道NPM的作用是什麼了。沒錯, 它就是Nodejs的包管理器。Nodejs自身提供了基本的模組。但是在這些基本模組上開發實際應用需要較多的工作。所幸的是筆者執筆此文的時候NPM上已經有了5112個Nodejs庫或框架,這些庫從各個方面可以幫助Nodejs的開發者完成較為複雜的應用。這些庫的數量和活躍也從側面反映出Nodejs社群的發展是十分神速和活躍的。下面我將介紹安裝NPM和通過NPM安裝Nodejs的第三方庫, 以及在大陸的網路環境下,如何更好的利用NPM。

2.1 Unix/Linux下安裝NPM

就像NPM的官網(npmjs.org/)上介紹的那樣,安裝NPM僅僅是一行命令的事情:

curl http://npmjs.org/install.sh | sudo sh
複製程式碼

這裡詳解一下這句命令的意思,curl http://npmjs.org/install.sh是通過curl命令獲 取這個安裝shell指令碼,按後通過管道符|將獲取的指令碼交由sh命令來執行。

我們以underscore為例,來展示下通過npm安裝第三方包的過程。

npm install underscore
複製程式碼

返回:

underscore@1.2.2 ./node_modules/underscore
複製程式碼

由於一些特殊的網路環境,直接通過npm install命令安裝第三方庫的時候,經常會出現卡死的狀態。幸運的是國內CNode社群的@fire9同學利用空餘時間搭建了一個映象的NPM資源庫,伺服器架設在日本,可以繞過某些不必要的網路問題。你可以通過以下這條命令來安裝第三方庫:

npm --registry "http://npm.hacknodejs.com/" insta ll underscore
複製程式碼

如果你想將它設為預設的資源庫,執行下面這條命令即可:

npm config set registry "http://npm.hacknodejs.com/"
複製程式碼

設定之後每次安裝時就可以不用帶上—registry引數。值得一提的是還有另一個映象可用,該映象地址是registry.npmjs.vitecho.com,如需使用,替換上面兩行命令的地址即可。

2.2 Windows下安裝NPM

由於Nodejs最初在Linux開發下的歷史原因,導致NPM一開始也不支援 Windows環境,但是隨著Nodejs成功移植到到Windows平臺,NPM在 Windows下的需求亦是日漸增加。下面開始Windows下的NPM之旅吧。

  1. 安裝GIT工具

    由於github網站不支援直接下載打包了所有submodule的原始碼包,所以需要通過 git工具來簽出所有的原始碼。 從code.google.com/p/msysgit/d…,可以下載到msysgit這個Windows平臺下的git客戶端工具(最新版本檔案為Git-1.7.7.1- preview20111027.exe)。在下載之後雙擊安裝。

  2. 下載NPM原始碼

    開啟命令列工具(CMD),執行以下命令,可以通過msysgit簽出NPM的所有原始碼和依賴程式碼並安裝npm。

    git clone --recursive git://github.com/isaacs/npm .git
    cd npm
    node cli.js install npm -gf
    複製程式碼

    在執行這段程式碼之前,請確保node.exe是跟通過node.msi的方式安裝的,或者在PATH環境變數中。這段命令也會將npm加入到PATH環境變數中去,之後可以隨處執行npm命令。如果安裝中遇到許可權方面的錯誤,請確保cmd命令列工具是通過管理員身份執行的。安裝成功後,執行以下命令:

    npm install underscore
    複製程式碼

    返回:

    underscore@1.2.2 ./node_modules/underscore
    複製程式碼

    如此,Windows平臺下的NPM安裝完畢。如果遭遇網路問題無法安裝,請參照 Linux下的NPM命令,新增映象地址

3 快速建立基於npm的nodejs庫

用Node實現的功能越來越多,程式碼越來越複雜,我們就 開始考慮如何把程式碼從專案中抽出來,形成單獨的類庫(模組)管理。就像我們所依賴其他第三方類庫一樣。

3.1 npm是什麼?

NPM的全稱是,是一個NodeJS包管理和分發工具,已經成為了非官方的釋出Node模組的標準。

Nodejs自身提供了基本的模組,但是開發實際應用過程中僅僅依靠這些基本模組則還需要較多的工作。幸運的是,Nodejs庫和框架為我們提供了幫助,讓我們減少工作量。但是成百上千的庫或者框架管理起來又很麻煩,有了NPM,可以很快的找到特定服務要使用的包,進行下載、安裝以及管理已經安裝的包

類似於Java中的Maven,Ubuntu中的apt-get, Ruby中的Gem, Python中pypi等…

NPM模組釋出頁:npmjs.org/

3.2 快速建立包

專案描述:讀取檔案,把所有的大寫文字轉換成小寫文字,控制檯輸出。

建立專案:

~ D:\workspace\javascript>mkdir nodejs-package && cd nodejs-package
複製程式碼

建立專案結構:

~ D:\workspace\javascript\nodejs-package>mkdir bin
~ D:\workspace\javascript\nodejs-package>touch bin/lowercase
~ D:\workspace\javascript\nodejs-package>touch bin/lowercase.bat
~ D:\workspace\javascript\nodejs-package>mkdir test
~ D:\workspace\javascript\nodejs-package>mkdir test/data
~ D:\workspace\javascript\nodejs-package>touch test/data/sample.txt
~ D:\workspace\javascript\nodejs-package>touch lowercase.js
~ D:\workspace\javascript\nodejs-package>touch example.js
~ D:\workspace\javascript\nodejs-package>touch README.md
複製程式碼

NPM專案結構

專案結構說明:

bin目錄: 用於存放命令的目錄

bin/lowercase檔案: Linux命令列可執行檔案

bin/lowercase.bat檔案: Win命令列可執行檔案

test目錄: 用於存放測試程式碼的目錄

test/data目錄: 用於存放測試資料的目錄

test/data/sample.txt: 測試資料檔案

lowercase.js檔案: 核心功能程式碼檔案

example.js檔案: 例子程式碼檔案

package.json檔案: 專案描述及依賴檔案

README.md檔案: 專案說明檔案

建立檔案:package.json

~ D:\workspace\javascript\nodejs-package>npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sane defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install  --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (nodejs-package) lowercase
version: (0.0.0) 0.0.1
description: A demo package
entry point: (index.js)
test command:
git repository:
keywords:
author: Conan Zhang
license: (BSD) MIT
About to write to D:\workspace\javascript\nodejs-package\package.json:

{
  "name": "lowercase",
  "version": "0.0.1",
  "description": "A demo package",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "dependencies": {
    "moment": "~2.4.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": "",
  "author": "Conan Zhang",
  "license": "MIT",
  "readmeFilename": "README.md"
}

Is this ok? (yes) yes
npm WARN package.json lowercase@0.0.1 No readme data!
複製程式碼

修改檔案:package.json

~ vi package.json

{
    "name": "lowercase_demo",
    "version": "0.0.1",
    "description": "A demo package of lowercase",
    "keywords":[
        "demo","lowercase"
    ],
    "author": "Conan Zhang  (http://blog.fens.me)",
    "license": "MIT",
    "main": "lowercase.js",
    "repository": {
        "type":"git",
        "url":"https://github.com/bsspirit/lowercase_demo"
    },
    "engines": {
        "node": ">=v0.10.5"
    },
    "readmeFilename": "README.md"
}
複製程式碼

編輯檔案:lowercase.js

~ vi lowercase.js

"use strict"
var fs = require('fs');

exports.lowerCase = function (myfile) {
    console.log(myfile);

    if (fs.existsSync(myfile)) {
        var content = fs.readFileSync(myfile, 'utf8');
        console.log(content.toLowerCase());
    } else {
        console.log("File does not exist - " + myfile);
    }
}
複製程式碼

編輯檔案:example.js

~ vi example

"use strict"

var lowercase = require('./lowercase.js');
var myfile="test/data/sample.txt"
lowercase.lowerCase(myfile);
複製程式碼

編輯檔案:test/data/sample.txt

~ vi sample.txt

JAVA
NODEJS
PYTHON
PHP
.NET
R
RUBY
C
C++
GO
複製程式碼

執行:example.js

~ D:\workspace\javascript\nodejs-package>node example.js
test/data/sample.txt
java
nodejs
python
php
.net
r
ruby
c
c++
go
複製程式碼

編輯檔案:README.md

~ vi README.md

lowercase
========================

A demo package of lowercase

...

複製程式碼

3.3 建立命令列工具

編輯檔案:bin/lowercase

~ vi lowercase

#!/usr/bin/env node

var myfile = process.argv.slice(2);

var path = require('path');
var fs = require('fs');
var dir = path.dirname(fs.realpathSync(__filename))+"/../";
require(dir+'lowercase.js').lowerCase(dir+myfile);
複製程式碼

編輯檔案:bin/lowercase.bat

~ vi lowercase.bat

node.exe bin/lowercase %1
複製程式碼

執行lowercase.bat

~ D:\workspace\javascript\nodejs-package>bin\lowercase.bat test\data\sample.txt

D:\workspace\javascript\nodejs-package>node.exe bin/lowercase test\data\sample.txt
D:\workspace\javascript\nodejs-package\bin/../test\data\sample.txt
java
nodejs
python
php
.net
r
ruby
c
c++
go
複製程式碼

3.4 本地安裝lowercase包

新建專案,並安裝lowercase依賴庫

~ D:\workspace\javascript>mkdir nodejs-package-project && cd nodejs-package-project
~ D:\workspace\javascript\nodejs-package-project>npm install ..\nodejs-package
lowercase_demo@0.0.1 node_modules\lowercase_demo
複製程式碼

專案依賴庫

新建執行檔案:app.js

~ vi app.js

var lowercase = require('lowercase_demo');
var myfile="data.txt"
lowercase.lowerCase(myfile);
複製程式碼

資料檔案: data.txt

~ vi data.txt

APP
BACCDADDS
複製程式碼

執行app.js

~ D:\workspace\javascript\nodejs-package-project>node app.js
data.txt
app
baccdadds
複製程式碼

3.5 專案上傳到github

把lowercase_demo庫,上傳到github。

~ git init
~ git add .
~ git commit -m 'init'
~ git remote add origin git@github.com:bsspirit/lowercase_demo.git
~ git push origin master
複製程式碼

3.6 通過npm釋出包

在npm上,註冊新使用者。

~ D:\workspace\javascript\nodejs-package>npm adduser
Username: bsspirit
Password:
Email: bsspirit@gmail.com
npm http PUT https://registry.npmjs.org/-/user/org.couchdb.user:bsspirit
npm http 409 https://registry.npmjs.org/-/user/org.couchdb.user:bsspirit
npm http GET https://registry.npmjs.org/-/user/org.couchdb.user:bsspirit
npm http 200 https://registry.npmjs.org/-/user/org.couchdb.user:bsspirit
npm http PUT https://registry.npmjs.org/-/user/org.couchdb.user:bsspirit/-rev/2-25eae797548e61
npm http 201 https://registry.npmjs.org/-/user/org.couchdb.user:bsspirit/-rev/2-25eae797548e61
複製程式碼

在npm上,釋出專案:

~ D:\workspace\javascript\nodejs-package>npm publish
npm http PUT https://registry.npmjs.org/lowercase_demo
npm http 201 https://registry.npmjs.org/lowercase_demo
npm http GET https://registry.npmjs.org/lowercase_demo
npm http 200 https://registry.npmjs.org/lowercase_demo
npm http PUT https://registry.npmjs.org/lowercase_demo/-/lowercase_demo-0.0.1.tgz/-rev/1-162a1
e
npm http 201 https://registry.npmjs.org/lowercase_demo/-/lowercase_demo-0.0.1.tgz/-rev/1-162a1
e
npm http PUT https://registry.npmjs.org/lowercase_demo/0.0.1/-tag/latest
npm http 201 https://registry.npmjs.org/lowercase_demo/0.0.1/-tag/latest
+ lowercase_demo@0.0.1
複製程式碼

3.7 通過npm安裝

通過npm下載安裝:

~ D:\workspace\javascript>mkdir nodejs-package-project2 && cd nodejs-package-project2
~ D:\workspace\javascript\nodejs-package-project2>npm install lowercase_demo
npm http GET https://registry.npmjs.org/lowercase_demo
npm http 200 https://registry.npmjs.org/lowercase_demo
lowercase_demo@0.0.1 node_modules\lowercase_demo
複製程式碼

全域性安裝lowercase_demo:

~ D:\workspace\javascript\nodejs-package-project2>npm install lowercase_demo -g
npm http GET https://registry.npmjs.org/lowercase_demo
npm http 304 https://registry.npmjs.org/lowercase_demo
D:\toolkit\nodejs\lowercase -> D:\toolkit\nodejs\node_modules\lowercase_demo\bin\lowercase
npm ERR! peerinvalid The package generator-karma does not satisfy its siblings' peerDependenci
npm ERR! peerinvalid Peer generator-angular@0.4.0 wants generator-karma@~0.5.0

npm ERR! System Windows_NT 6.1.7601
npm ERR! command "D:\\toolkit\\nodejs\\\\node.exe" "D:\\toolkit\\nodejs\\node_modules\\npm\\bi
lowercase_demo" "-g"
npm ERR! cwd D:\workspace\javascript\nodejs-package-project2
npm ERR! node -v v0.10.5
npm ERR! npm -v 1.2.19
npm ERR! code EPEERINVALID
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     D:\workspace\javascript\nodejs-package-project2\npm-debug.log
npm ERR! not ok code 0
複製程式碼

錯誤不是lowercase_demo的,沒有關係。

執行全域性命令:lowercase

~ D:\workspace\javascript\nodejs-package-project2>lowercase test\data\sample.txt
D:\toolkit\nodejs\node_modules\lowercase_demo\bin/../test\data\sample.txt
java
nodejs
python
php
.net
r
ruby
c
c++
go
複製程式碼

注:關於命令lowercase,因為程式碼中定義的是相對目錄,所以只能訪問D:\toolkit\nodejs\node_modules\lowercase_demo\目錄的資料檔案。

相關文章