本章介绍了使用 NodeJS 操作网络时需要的 API 以及一些坑回避技巧,总结起来有以下几点:http 和 https 模块支持服务端模式和客户端模式两种使用方式。request 和 response 对象除了用于读写头数据外,都可以当作数据流来操作。url.parse 方法加上 request.url 属性是处理 HTTP 请求时的固定搭配。使用 zlib 模块可以减少使用 HTTP 协议时的数据传输量。
使用 NodeJS 操作网络,特别是操作 HTTP 请求和响应时会遇到一些惊喜,这里对一些常见问题做解答。问: 为什么通过 headers 对象访问到的 HTTP 请求头或响应头字段不是驼峰的?答: 从规范上讲,HTTP 请求头和响应头字段都应该是驼峰的。
我们先大致看看 NodeJS 提供了哪些和网络操作有关的 API。这里并不逐一介绍每个API的使用方法,官方文档已经做得很好了。HTTP官方文档: http://nodejs.org/api/http.html'http'模块提供两种使用方式:作为服务端使用时,创建一个 HTTP 服务器,监听 HTTP 客户端请求并返回响应。作为客户端使用时,发起一个 HTTP 客户端请求,获取服务端响应。
不了解网络编程的程序员不是好前端,而 NodeJS 恰好提供了一扇了解网络编程的窗口。通过 NodeJS,除了可以编写一些服务端程序来协助前端开发和测试外,还能够学习一些 HTTP 协议与 Socket 协议的相关知识,这些知识在优化前端性能和排查前端故障时说不定能派上用场。本章将介绍与之相关的 NodeJS 内置模块。NodeJS 本来的用途是编写高性能 Web 服务器。
本章介绍了使用 NodeJS 操作文件时需要的 API 以及一些技巧,总结起来有以下几点:学好文件操作,编写各种程序都不怕。如果不是很在意性能,fs 模块的同步 API 能让生活更加美好。需要对文件读写做到字节级别的精细控制时,请使用 fs 模块的文件底层操作 API。不要使用拼接字符串的方式来处理路径,使用 path 模块。掌握好目录遍历和文件编码处理技巧,很实用。
使用 NodeJS 编写前端工具时,操作得最多的是文本文件,因此也就涉及到了文件编码的处理问题。我们常用的文本编码有 UTF8 和 GBK 两种,并且 UTF8 文件还可能带有 BOM。在读取不同编码的文本文件时,需要将文件内容转换为 JS 使用的 UTF8 编码字符串后才能正常处理。BOM 的移除BOM 用于标记一个文本文件使用 Unicode 编码,其本身是一个 Unicode 字符("\uFEFF"
遍历目录是操作文件时的一个常见需求。比如写一个程序,需要找到并处理指定目录下的所有JS文件时,就需要遍历整个目录。递归算法遍历目录时一般使用递归算法,否则就难以编写出简洁的代码。递归算法与数学归纳法类似,通过不断缩小问题的规模来解决问题。以下示例说明了这种方法。function factorial(n) { if (n === 1) { return 1;
我们先大致看看 NodeJS 提供了哪些和文件操作有关的 API。这里并不逐一介绍每个 API 的使用方法,官方文档已经做得很好了。Buffer(数据块)官方文档: http://nodejs.org/api/buffer.htmlJS 语言自身只有字符串数据类型,没有二进制数据类型,因此 NodeJS 提供了一个与 String 对等的全局构造函数 Buffer 来提供对二进制数据的操作。
NodeJS 提供了基本的文件操作 API,但是像文件拷贝这种高级功能就没有提供,因此我们先拿文件拷贝程序练手。与 copy 命令类似,我们的程序需要能接受源文件路径与目标文件路径两个参数。小文件拷贝我们使用 NodeJS 内置的 fs 模块简单实现这个程序如下。var fs = require('fs');function copy(src, dst) { fs.writeFileSync(dst, fs.readFileSync(src));
本章介绍了使用 NodeJS 编写代码前需要做的准备工作,总结起来有以下几点:编写代码前先规划好目录结构,才能做到有条不紊。稍大些的程序可以将代码拆分为多个模块管理,更大些的程序可以使用包来组织模块。合理使用 node_modules 和 NODE_PATH 来解耦包的使用方式和物理路径。使用 NPM 加入 NodeJS 生态圈互通有无。想到了心仪的包名时请提前在 NPM 上抢注。
NPM 是随同 NodeJS 一起安装的包管理工具,能解决 NodeJS 代码部署上的很多问题,常见的使用场景有以下几种:允许用户从 NPM 服务器下载别人编写的三方包到本地使用。允许用户从 NPM 服务器下载并安装别人编写的命令行程序到本地使用。允许用户将自己编写的包或命令行程序上传到 NPM 服务器供别人使用。
了解了以上知识后,现在我们可以来完整地规划一个工程目录了。以编写一个命令行程序为例,一般我们会同时提供命令行模式和 API 模式两种使用方式,并且我们会借助三方包来编写代码。除了代码外,一个完整的程序也应该有自己的文档和测试用例。因此,一个标准的工程目录都看起来像下边这样。
使用 NodeJS 编写的东西,要么是一个包,要么是一个命令行程序,而前者最终也会用于开发后者。因此我们在部署代码时需要一些技巧,让用户觉得自己是在使用一个命令行程序。例如我们用 NodeJS 写了个程序,可以把命令行参数原样打印出来。该程序很简单,在主模块内实现了所有功能。并且写好后,我们把该程序部署在 /home/user/bin/node-echo.js 这个位置。
我们已经知道了 JS 模块的基本单位是单个 JS 文件,但复杂些的模块往往由多个子模块组成。为了便于管理和使用,我们可以把由多个子模块组成的大模块称做包,并把所有子模块放在同一个目录里。在组成一个包的所有子模块中,需要有一个入口模块,入口模块的导出对象被作为包的导出对象。例如有以下目录结构。- /home/user/lib/ - cat/ head.js body.
有经验的 C 程序员在编写一个新程序时首先从 make 文件写起。同样的,使用 NodeJS 编写程序前,为了有个良好的开端,首先需要准备好代码的目录结构和部署方式,就如同修房子要先搭脚手架。本章将介绍与之相关的各种知识。模块路径解析规则我们已经知道,require函数支持斜杠(/)或盘符(C:)开头的绝对路径,也支持./开头的相对路径。
本章介绍了有关 NodeJS 的基本概念和使用方法,总结起来有以下知识点:NodeJS 是一个 JS 脚本解析器,任何操作系统下安装 NodeJS 本质上做的事情都是把 NodeJS 执行程序复制到一个目录,然后保证这个目录在系统 PATH 环境变量下,以便终端下可以使用 node 命令。终端下直接输入 node 命令可进入命令交互模式,很适合用来测试一些 JS 代码片段,比如正则表达式。
虽然一般我们使用 JS 编写模块,但 NodeJS 也支持使用 C/C++ 编写二进制模块。编译好的二进制模块除了文件扩展名是.node外,和 JS 模块的使用方式相同。虽然二进制模块能使用操作系统提供的所有功能,拥有无限的潜能,但对于前端同学而言编写过于困难,并且难以跨平台使用,因此不在本教程的覆盖范围内。
编写稍大一点的程序时一般都会将代码模块化。在 NodeJS 中,一般将代码合理拆分到不同的 JS 文件中,每一个文件就是一个模块,而文件路径就是模块名。在编写每个模块时,都有 require、exports、module 三个预先定义好的变量可供使用。requirerequire 函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。模块名可使用相对路径(以.
打开终端,键入 node 进入命令交互模式,可以输入一条代码语句后立即执行并显示结果,例如:$ node> console.log('Hello World!');Hello World!如果要运行一大段代码的话,可以先写一个JS文件再运行。例如有以下 hello.js。function hello() { console.log('Hello World!');}hello();写好后在终端下键入 node hello.js 运行,结果如下:$ node hello.
安装程序NodeJS 提供了一些安装程序,都可以在 nodejs.org 这里下载并安装。Windows 系统下,选择和系统版本匹配的 .msi 后缀的安装文件。Mac OS X 系统下,选择 .pkg 后缀的安装文件。编译安装Linux 系统下没有现成的安装程序可用,虽然一些发行版可以使用 apt-get 之类的方式安装,但不一定能安装到最新版。因此 Linux 系统下一般使用以下方式编译方式安装 NodeJS。1.
关注时代Java