[关闭]
@JRuiCoder 2015-11-22T14:42:15.000000Z 字数 1122 阅读 1622

Nodejs

Nodejs


一、JavaScript缺点

javascript天生缺乏的功能:模块,人们使用命名空间等方式人为地约束代码。
- 没有模块系统
- 标准库较少
- 没有标准接口
- 缺乏包管理系统:没有自动加载和安装依赖的能力
CommonJS API写出的应用可以具备跨宿主环境执行的能力。可以开发富客户端应用,还可以编写以下应用
- 服务器端JavaScript应用程序
- 命令行工具
- 桌面图形界面应用程序
- 混合应用

二、CommonJS的模块规范

模块应用

  1. var math=require('math');

模块定义

  1. //math.js
  2. exports.add=function(){
  3. //语句
  4. }

exports对象用于导出当前模块的方法或者变量,在另一个文件使用require()方法引入模块后,就能调用定义的属性或方法了。
模块标示
指传递给require()方法的参数,必须是符合小驼峰命名的字符串,或只是...开头的相对路径或准则绝对路径,后缀可省略。

三、Node的模块实现

Node有两类模块,一类是Node提供的模块,称为核心模块,加载速度较快,另一类是用户编写的模块,称为文件模块。

1、优先从缓存加载

Node缓存的是变异和执行之后的对象,二次加载一律采用缓存优先的方式,这是第一优先级。

2、路径分析和文件定位

a、模块标识符分析
b、路径形式的文件模块
c、自定义模块,非核心模块。模块路径是NOde在定位文件模块的具体文件时制定的查找策略。

3、文件定位

文件扩展名分析:.js .json .node的次序补充拓展名
,调用过程中需要调用fs模块同步阻塞式地判断文件是否存在。
目录分析和包。

4、模块编译

每一个编译成功的模块都将会将其温江路径作为索引缓存在Module._cache对象上
可以对自定义的扩展名进行特殊的加载,可以通过类似require.extensions['.ext']的方式进行加载,但是不鼓励,因为不希望将繁琐的编译加载等过程引入Node的执行过程中。
a、JavaScript模块的编译
在编译过程中,对获取的JavaScript文件内容进行了头尾包装

  1. (function(exports,require,module,_filename,_dirname){\n,在尾部添加了\n})

作用域隔离,包装之后的代码通过VM原生模块的runInThisContext()方法执行,
b.C/C++模块的编译
Node调用process.dlopen()方法进行加载和执行。
c. JSON文件的编译
利用fs模块同步读取JSON文件的内容之后,调用JSON.parse()方法得到对象。

三、核心模块

C、C++编写的放在src目录下,JavaScript文件放在lib目录下。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注