Board logo

标题: 使用 node.js 进行服务器端 JavaScript 编程(1) [打印本页]

作者: look_w    时间: 2018-9-23 13:08     标题: 使用 node.js 进行服务器端 JavaScript 编程(1)

随着 Web 2.0 概念和 Ajax 技术的流行,JavaScript 作为 Ajax 应用开发中必不可少的一部分,已经得到了广泛的流行。开发人员也开始逐步的熟悉和掌握 JavaScript,并积累了相关的开发经验。虽然 JavaScript 目前主要用在 Web 应用中,以浏览器作为运行平台,但是已经有相关的尝试把 JavaScript 迁移到服务器端,这其中包括 Aptana 的  等。这种做法与  是异曲同工的。Google GWT 允许开发人员使用 Java 语言来编写 Web 前端代码。这两种做法的目的都是为了复用开发人员已经掌握的知识和积累的经验。在这点上,node.js 类似于 Jaxer。
简单的来说,node.js 是一个允许开发人员使用 JavaScript 语言编写服务器端代码的框架。也就是说编写的 JavaScript 代码可以直接运行在本地机器上,而不仅限于浏览器。从实现的角度来说,Jaxer 和 node.js 都使用了已有的 JavaScript 执行引擎。Jaxer 用的是 Mozilla Firefox 中使用的 JavaScript 引擎,而 node.js 用的则是 Google Chrome 中用的 V8 引擎。
node.js 入门node.js 可以运行在 Linux、Windows 和 Macintosh 等主流的操作系统上。在 Windows 平台上运行 node.js 的话,需要 Cygwin 或是 MinGW 的支持。下面以常用的 Windows 平台为例来说明。首先需要安装 Cygwin。安装的时候需要选择 gcc-g++ 、make 、openssl 和 python 等包。gcc 的版本必须是最新的。接着从  中给出的地址下载 node.js 0.4.0 版本的源代码。下载解压之后,依次在 Cygwin 中运行 ./configure 、make 和 make install 等命令进行编译和安装。安装完成之后,直接运行 node 命令就可以启动 node.js 提供的命令行。在命令行中可以直接输入 JavaScript 代码并运行。也可以通过 node server.js 的方式来运行一个 JavaScript 文件 server.js 。
中给出了一个简单的“Hello World”程序的示例。通过 node helloworld.js 来运行该 JavaScript 文件之后,会在控制台输出“Hello World”。
清单 1. 使用 node.js 的“Hello World”程序
1
process.stdout.write("Hello World");




中的 process 表示的是当前运行的 node.js 进程,其属性 stdout 表示的是进程的标准输出流。通过 write() 方法向给流中写入一个字符串。从  可以看到,使用 JavaScript 就可以访问标准输出流等本地系统上的资源。这从一个侧面反映出来了 node.js 的强大。
在 node.js 可以运行的 JavaScript 代码中,可以使用一些全局的对象:包括  中用到的 process 、下面会介绍的用来加载模块的 require() 方法、表示当前正在执行的 JavaScript 文件名的 __filename 、表示当前正在执行的 JavaScript 文件的目录的 __dirname 和与浏览器中相似的用来执行定时任务的 setTimeout() 和 setInterval() 方法等。
在介绍了 node.js 的基本知识之后,下面介绍 node.js 的模块化结构。
模块化结构node.js 使用了  定义的模块系统。不同的功能组件被划分成不同的模块。应用可以根据自己的需要来选择使用合适的模块。每个模块都会暴露一些公共的方法或属性。模块使用者直接使用这些方法或属性即可,不需要关系模块内部的实现细节。除了系统预置的多个模块之外,应用开发团队也可以利用这个机制来将应用拆分成多个模块,以提高代码的可复用性。
使用模块在 node.js 中使用一个模块的方式是非常简单的。使用某个模块之前需要首先声明对它的依赖。在 JavaScript 代码中可以直接使用全局函数 require() 来加载一个模块。如 require("http") 可以加载系统预置的 http 模块。而 require("./myModule.js") 用来加载与当前 JavaScript 文件同一目录下的 myModule.js 模块。如果使用 require() 的路径以“/”开头的话,则认为是模块 JavaScript 文件在操作系统上的绝对路径。如果不是这两种情况的话,node.js 就会尝试在当前 JavaScript 文件的父目录及其祖先目录下的 node_modules 目录下查找。比如目录 /usr/home/my.js 中调用了 require("other.js") 的话,node.js 会依次尝试查找下列文件:/usr/home/node_modules/other.js 、/usr/node_modules/other.js 和 /node_modules/other.js 。
require() 方法的返回值是该模块所暴露出来的公开 JavaScript 对象,包含了可供使用的方法和属性。 给出了模块的基本使用方式。
清单 2. 模块的基本使用方式
1
2
3
var greetings = require("./greetings.js");
var msg = greetings.sayHello("Alex", "zh_CN");
process.stdout.write(msg);




如  所示,一般是直接把 require() 方法的返回值赋值给一个变量,在 JavaScript 代码中直接使用此变量即可。greetings.js 模块暴露了一个 sayHello() 方法,当前 JavaScript 代码直接使用了该方法。
开发自己的模块开发自己的模块的基本工作是在模块对应的 JavaScript 文件中编写模块相关的代码。这其中封装了模块的内部处理逻辑。一般来说,一个模块通常会暴露一些公开的方法或属性给其使用者。模块的内部代码需要把这些方法或属性给暴露出来。 给出了  中所使用的 greetings.js 文件的内容。
清单 3. greetings.js 模块的内容
1
2
3
4
5
6
7
var languages = {
   "zh_CN" : "你好,",
   "en" : "Hello, "
};      
exports.sayHello = function(name, language) {
   return languages[language] || languages["en"] + name;
};




如  所示,exports 对象的内容就是模块的使用者调用 require() 方法的返回值中所包含的内容。模块通过这种方式来声明其所暴露出来的公开方法和属性。在模块中定义的变量,如 languages ,是只对模块内部的代码可见的。
如果一个模块所包含的内容比较多,也可以用文件夹的方式来组织。可以在文件夹的根目录下面创建一个 package.json 文件,其内容中包含了模块的名称和入口 JavaScript 文件的路径。如果没有提供这个 package.json 文件的话,node.js 会默认在文件夹中查找 index.js 文件作为模块的启动 JavaScript 文件。
在介绍完 node.js 的模块化结构之后,下面介绍其事件驱动机制。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0