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\目录的数据文件。