模块
在Nodejs中,一般将代码合理拆分到不同的js文件中,每一个文件就是一个模块,而文件路径就是模块名。在编写每个模块时,都有require、exports、module三个预先定义好的变量可使用。
require函数用户在当前模块加载和使用别的模块。
var foo=require("../foo");
exports对象是当前模块的导出对象,用于导出模块共有的方法和属性。模块通过require函数得到的就是当前模块的exports对象。
exports.hello=function(){console.log('wsh');};
module对象可以访问到当前模块的相关信息,但最多用途是替换当前对象模块的导出对象。
模块初始化
一个模块中的js代码仅哎第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。
主模块
通过命令行参数传递给NodeJS以启动程序的模块被称为主模块
代码组织和部署
为了有个良好的开端,首先需要准备好代码的目录结构和部署方式,就如同修房子要先搭脚手架。
模块路径和解析规则
1 内置模块
如果传递require函数的是nodeJS内置模块,不做路径解析,直接返回内部模块的导出对象。例如require("fs");
2 node_modules目录
node_mudule目录用于存放模块。
3 node_path环境变量
与path环境变量类似,nodeJS允许通过node_path环境变量来指定额外的模块搜索路径。NODE_PATH环境变量中包含一到多个目录路径,路径之间在Linux下使用:
分隔,在Windows下使用;
分隔。例如定义了以下NODE_PATH环境变量:
NODE_PATH=/home/user/lib:/home/lib
当使用require('foo/bar')的方式加载模块时,则NodeJS依次尝试以下路径。
/home/user/lib/foo/bar
/home/lib/foo/bar
包
我们已经知道了JS模块的基本单位是单个JS文件,但复杂些的模块往往由多个子模块组成。为了便于管理和使用,我们可以把由多个子模块组成的大模块称做包
,并把所有子模块放在同一个目录里。
package.json
如果想自定义入口模块的文件名和存放位置,就需要在包目录下包含一个package.json
文件,并在其中指定入口模块的路径。
工程目录
了解了以上知识后,现在我们可以来完整地规划一个工程目录了。以编写一个命令行程序为例,一般我们会同时提供命令行模式和API模式两种使用方式,并且我们会借助三方包来编写代码。除了代码外,一个完整的程序也应该有自己的文档和测试用例。因此,一个标准的工程目录都看起来像下边这样。
- /home/user/workspace/node-echo/ # 工程目录
- bin/ # 存放命令行相关代码 node-echo + doc/ # 存放文档 - lib/ # 存放API相关代码 echo.js - node_modules/ # 存放三方包 + argv/ + tests/ # 存放测试用例 package.json # 元数据文件 README.md # 说明文件