您的位置:首页 > Web前端 > Node.js

【深入浅出node.js】读书摘录2 - node.js模块机制

2015-04-05 10:44 696 查看

第二章、模块机制

1. CommonJs规范的目的是希望JavaScript能够在任何地方运行

2. 一直以来,JavaScript存在的缺陷有:

(1)、没有模块系统

(2)、标准库较少

(3)、没有标准接口

(4)、缺乏包管理系统

CommonJS规范的提出,是为了弥补当前JavaScript没有标准的缺陷,以达到向Python、Ruby和Java具备开发大型应用的基础能力,而不是停留在小脚本程序的阶段。它们期望用CommonJS API写出的应用可以具备跨宿主环境执行的能力,使得Javascript可以开发服务器端Javascript应用、命令行应用、桌面图形界面应用程序、混合应用等。

3. TODO(CommonJS规范,查阅相关文档)

CommonJs规范涵盖了模块、二进制、Buffer、字符集编码、I/O流、进程环境、文件系统、套接字、单元测试、Web服务器网关接口、包管理等

4、CommonJs的模块规范.

CommonJS对模块的定义非常简单:包含了模块引用、模块定义、模块标识等3个部分。

Var math = require(‘math’);



将方法挂载在exports对象上作为属性可以定义导出的方式.

exports.add = function(){

}

每个模块都有自己独立的空间,它们互不干扰。

5、Node中引用模块,需要经历路径分析、文件定位、编译执行等3个步骤。

在Node中,模块分为两大类:一类是Node提供的模块,称为核心模块,另一类是用户编写的模块,称为文件模块。核心模块在Node源代码的编译过程中,编译进了二进制可执行文件。Node进程启动时,部分核心模块被直接加载进内存中,所以这部分核心模块引入时,文件定位和编译执行这两个步骤可以省略掉,并且在路径分析中优先判断,所以它的加载速度是最快的。文件模块则是在运行时动态加载,需要完整的路径分析,文件定位、编译执行等过程,速度比核心模块慢。

6、在模块加载的过程中,Node会优先从缓存加载,而且核心模块的缓存检查优先于文件模块的缓存检查。从缓存加载的优化策略使得二次引入时不需要路径分析、文件定位和编译执行的过程,大大提高了再次加载模块的效率。

7、require Node模块的几种方式(路径分析)

(1)、核心模块如fs,http, path等

(2)、以.或者..开始的相对路径

(3)、绝对路径

(4)、非路径形式的模块

8、可以用strace等追踪Node文件模块的路径分析和加载过程:

Strace –o trace –p node module.js

Node对文件模块的路径分析过程是从当前路径开始,逐级向上查找,直至查找到模块或者根目录

9、require Node模块的过程中,会出现标识符中不包含文件扩展名的情况。Node会按照.js, .node, .json的次序补充。在尝试的过程中,需要调用fs模块同步阻塞地判断文件是否存在,由于Node是单线程的,所以会有一定的性能问题。一个小诀窍是,在require文件模块的时候,带上模块的扩展名。

10、在编译的过程中,Node对获取的javascript文件内容进行了包装,生成的内容类似于:

(function( exports, require, module,__filename, __dirname ){

varmath = require('math');

exports.area= function( radius ){

returnMath.PI * radius * radius;

};

});

这样每一个模块都进行了作用域的隔离,不至于污染全局变量。

11、Node对.json文件的编译最简单:Node通过fs模块同步读取JSON文件的内容之后,调用JSON.parse方法得到对象。JSON文件在用做项目的配置文件时比较有用,如果你定义了一个json文件作为配置,那么不必调用fs去异步读取和解析,直接调用require引入即可。

12、Node对模块规范的实现,在一定程度上解决了变量依赖、依赖关系等代码组织性问题。而包的出现,则在模块的基础上进一步组织了Javascript代码。

13、Node包管理工具NPM
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: