1 Node.js安裝與配置
1.1 Windows平臺下的Node.js安裝
在過去,Node.js一直不支持在Windows平臺下原生編譯,需要借助Cygwin或 MinGW來模擬POSIX系統,才能編譯安裝。幸運的是2011年6月微軟開始與Joyent合作移植Node.js到Windows平臺上 (http://www.infoq.com/cn/news/2011/06/node-exe),這次合作的成果最終呈現在0.6.x的穩定版的發布上。這次的版本發布使得Node.js在Windows平臺上的性能大幅度提高,使用方面也更容易和輕巧,完全擺脫掉Cygwin或MinGW等實驗室式的環境,并且在某些細節方面,表現出比Linux下更高的性能,細節參見http://www.infoq.com/news/2011/11/Nodejs-Windows。
在Windows(Windows7)平臺下,我將介紹二種安裝Node.js的方法, 即普通和文藝安裝方法
。
-
普通的安裝方法
普通安裝方法其實就是最簡單的方法了,對于大多Windows用戶而言,都是不太喜歡折騰的人,你可以從這里(http://nodejs.org/dist/v0.6.1/node-v0.6.1.msi)直接下載到Node.js編譯好的msi文件。然后雙擊即可在程序的引導下完成安裝。
在命令行中直接運行:
node -v
命令行將打印出:
v0.6.1
該引導步驟會將node.exe文件
安裝到C:\Program Files (x86)\nodejs\目錄下,并將該目錄添加進PATH環境變量
。 -
文藝的安裝方法
Windows平臺下的文藝安裝方法主要提供給那些熱愛折騰,喜歡編譯的同學們。
在編譯源碼之前需要注意的是你的Windows系統是否包含編譯源碼的工具
。Node.js的源碼主要由C++代碼和JavaScript代碼構成,但是卻用gyp工具 (http://code.google.com/p/gyp/)來做源碼的項目管理,該工具采用Python語言寫成的。在Windows平臺上,Node.js采用gyp來生成Visual Studio Solution文件,最終通過VC++的編譯器將其編譯為二進制文件。所以,你需要滿足以下兩個條件:Python(Node.js建議使用2.6或更高版本,不推薦3.0),可以從這里(http://python.org/)獲取。
VC++編譯器,包含在Visual Studio 2010中(VC++ 2010 Express亦可),VS2010可以從這里(http://msdn.microsoft.com/en-us/vstudio/hh388567)找到。
下載Node.js的0.6.1版本的源碼壓縮包(http://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gz)并解壓之。
通過命令行進入解壓的源碼目錄,執行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系統的同學們多數都是文藝程序員,本節只介紹如何通過源碼進行編譯和安裝。
-
安裝條件
如同在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等命令安裝。
-
檢查環境并安裝
完成以上預備條件后,我們獲取源碼并進行環境檢查吧:
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的官網(http://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參數。值得一提的是還有另一個鏡像可用,該鏡像地址是http://registry.npmjs.vitecho.com,如需使用,替換上面兩行命令的地址即可。
2.2 Windows下安裝NPM
由于Nodejs最初在Linux開發下的歷史原因,導致NPM一開始也不支持 Windows環境,但是隨著Nodejs成功移植到到Windows平臺,NPM在 Windows下的需求亦是日漸增加。下面開始Windows下的NPM之旅吧。
-
安裝GIT工具
由于github網站不支持直接下載打包了所有submodule的源碼包,所以需要通過 git工具來簽出所有的源碼。 從http://code.google.com/p/msysgit/downloads/list,可以下載到msysgit這個Windows平臺下的git客戶端工具(最新版本文件為Git-1.7.7.1- preview20111027.exe)。在下載之后雙擊安裝。
-
下載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模塊發布頁:https://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
項目結構說明:
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\目錄的數據文件。