一、非核心模块加载路径搜索顺序分析

假设样本代码文件路径为:g:\testroom\nodepath\index.js

//返回搜索somemodule模块的路径列表
let modulePahts = require.resolve.paths('somemodule');
console.log(modulePahts);

windows下在cmd中并进入g:\testroom\nodepath\目录执行:

​# 设置 NODE_PATH 环境变量
set NODE_PATH=e:\
node index.js​

打印结果如下:

['G:\\Testroom\\nodepath\\node_modules','G:\\Testroom\\node_modules','G:\\node_modules','e:\\','C:\\Users\\Administrator\\.node_modules','C:\\Users\\Administrator\\.node_libraries','C:\\Program Files\\nodejs\\lib\\node'
]

可以分析出:

非核心模块加载搜索路径顺序为:

./node_modules->..遍历至根目录... -> NODE_PATH目录 -> 全局目录

二、Nodejs模块加载的完整搜索顺序说明

2.1 缓存  
模块在第一次加载后会被缓存。 这也意味着(类似其他缓存机制)如果每次调用 require(‘foo’) 都解析到同一文件,则返回相同的对象。

2.2 核心模块
核心模块定义在 Node.js 源代码的 lib/ 目录下。

require() 总是会优先加载核心模块。 例如, require(‘http’) 始终返回内置的 HTTP 模块,即使有同名文件。

2.3 文件模块
如果按确切的文件名没有找到模块,则 Node.js 会尝试带上 .js、 .json 或 .node 拓展名再加载。

当没有以 '/'、 './' 或 '../' 开头来表示文件时,这个模块必须是一个核心模块或加载自 node_modules 目录。

2.4 目录作为模块
可以把程序和库放到一个单独的目录,然后提供一个单一的入口来指向它。 把目录递给 require() 作为一个参数,有三种方式。

第一种方式是在根目录下创建一个 package.json 文件,并指定一个 main 模块。
例子, package.json 文件类似:

{ "name" : "some-library","main" : "./lib/some-library.js"
}

如果这是在 ./some-library 目录中,则 require(’./some-library’) 会试图加载 ./some-library/lib/some-library.js。

这就是 Node.js 处理 package.json 文件的方式。

如果目录里没有 package.json 文件,或者 ‘main’ 入口不存在或无法解析:
则 Node.js 将会试图加载目录下的 index.js 或 index.node 文件。
例如,如果上面的例子中没有 package.json 文件,则 require(’./some-library’) 会试图加载:

./some-library/index.js
./some-library/index.node

如果这些尝试失败,则 Node.js 将会使用默认错误报告整个模块的缺失:

Error: Cannot find module 'some-library'

2.5 node_modules 目录加载
如果传递给 require() 的模块标识符不是一个核心模块,也没有以 '/' 、 '../' 或 './' 开头,则 Node.js 会从当前模块的父目录开始,尝试从它的 ./node_modules 目录里加载模块。 Node.js 不会附加 node_modules 到一个已经以 node_modules 结尾的路径上。

如果还是没有找到,则移动到再上一层父目录,直到文件系统的根目录。

例子,如果在 ‘/home/nodetest/projects/foo.js’ 文件里调用了 require(‘bar.js’),则 Node.js 会按以下顺序查找:

/home/nodetest/projects/node_modules/bar.js
/home/nodetest/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js

2.6 从全局目录加载
2.6.1 NODE_PATH环境变量检索
如果 NODE_PATH 环境变量被设为一个以冒号分割的绝对路径列表,则当在其他地方找不到模块时 Node.js 会搜索这些路径。

windows:

set NODE_PATH=c:\

UNIX/Linux

export NODE_PATH=.

虽然NODE_PATH可以指定特殊路径(例如SET NODE_PATH=C:\,这样会检索C盘),但是一般不建议使用。

2.6.2 其他全局目录
Node.js 还会搜索以下的全局目录列表:

1: $HOME/.node_modules
2: $HOME/.node_libraries
3: $PREFIX/lib/node

