模块
Posted TT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块相关的知识,希望对你有一定的参考价值。
模块加载流程
在Node中引入模块,需要经历如下3个步骤
1.路径分析
2.文件定位
3.编译执行
模块种类
在Node中,模块分为两类,一类是Node提供的模块,称为核心模块,一类是用户编写的,称为文件模块
核心模块在Node源码编译过程中,编译进了二进制执行文件。在Node进程启动时,部分核心模块就被直接加载到了内存中,所以在引入时,文件定位和编译执行的步骤省略了,并在路径分析时优先判断,所以速度快
文件模块则是动态加载的,需要完整的路径分析、文件定位、编译执行过程,速度比加载核心模块要慢
模块缓存
Node对于引入过的模块都会进行缓存,以减少二次引入时的开销,且缓存的是编译和执行之后的对象,不论是哪种模块,require()对相同模块的二次加载都一律采用缓存优先的方式,核心模块缓存检查优先文件模块
路径分析和文件定位
require接收一个标识符作为参数,标识符主要分为一下几类:
1 核心模块,如http、fs、path
2 .或..开始的相对路径文件模块
3 以/开始的绝对路径文件模块
4 非路径形式的文件模块,如自定义的模块(如node_modules中的,查找速度最慢)
自定义模块
node_modules中的都是自定义模块
自定义模块的引入会沿着当前目录逐级向上层找node_modules,有点类似原型链查找,所以路径越深,查找模块越耗时
// [ // \'e:\\\\nodejs\\\\node_modules\', // \'e:\\\\node_modules\' // ] module.paths
文件扩展名分析
require在分析标识符的过程中,若无扩展名,会按照.js .json .node次序补足,依次尝试
目录和包分析
在分析标识符过程中,require通过分析文件扩展名之后,可能没有查找到对应文件,但却得到一个目录,此时会当做包来处理。
1.首先查找package.json中的main属性,对指定文件名进行定位,若缺少文件名,则进入扩展名分析,若main中指定的文件若无,或压根就没有package.json文件,Node会将index当做默认文件名
2..然后依次查找index.js index.json index.node,若还是没有定位到文件,则进入下一个模块路径查找,若最终依然没有查找到目标文件,抛出异常
以上是关于模块的主要内容,如果未能解决你的问题,请参考以下文章
CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法(代码片段