原著:Garann Means
第一章 架设 Node
架设 Node 是很简单的,在某些环境下,甚至可以说是非常简单的。 Node 可以运行在 Unix 兼容的系统中,不久前,也开始支持 Windows 。 具体的讲, Node 可以运行在各种 Mac 、安装了 Linux 的机器和绝大多数你想用于开发的环境中。 也有一些公司提供 Node 主机,并且提供各种高级功能——例如状态监视工具,以及支持通过 Git 之类的版本控制工具进行部署等。 当然,你也可以在任何能通过 SSH 登录的服务器上安装 Node,只要你有创建文件和目录的权限。
为了进一步讲解,我们假设你将在一台 Mac 上安装 Node 。 对于在 Windows 或远程服务器上安装的差别,我们会特别说明。
Node 和 npm
根据不同的环境,有许多不同的方法可以安装 Node 。 最简单的莫过于从 Node 的官网上下载一个 Windows 或 Mac 的安装包(里面包含了 npm)。 你也可以通过一行 Homebrew 或者 APT 命令来安装 Node。 在任何支持并已安装 Git 的操作系统中,你也可以直接从代码库中获取一份 Node 源码并自行编译。
因为这是最通用的方法,所以让我们看看如何从 GitHub 获取和安装 Node 。 我们假设你已经安装了 Git 并能正常使用。
$ git clone git://github.com/joyent/node.git
$ cd node
$ git checkout v0.6.6
$ ./configure
$ make
$ make install
以上命令所做的,就是从 GitHub 克隆代码库,运行配置脚本,然后编译和安装 Node 。 请特别留意第三行,我们切换到了包含最新稳定版本的分支。 由于最新稳定版的版本号可能会较为频繁的变更,所以,假如你打算用命令行安装的话,首先检查下官网上的最新版本号或者使用命令 git tag 列出所有可用的版本号。
在当前版本中, npm 已经不需要单独安装了,但是出于某种原因,你想单独安装,也只需一个非常简单的命令。 在所有支持 npm 的环境中,首先推荐的安装方式是通过 Curl:
$ curl http://npmjs.org/install.sh | sh
NOTE:
npm 是 Node 的包管理器。 它维护着一张注册表,所有在其中注册过的 Node 模块都可以通过“一行式命令”进行安装,并能解决对第三方模块的依赖关系和版本管理。 你可以通过这个命令在 npm 中寻找模块: npm search 关键字
REPL
REPL 的全称是“读取-执行-输出”循环(Read-Eval-Print Loop),是 Node 中的一个功能,在刚接触 Node 时非常有用。 它的工作方式类似于浏览器中的调试控制台(debug console),你可以在里面执行任何你想执行的命令。 你不需去要额外安装它——你可以在所有可以使用 Node 的命令行里使用它。 在建立第一个应用之前,你就可以通过在命令行中输入 node 进入 REPL 模式,你可以在里面“逛逛”,看看 Node 能做些什么。 执行 node 命令时,如果你没有指定要执行的应用,就会进入 REPL 模式。
在命令提示符后输入 node 命令后,你可以测试几行简单的 JavaScript ,它们会正常执行:
> ["Hello", "World"].join(" ")
'Hello World'
> 2 + 3
5
你可以通过按下 Ctrl+C 退出 REPL。
让我们假设你正在为你的项目寻找一个管理异步代码路径的模块。 事实上有许多模块可以处理异步代码和流控制——让我们假设你已经找了一些,并且想对它们做个比较,而这些模块又恰巧都没有接口文档(实际上,我们接下来用作举例的那个有非常出色的文档)。 为了对模块包含哪些接口有一个更直观的印象,你可以用 npm 安装它们,然后用 REPL 尝试了解它们。 举个例子,如果你安装了 async 模块,你可以这么做:
$ node
> var async = require("async");
undefined
> console.dir(async);
以上代码可以把模块的属性列表打印出来,你还可以在这基础上进一步深入了解。 当然,通过读源代码也能获得这些信息,但是,学会通过 REPL 从 Node 的角度来看模块是非常有用的。 你还能使用 Tab 键来自动补全你代码中的函数和变量名,当你还在测试某个东西时,使用自动补全通常比查看文档更快。
文件组织
既然 Node 已经顺利安装,我们可以开始为网络应用建立“脚手架”了。 因为我们能控制我们的应用如何提供服务文件,我们可以把它们放在几乎任何我们想放的地方。 当然,还是有一些不成文的约定可以遵守。 这些约定包括:用于启动应用的主文件要放在站点根目录下, package.json 文件(我们接下来会创建)也是。 一些我们可能希望放在根目录下的目录通常包括:
node_modules
通过 npm 安装到本地的模块。
lib
应用中的功能模块和其他自定义的模块。
public www 或诸如此类
应用中的静态或客户端部分。
设置目录结构的标准是它是否真的适合你。 如果你打算在应用中采用 MVC 模式,你的根目录下可能需要名为 models ,views 和 controllers 的文件夹。 如果你打算使用 Express 作为应用框架或者基于 Express 建立应用结构,你的根目录下就可能需要一个叫 routes 的目录。 除了保持你的目录结构清晰一致以便他人使用外,你还得掌握你的应用是如何寻找和分发文件的,因为这意味着你总能把文件放到它们该属于的地方。
我们通常还希望创建一个叫 package.json 的文件,作为应用的清单。 这个文件对于想对外发布或共享的模块尤为重要,并且对我们的本地应用也是一份不错的礼物。 我们可以将很多信息添加到 package.json 中,但是现在,我们先建立一个比较简单的,只包含一些应用的元信息和一些依赖关系:
{
"name": "myNodeApp",
"author": "Jaime Developer",
"description": "my test node.js application",
"version": "0.0.1",
"dependencies": {
"content": "1.8.x",
"express": "2.5.x"
},
"engine": "0.6.x",
"main": "app.js"
}
以上大多数属性的意义从它们的名称就能看出来。 最后两个属性, engine 和 main ,分别指出 Node 的版本和主应用文件的路径。 dependencies 对象也需要重点注意,因为当我们打算移动这个应用时它将非常有用。 如果这个对象包含了我们的应用所需的所有 npm 模块及它们的正确版本,通过在新的根目录下运行 npm install ,我们可以一次性把所有需要的模块都安装好。