nodejs的require加载模块的路径搜索顺序说明相关推荐

  1. nodejs探秘:require加载模块的原理及代码实现

    最近因为项目需要使用nodejs,因此不得不对其进行学习研究.一番深入后发现,nodejs除了好用,作为后台效率非常高之外,它自身的设计堪称精妙.我们都知道学习的一种有效方式就是看牛逼人物是怎么打造牛 ...

  2. Nodejs之require加载机制(模块可以污染全局空间)

    以前就觉得Nodejs的MooTools库很奇怪,因为用他的时候,不需要把require的返回值保存起来,今天实在憋不住,就研究了下,对NodeJs的require机制又有了几分深刻的理解. MooT ...

  3. Javascript 的模块化编程及加载模块【转载+整理】

    http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 本文内容 引入 模块化 最初写法 对象写法 立即执行函数写法 放大模式 宽放 ...

  4. ArcGIS中加载模块时dojo/domReady!和dojo/ready的区别

    我们在使用ArcGIS Javascript  API开发时,最开始要先加载模块: <script>require(["esri/map", "dojo/do ...

  5. 无法加载模块:public_Lua模块与包

    --[[ 模块是类似于一个封装库,Lua5.1开始,Lua加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以API的接口形式在其他地方调用 Lua的模块是由变量.函数等元素组成的tabl ...

  6. 模块化加载_webpack模块化原理-异步加载模块

    在上篇文章中,我们介绍了 webpack 同步加载模块的原理.这篇文章,我们来介绍一下 webpack 异步加载模块. 异步加载模块 还是先做一些准备工作. 首先定义一个依赖模块:math.js,ma ...

  7. vue脚手架图片懒加载模块和样式穿透

    1.vue样式穿透 vue样式穿透:在样式隔离的前提下,在父组件中修改子组件样式 正常情况下,在样式隔离的前提下,父标签不能修改子组件样式.如果想修改子组件样式,使用样式穿透 1.1 样式穿透语法结构 ...

  8. thinkphp pathinfo nginx 无法加载模块:Index

    thinkphp 报了 无法加载模块:Index 错误位置 FILE: /var/multrix/wxactivity_archive/ThinkPHP/Library/Think/Dispatche ...

  9. go加载python_人生苦短我用python(02)动态加载模块-Go语言中文社区

    文章内容为原创,欢迎转载请注明出处 作者: EflyPro->晦明禅师 文章来源:公众号"睿江云计算" 继第一期[人生苦短我用Python系列专栏]发布后,深受广大睿普迷的一 ...

最新文章

  1. 【青少年编程】【二级】绘制图形
  2. php神盾 var 1.54,PHP变量可用字符 - 神盾加密解密教程(一)
  3. OIer同样是音乐家
  4. thinkphp框架使用心得
  5. 云计算的8个常见用途
  6. [转帖]Mootools源码分析-03 -- Hash
  7. (计算机组成原理)第三章存储系统:本章习题
  8. 深度学习时代的计算机视觉
  9. CCF201812-1 小明上学
  10. centos6.5 最小化安装无法上网
  11. Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计...
  12. 浏览器重定向(302)次数限制问题
  13. 如何使用nodejs的镜像下载
  14. (一)ROS中新建机器人模型(urdf格式)并用rviz显示
  15. 马尔可夫决策过程和贝尔曼方程
  16. vue 省市区选择插件v-distpicker设置初值与选择后触发方法
  17. Orthogonal Convolutional Neural Networks
  18. 关于支付宝申请APP支付和网页支付在申请时需要的材料
  19. UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 8: illegal multibyte sequence
  20. Day66 Web开发7 旅游详情页面

热门文章

  1. 饥荒联机版服务器启动慢_饥荒联机版大型攻略——航海篇
  2. 基于K-means算法的数码迷彩生成——python实现
  3. 数学建模酶促反应matlab求解,数学建模——酶促反应论文.doc
  4. Android MediaPlayer 播放器网络音频播放总结
  5. 谈区块链在娱乐产业的应用
  6. 小白学数据_|_28张小抄表大放送:Python,R,大数据,机器学习
  7. 使用Dataprep进行自动化的探索性数据分析
  8. seq2seq机器翻译
  9. 【职场沟通课】(3)| 万能沟通、沟通禁区、危机中的沟通
  10. face detection[FaceBoxes]