JSON

Node.js学习之模块化机制原理详解(3)

字号+ 作者:H5之家 来源:H5之家 2017-02-18 16:03 我要评论( )

2 )路径形式的文件模块:以 . || .. || / 开始的标识符,都会被当做文件模块来处理。在加载的过程中, require 方法会将路径转换为真实的路径,加载速度仅次于核心模块 3 ) 非路径形式的自定义模块:这是一种特殊

2)路径形式的文件模块:以 . || .. || / 开始的标识符,都会被当做文件模块来处理。在加载的过程中,require方法会将路径转换为真实的路径,加载速度仅次于核心模块

3) 非路径形式的自定义模块:这是一种特殊的文件模块,可能是一个文件或者包的形式。查找这类模块的策略类似于JS中作用域链,Node会逐个尝试 模块路径 中的路径,直到找到目标文件为止。

模块路径: 这是Node在定位文件模块的具体文件时指定的查找策略,具体表现为一个路径组成的数组。

可以在REPL环境中输出Module对象,查看其path属性的方式查看上述数组

文件定位:

文件扩展名分析

require()分析的标识符可以不包含扩展名,node会按.js.node.json的次序补足扩展名,依次尝试

目标分析和包

如果在扩展名分析的步骤中,查找不到文件而是查找到相应目录,此时node会将目录当做包来处理,进行下一步分析查找当前目录下package.json中的main属性指定的文件名,若查找不成功则依次查找index.js,index.node,index.json

如果目录分析的过程中没有定位到任何文件,则自定义模块会进入下一个模块路径继续查找,直到所有的模块路径都遍历完毕,依然没找到则抛出查找失败的异常。

参考源码

Module._load方法的内部调用了Module._findPath这个方法,这个方法是用来返回模块的绝对路径的,源码如下:

Module._findPath = function(request, paths) {

// 列出所有可能的后缀名:.js.json, .node

var exts = Object.keys(Module._extensions);

// 如果是绝对路径,就不再搜索

if (request.charAt(0) === \'/\') {

paths = [\'\'];

}

// 是否有后缀的目录斜杠

var trailingSlash = (request.slice(-1) === \'/\');

// 第一步:如果当前路径已在缓存中,就直接返回缓存

var cacheKey = JSON.stringify({request: request, paths: paths});

if (Module._pathCache[cacheKey]) {

return Module._pathCache[cacheKey];

}

// 第二步:依次遍历所有路径

for (var i = 0, PL = paths.length; i < PL; i++) {

var basePath = path.resolve(paths[i], request);

var filename;

if (!trailingSlash) {

// 第三步:是否存在该模块文件

filename = tryFile(basePath);

if (!filename && !trailingSlash) {

// 第四步:该模块文件加上后缀名,是否存在

filename = tryExtensions(basePath, exts);

}

}

// 第五步:目录中是否存在 package.json

if (!filename) {

filename = tryPackage(basePath, exts);

}

if (!filename) {

// 第六步:是否存在目录名 + index + 后缀名

filename = tryExtensions(path.resolve(basePath, \'index\'), exts);

}

// 第七步:将找到的文件路径存入返回缓存,然后返回

if (filename) {

Module._pathCache[cacheKey] = filename;

return filename;

}

}

// 第八步:没有找到文件,返回false

return false;

};

3、清除缓存

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • JSON学习之完全手册图文

    JSON学习之完全手册图文

    2017-01-12 18:01

  • golang学习之html json解析

    golang学习之html json解析

    2016-10-30 12:00

  • Unity3D学习之使用 C#合成解析XML与JSON.doc.doc

    Unity3D学习之使用 C#合成解析XML与JSON.doc.doc

    2016-06-11 12:00

  • json学习之三:JSONArray的应用

    json学习之三:JSONArray的应用

    2016-01-30 12:32

网友点评
t