##模块化代码结构
- Node 采用的模块化结构是按照 CommonJS 规范
- 模块与文件是一一对应关系,即加载一个模块,实际上就是加载对应的一个模块文件。
>CommonJS 就是一套约定标准,不是技术;用于约定我们的代码应该是怎样的一种结构;
http://wiki.commonjs.org/wiki/CommonJS
>CommonJS 模块的特点
- 所有代码都运行在模块作用域,不会污染全局作用域。
- 模块可以多次加载,但是只会在第一次加载时运行一次,然后 运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
- 模块加载的顺序,按照其在代码中出现的顺序。
##模块的分类
- 文件模块
就是我们自己写的功能模块文件
- 核心模块
Node 平台自带的一套基本的功能模块,也有人称之为 Node 平台的 API
- 第三方模块
社区或第三方个人开发好的功能模块,可以直接拿回来用
##模块化开发的流程

##模块内全局环境(伪)
- 我们在之后的文件操作中必须使用绝对路径
- __dirname
用于获取当前文件所在目录的完整路径;
在 REPL 环境无效;
- __filename
用来获取当前文件的完整路径;
在 REPL 环境同样无效;
- module
模块对象
- exports
映射到 module.exports 的别名
- require()
require.cache
require.extensions
require.main
require.resolve()
###module 对象
- Node 内部提供一个 Module 构建函数。所有模块都是 Module 的实例,属性如下:
module.id 模块的识别符,通常是带有绝对路径的模块文件名。
module.filename 模块定义的文件的绝对路径。
module.loaded 返回一个布尔值,表示模块是否已经完成加载。
module.parent 返回一个对象,表示调用该模块的模块。
module.children 返回一个数组,表示该模块要用到的其他模块。
**module.exports 表示模块对外输出的值。**
- 载入一个模块就是构建一个 Module 实例。
##模块的定义
- 一个新的 JS 文件就是一个模块;
- 一个合格的模块应该是有导出成员的,否则模块就失去了定义的价值;
- 模块内部是一个独立(封闭)的作用域(模块与模块之间不会冲突);
- 模块之间必须通过导出或导入的方式协同;
- 导出方式:
```
exports.name = value;
module.exports = { name: value };
```
**module.exports 和 exports**
- module.exports 是用于为模块导出成员的接口
- exports 是指向 module.exports的别名,相当于在模块开始的时候执行:
`var exports = module.exports`;
- 一旦为 module.exports赋值,就会切断之前两者的相关性;
- 最终模块的导出成员以 module.exports 为准
##载入模块
require 函数
###require 简介
- Node 使用 CommonJS 模块规范,内置的 require 函数用于加载模块文件。
- require 的基本功能是,读入并执行一个 JavaScript 文件,然后返回该模块的 exports 对象。
- 如果没有发现指定模块,会报错。
##require 扩展名
```js
require 加载文件时可以省略扩展名:
require('./module');
// 此时文件按 JS 文件执行
require('./module.js');
// 此时文件按 JSON 文件解析
require('./module.json');
// 此时文件预编译好的 C++ 模块执行
require('./module.node');
// 载入目录module目录中的 package.json 中main指向的文件
require('./module/default.js');
// 载入目录module 中的index.js文件
```
##require 加载文件规则
- 通过 ./ 或 ../ 开头:则按照相对路径从当前文件所在文件夹开始寻找模块;
require('../file.js'); => 上级目录下找 file.js 文件
- 通过 / 开头:则以系统根目录开始寻找模块;require('/Users/iceStone/Documents/file.js'); => 以绝对路径的方式找
没有任何异议
- 如果参数字符串不以“./“ 或 ”/“ 开头,则表示加载的是一个默认提供的核心模块(位于 Node 的系统安装目录中):
require('fs'); => 加载核心模块中的文件系统模块
或者从当前目录向上搜索 node_modules 目录中的文件:require('my_module'); => 各级 node_modules 文件夹中搜索 my_module.js 文件;
###require 加载目录规则
- 如果 require 传入的是一个目录的路径,会自动查看该目录的 package.json 文件,然后加载 main 字段指定的入口文件
- 如果package.json文件没有main字段,或者根本就没有package.json文件,则默认找目录下的 index.js 文件作为模块:
require('./calcuator'); => 当前目录下找 calculator 目录中的 index.js 文件
##常用内置模块清单
如果只是在服务器运行 JavaScript代码,意义并不大,因为无法实现任何功能(读写文件,访问网络)。
Node 的用处在于它本身还提供的一系列功能模块,用于与操作系统互动。
这些核心的功能模块在 Node 中内置。
内置如下模块:
- [path](http://nodejs.org/api/path.html):处理文件路径。
- [fs](http://nodejs.org/api/fs.html):操作文件系统。
- [child_process](http://nodejs.org/api/child_process.html):新建子进程。
- [util](http://nodejs.org/api/util.html):提供一系列实用小工具。
- [http](http://nodejs.org/api/http.html):提供HTTP服务器功能。
- [url](http://nodejs.org/api/url.html):用于解析URL。
- [querystring](http://nodejs.org/api/querystring.html):解析URL中的查询字符串。
- [crypto](http://nodejs.org/api/crypto.html):提供加密和解密功能。
- [其他](https://nodejs.org/api/)
- 简介
- 配置安装
- window
- 基础知识
- Node 命令基本用法
- 进程和线程
- 调试
- 异步、回调
- 全局对象
- 非阻塞 I/O和事件驱动和非阻塞机制
- npm包概念
- 模块化
- 实现require和cache
- 核心模块操作
- fs文件系统操作
- 同步调用和异步调用
- 缓冲区处理(二进制数据)
- 文件读取
- 文件写入
- 例子:读取歌词文件显示
- 文件流
- 例子:文件复制
- 监视文件
- 其他文件操作
- 目录操作
- 例子:递归加载目录树
- path路径操作模块
- 网络操作
- URL 解析模块
- querystring查询字符串模块
- crypto加密解密模块
- Socket
- 例子:聊天室
- coffeescript
- Gulp-自动化构建工具
- Gulp实现前端构建
- Gulp后端构建
- 插件
- gulp-load-plugins 模块化管理插件
- gulp-minify-css 压缩css插件
- gulp-sass 将sass预处理为css
- gulp-less 将less预处理为css
- gulp-sourcemaps 插件
- gulp-concat 合并插件
- gulp-uglify 压缩JS插件
- gulp-util gulp常用工具库插件
- yargs插件
- gulp-nodemon 自动启动/重启插件
- coffee-script 插件
- gulp-coffee插件
- gulp-livereload 网页自动刷新
- Moment.js-处理时间插件
- express 前端框架
- Async-异步流程控制插件
- node-progress进度条插件
- JSHint-代码规范检查工具
- lodash -JavaScript 工具库
- 资料
- 框架所用包
- bodyParser
