STPace's Studio.

《深入浅出NodeJS》读书笔记

Word count: 1,039 / Reading time: 4 min
2018/07/08 Share

第二章 模块机制

  • CommonJS组织和W3C组织分别提出各自的规范以应用于不同的场景需求中。commonJS以 ECMAScript 为语言基础,添加了fs tcp stream buffer等构成了nodeJSw3c同样以 ECMAScript 为语言基础,添加了BOMDOM支撑了现在浏览器的技术。
  • NodeJS 的模块引入有 3 个步骤,路径分析,文件定位,编译执行。
  • 核心模块在 node 进程启动时直接加在进内存中,忽略文件定位和编译执行两个步骤。
  • 核心模块语与文件模块都有优先从缓存加载的机制。且缓存的是编译执行后的对象。
  • 引入模块的 require() 方法接收的参数成为标识符,标识符最快的为核心模块,文件模块由快到慢分别是.或..开始的相对路径和/开始的绝对路径非路径形式
  • 非路径形式的文件模块标识符,会由内向外沿路径向上直至根目录在不同层级的 node_modules 文件中查找。
  • 标识符不写扩展名则会依次按照js node json补齐尝试文件定位。
  • 若补齐扩展名后未找到文件,则将该路径标识符当做目录看,node 将目录当一个包处理。会在 package.json 查找 main 属性进行文件定位,若无,会依次在该目录下查找index.js index.node index.json

JavaScript 模块的包装

  • Javascript 模块在编译的过程中会对文件进行头尾包装,
    头部添加 (function(exports, require, module, __filename, __dirname){
    尾部添加 })
  • 这样通过函数将原文件包起来,形成模块自身作用域。通过函数参数将 exports require module 等这些变量传给模块。
  • 模块内部将需要导出的方法赋值给 exports 的属性,返回给该模块的调用方,调用方可调用该模块 exports 上的任何属性,不能直接操作模块内部方法,这样就形成了 Node 的 commonJS 规范。

module.exports 与 exports

node 模块之间的关系

node 所有模块分为文件模块和核心模块,第三方开发者编写的都是文件模块,最最重要的就是核心模块。

核心模块中一部分时 js 编写的,还有一部分时用 C++编写。通常为非常重要的功能模块或需要跟底层打交道的模块;

文件模块中页根据编写语言分为 js 模块和 C++扩展模块;

js 核心模块中会调用 C++核心模块,js 文件模块会调用 C++扩展模块和 js 核心模块,有时也会调用 C++核心模块。

C++核心模块

核心模块中使用 C++编写的模块,一部分是全部由 C++编写,一部分是由 C++编写核心部分,再由 js 进行包装;

全部是 C++编写的模块叫内建模块。

内建模块的优势在两点:

  1. 静态语言的性能优于脚本语言;
  2. 文件编译时内建模块编译成二进制文件,node 执行时就被加载进内存中,直接就可以执行。

C++扩展模块

使用场景:

因为 js 在进行位运算时时先将 double 型数据转成 int 再参照 java 的位运算,所以 js 的位运算效率并不高。

当应用中需要大量位运算(转码/解码)时就需要考虑编写 C++扩展模块来提升性能。

node 包

CommonJS 包规范是理论,NPM 是一种实践;

NPM 完成了第三方模块的发布、安装、依赖。

前后端模块引入加载的不同

  • 前端的瓶颈时带宽,后端的瓶颈时 CPU、内存
  • 前端通过网络加载,后端通过从磁盘中读取
  • 前端模块异步引入,后端模块同步引入

因为同步的方式再前端会造成加载时间过长的情况,CommonJS 规范再前端并不适用,针对前端的应用场景,模块规范有 AMD 和 CMD;

CATALOG
  1. 1. 第二章 模块机制
    1. 1.1. JavaScript 模块的包装
    2. 1.2. module.exports 与 exports
    3. 1.3. node 模块之间的关系
    4. 1.4. C++核心模块
    5. 1.5. C++扩展模块
    6. 1.6. node 包
    7. 1.7. 前后端模块引入加载的不同