node加载模块顺序

标签: node module CommonJS
6人阅读 评论(0) 收藏 举报
分类:
当require('xxx')一个模块时,
  • 优先加载核心模块;
  • 以路径形式加载文件模块:
  1. 如果显示指定文件模块扩展名,则在该路径下查找该模块是否存在; 
  2. 如果未显示指定文件模块扩展名,则在该路径下,依次查找以.js、.json、.node为扩展名的模块是否存在;
  • 既不是核心模块,又不是以路径形式表示的模块:
表示该模块一个位于各级node_modules目录的已安装模块(全局安装或局部安装),则首先在当前目录的node_modules目录中查找该模块是否存在,若不存在,则继续在其父目录的node_modules目录中查找,反复执行这一过程,直到根目录为止。
  1. 从module path数组中取出第一个目录作为查找基准。
  1. 直接从目录中查找该文件,如果存在,则结束查找。如果不存在,则进行下一条查找。
  1. 尝试添加.js、.json、.node后缀后查找,如果存在文件,则结束查找。如果不存在,则进行下一条。.js件会以文本格式的JavaScript脚本文件解析,.json文件会以JSON格式的文本文件解析,.node文件会以编译后的二进制文件解析。
  1. 尝试将require的参数作为一个包来进行查找,读取目录下的package.json文件,取得main参数指定的文件。
  1. 尝试查找该文件,如果存在,则结束查找。如果不存在,则进行第3条查找。
  1. 如果继续失败,则取出module path数组中的下一个目录作为基准查找,循环第1至5个步骤。
  1. 如果继续失败,循环第1至6个步骤,直到module path中的最后一个值。
  2. 如果仍然失败,则抛出异常。
如果想得到require命令加载的确切文件名,使用require.resolve()方法。 require.resolve('server')

当require(‘othermodule’)时:
查看node安装目录,判断是不是核心模块
---------------------------------------
check /usr/local/lib/node/bar.js
---------------------------------------
当前目录:
---------------------------------------
check /home/somebody/node_modules/othermodule
check /home/somebody/node_modules/othermodule.js
check /home/somebody/node_modules/othermodule.json
check /home/somebody/node_modules/othermodule.node
---------------------------------------
if /home/somebody/node_modules/othermodule/package.json exists
check /home/somebody/node_modules/othermodule/package.json[main]
---------------------------------------
if /home/somebody/node_modules/othermodule/index.js exists
check /home/somebody/node_modules/othermodule/index.js
---------------------------------------
if /home/somebody/node_modules/othermodule/index.node exists
check /home/somebody/node_modules/othermodule/index.node
---------------------------------------

父级目录:
check /home/node_modules/othermodule
check /home/node_modules/othermodule.js
check /home/node_modules/othermodule.json
check /home/node_modules/othermodule.node
---------------------------------------
if /home/node_modules/othermodule/package.json exists
check /home/node_modules/othermodule/package.json[main]
---------------------------------------
if /home/node_modules/othermodule/index.js exists
check /home/node_modules/othermodule/index.js
---------------------------------------
if /home/node_modules/othermodule/index.node exists
check /home/node_modules/othermodule/index.node
---------------------------------------

根目录:
check /node_modules/othermodule
check /node_modules/othermodule.js
check /node_modules/othermodule.json
check /node_modules/othermodule.node
---------------------------------------
if /node_modules/othermodule/package.json exists
check /node_modules/othermodule/package.json[main]
---------------------------------------
if /node_modules/othermodule/index.js exists
check /node_modules/othermodule/index.js
---------------------------------------
if /node_modules/othermodule/index.node exists
check /node_modules/othermodule/index.node
---------------------------------------

由环境变量指定的$NODE_PATH路径中查找(全局安装的模块):
for each $PATH in $NODE_PATH

