深入浅出NodeJs模块机制

428 阅读4分钟

1、JavaScript的进化

工具类库      =>  组件类库    =>    前端框架    =>  前端应用

经历了后天进化过程,JavaScript不断被类聚和抽象,以更好的组织业务逻辑。从另一 个角度而言,说明了JavaScript天生就缺乏的一项功能:“模块”。 

2、CommonJS规范 

JavaScript如果要形成模块化必须要有一个规范制约,因此就有了CommonJS规范

这些规范涵盖了

  • 模块
  • 二进制
  • Buffer
  • 字符集编码
  • I/O流
  • 进程环境
  • 文件系统
  • 套接字
  • 单元测试
  • Web服务􏰬网关接􏳝
  • 包管理
3、Node与浏览器以及W3C组织、CommonJS组织、ECMAScript之间的关系


 
 

4、CommonJS的模块规范 

(1)模块引用		var math = require('math');					在CommonJS规范中,存在require()方法,这个方法接受模块标识,以此引入一个模块的API
到当前上下文中。

(2)模块定义
				exports对象用于当前模块的方法或变量,并且它是唯一的导出出口。在模块中,还存在
一个module对象,它代表模块自身,exports是module的属性。
在node中一个文件就是一个模块,将方法挂在export对象上作为属性即可导出此方法。					// math.js
exports.add = function () {
   var sum = 0,
   i = 0,
   args = arguments,					   l = args.length;
while (i < l) {					    sum += args[i++];					            }
     return sum;};

引入模块
				在另一个文件中,我们通过require()引入模块后,就能使用定义的属性或方法					// program.js
var math = require('math');				exports.increment = function (val) {					return math.add(val, 1);
};

(3)模块标识
模块标识其实就是通过require(“模块”)传递的参数,参数的命名必须符合驼峰命名的字符串,或以./,../;命名的相对路径或绝对路径


模块的定义与引用图解

  


5、node模块的实现

从图中我们可以发现node的模块化,无非就是通过export 和require()和module,但是实现起来却非常的麻烦。

(1)模块引入需要经历的过程

路径分析  =>  文件定位 => 编译执行

关于node在执行(文件模块)路径分析、文件定位和编译过程深度理解需要C/C++语言基础,初学者建议浅出就可以了

(2)模块的分类 

①核心模块:node提供的模块

在node服务启动过程中会被优先加载进入内存,省略路径分析和文件的定位过程,加载速度是最快的!

②文件模块:用户编写的模块

文件模块是动态加载,需要完整的  路径分析、文件定位和编译执行,相对核心模块执行速度较慢!

(3)缓存优先

node会对引入的模块(核心+文件)都会进行缓存,无论是加载核心模块还是文件模块都会以缓存优先加载。

(4)核心模块有哪些

HTTP 模块 、URL 模块、Fs 模块都是 nodejs 内置的核心模块,可以直接引入使用。

基本使用

1,使用http模块的时候,首先需要引入该模块

2,然后使用createServer创建一个服务器,

3,并且监听端口

最后运行程序:打开终端,切换到文件的根目录,执行命令node 文件名再回车就可以了。

程序启动后,在浏览器中打开http://localhost:8888/,就会在终端中看到相关的打印

此时,我们会发现浏览器的地址栏出一直处于加载状态,因此需要在服务器的回调函数中执行end方法来是web服务器停止处理脚本并返回当前结果。

另外,在上面,我们使用的是默认的localhost,但是有的时候,localhost是被占用了,需要使用其他的IP来运行,只需要在监听端口处添加IP作为第二个参数就可以了。

这里默认会有两个请求,第二个是地址栏图标的请求。

添加响应

在上面的回调函数中使用到了两个参数:req表示请求,res表示响应,如果要给请求添加响应,首先需要设置一个响应头,在这个响应头中指定http状态码,文件类型和字符集

然后使用write添加响应内容

完整代码如下

既然req是表示请求,里面最重要的就是req.url了,通过req.url拿到了用户的请求地址后,如何解析出我们想要的数据,就需要用到URL模块了。

具体使用参考:www.cnblogs.com/yuyujuan/p/…