• NodeJS 86 0 1 发布

    Node.js 加载一个模块主要遵循以下步骤:

    解决(Resolving) 加载(Loading)包装(Wrapping) 评价(Evaluating) 缓存(Caching)Resolving

    NodeJS中的模块与文件系统中的文件一一对应。模块加载的过程其实就是找到该模块文件然后执行文件里的脚本并将结果载入内存的过程。

    模块的ID被定义成其对应的文件在文件系统中的绝对路径,这保证了同一个物理模块即使被不同的模块以不同的相对路径方式引用,最终也只会被加载一次。
    Resolving 阶段的工作就是把require 的字符串解析成一个文件系统中的绝对路径。

    有以下三类模块:

    核心模块
    也即 Node.js 内置的模块,例如 “fs”、”path”、”url” 等,这类模块无需安装即可直接使用。路径形式的文件模块
    以"."、".."开头和"/"开始的标识符,这里都被当作文件模块来处理。require()方法会将路径转为文件系统里的绝对路径,第三方依赖模块如果不是前两种情况,那么 Node.js 会依次查找 module.paths 列表中的目录是否存在。主要是从当前目录逐级向上查找 node_modules 目录。

    另外,模块与文件的映射还遵循以下规则,以require("module1")为例:

    如果查找目录下存在module1.js文件,那么这个文件就是最终加载的文件如果查找目录下存在module1子目录,且该子目录下存在index.js文件,那么这个index.js文件就是最终加载的文件如果查找目录下存在module1子目录,且该目录下存在一个 package.json 文件,该 JSON 对象上存在一个 main 属性,那么这个 main 属性的值就是最终加载的文件的路径。Loading

    Resolving阶段找到模块的文件之后,Loading阶段负责加载该模块的内容。除了一般的JS模块,NodeJS还支持其他几类文件模块。

    这几类件模块以后缀来区分,Node.js会根据后缀名来决定加载方法。

    .js。通过fs模块同步读取js文件并编译执行。.node。通过C/C++进行编写的Addon。通过dlopen方法进行加载。.json。读取文件,调用JSON.parse解析加载。

    Wrapping

    Wrapping阶段主要实现两个功能:

    为每个模块提供各自隔离的作用域为每个模块注入I/F参数(require / module / exports)以及模块的自身信息(__filename 和 __dirname)

    Node.js 的具体做法是把我们模块的代码包裹在一个函数内,需要注入的信息则作为函数参数传递进来。

    以app.js为例,Wrapping之后的样子如下:

    (function (exports, require, module, __filename, __dirname) { //app.js source begin var sub = require('./sub.js'); console.log('App:' +); //app.js source end });

    Evaluating

    Evaluating这一步其实就是执行 Wapping阶段Warp 出来的函数,传入适当的参数。执行完成后,module.exports 上就是这个模块要对外部暴露的内容了。

    Caching

    最后的这个Caching阶段就是将加载完的模块缓存起来,当下次再一次 require 该模块时 Node.js 会直接返回缓存中的模块。

    Node.js 会将模块缓存在 require.cache 对象上。

热门总结

  • NodeJS 86 0 1 发布

    Node.js 加载一个模块主要遵循以下步骤:

    解决(Resolving) 加载(Loading)包装(Wrapping) 评价(Evaluating) 缓存(Caching)Resolving

    NodeJS中的模块与文件系统中的文件一一对应。模块加载的过程其实就是找到该模块文件然后执行文件里的脚本并将结果载入内存的过程。

    模块的ID被定义成其对应的文件在文件系统中的绝对路径,这保证了同一个物理模块即使被不同的模块以不同的相对路径方式引用,最终也只会被加载一次。
    Resolving 阶段的工作就是把require 的字符串解析成一个文件系统中的绝对路径。

    有以下三类模块:

    核心模块
    也即 Node.js 内置的模块,例如 “fs”、”path”、”url” 等,这类模块无需安装即可直接使用。路径形式的文件模块
    以"."、".."开头和"/"开始的标识符,这里都被当作文件模块来处理。require()方法会将路径转为文件系统里的绝对路径,第三方依赖模块如果不是前两种情况,那么 Node.js 会依次查找 module.paths 列表中的目录是否存在。主要是从当前目录逐级向上查找 node_modules 目录。

    另外,模块与文件的映射还遵循以下规则,以require("module1")为例:

    如果查找目录下存在module1.js文件,那么这个文件就是最终加载的文件如果查找目录下存在module1子目录,且该子目录下存在index.js文件,那么这个index.js文件就是最终加载的文件如果查找目录下存在module1子目录,且该目录下存在一个 package.json 文件,该 JSON 对象上存在一个 main 属性,那么这个 main 属性的值就是最终加载的文件的路径。Loading

    Resolving阶段找到模块的文件之后,Loading阶段负责加载该模块的内容。除了一般的JS模块,NodeJS还支持其他几类文件模块。

    这几类件模块以后缀来区分,Node.js会根据后缀名来决定加载方法。

    .js。通过fs模块同步读取js文件并编译执行。.node。通过C/C++进行编写的Addon。通过dlopen方法进行加载。.json。读取文件,调用JSON.parse解析加载。

    Wrapping

    Wrapping阶段主要实现两个功能:

    为每个模块提供各自隔离的作用域为每个模块注入I/F参数(require / module / exports)以及模块的自身信息(__filename 和 __dirname)

    Node.js 的具体做法是把我们模块的代码包裹在一个函数内,需要注入的信息则作为函数参数传递进来。

    以app.js为例,Wrapping之后的样子如下:

    (function (exports, require, module, __filename, __dirname) { //app.js source begin var sub = require('./sub.js'); console.log('App:' +); //app.js source end });

    Evaluating

    Evaluating这一步其实就是执行 Wapping阶段Warp 出来的函数,传入适当的参数。执行完成后,module.exports 上就是这个模块要对外部暴露的内容了。

    Caching

    最后的这个Caching阶段就是将加载完的模块缓存起来,当下次再一次 require 该模块时 Node.js 会直接返回缓存中的模块。

    Node.js 会将模块缓存在 require.cache 对象上。