---------------------------------------
if $PATH/package.json exists
check $PATH/package.json[main]
---------------------------------------
if $PATH/index.js exists
check $PATH/index.js
---------------------------------------
if $PATH/index.node exists
check $PATH/index.node
---------------------------------------
if $HOME/.node_modules/package.json exists
check $HOME/.node_modules/package.json[main]
---------------------------------------
if $HOME/.node_modules/index.js exists
check $HOME/.node_modules/index.js
---------------------------------------
if $HOME/.node_modules/index.node exists
check $HOME/.node_modules/index.node
---------------------------------------
if $HOME/.node_libraries/package.json exists
check $HOME/.node_libraries/package.json[main]
---------------------------------------
if $HOME/.node_libraries/index.js exists
check $HOME/.node_libraries/index.js
---------------------------------------
if $HOME/.node_libraries/index.node exists
check $HOME/.node_libraries/index.node
---------------------------------------
if $PREFIX/lib/node/package.json exists
check $PREFIX/lib/node/package.json[main]
---------------------------------------
if $PREFIX/lib/node/index.js exists
check $PREFIX/lib/node/index.js
---------------------------------------
if $PREFIX/lib/node/index.node exists
check $PREFIX/lib/node/index.node

$HOME为当前用户的根目录,$PREFIX通过node_prefix来配置。

参考:https://www.cnblogs.com/joyeecheung/p/3941705.html

查看评论

webpack模块打包工具教程

-
  • 1970年01月01日 08:00

Node.js模块加载顺序

Node.js模块分为核心模块和文件模块; 核心模块是Node.js标准API中提供的模块,可以直接通过require获取; 文件模块是存储为单独的文件的模块,可以是javascript代码、Json...
  • weixin_41458700
  • weixin_41458700
  • 2018-01-08 10:24:13
  • 124

node.js 加载mysql模块问题

最近在学习node.js,学到node.js连接mysql数据库时出现了cannot find module 'mysql'问题,网上搜发现是自己没有安装mysql模块。 安装mysql模块步骤: 打...
  • firstblog
  • firstblog
  • 2017-11-04 17:54:28
  • 206

nodejs 模块加载机制

Nodejs拥有一套简单的模块加载系统,在Nodejs里面文件和模块是一一对应的关系。例如:foo.js加载了同一个目录下的circle.js文件。 circle.js文件内容: const PI...
  • lc598470345
  • lc598470345
  • 2016-05-27 23:12:54
  • 4417

Node.js的模块载入方式与机制

文章转载: http://www.cnblogs.com/snandy/p/3445550.html http://www.infoq.com/cn/articles/nodejs-module-...
  • shmnh
  • shmnh
  • 2014-12-18 07:39:11
  • 3004

NodeJS 中模块module查找过程

最近开始学习Nodejs, 对于其中module的引用大家应该比较熟悉,就是JS中的eRequire 关键字,如果没有module的路径,Node中会去怎样找到这个引用呢? 例如:var m=req...
  • w_vc_love
  • w_vc_love
  • 2016-04-12 22:40:28
  • 2253

nodejs 加载模块

function hello(){ var name; this.setName = function(n){ name = n; } this.sayHello = function()...
  • xiuye2015
  • xiuye2015
  • 2016-03-25 19:47:19
  • 342

Node.js如何把单个文件夹作为模块加载以及模块缓存

问题1:利用package.json来指定文件夹   package.json中内容如下: { "name" : "some-library", "main" : "./lib/hello.j...
  • liangklfang
  • liangklfang
  • 2016-03-26 11:13:58
  • 1596

【重拾】nodeJS模块查找

写在前面为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个...
  • u011413061
  • u011413061
  • 2015-12-15 10:34:42
  • 750

NodeJs模块加载机制

NodeJs模块加载方法require(‘模块路径’); 查找机制 按照文件名进行查找 如:require(‘./1’); 则会查找是否存在文件名为1的文件,若没有找到则进行第二步 向文件名后添...
  • cendy991
  • cendy991
  • 2016-08-28 13:44:07
  • 619
    个人资料
    等级:
    访问量: 47
    积分: 60
    排名: 162万+
    文章存档