分享

node.js require方法加载规则

 流楚丶格念 2022-01-14

require 方法加载规则

优先从缓存加载

如果主文件(main.js)要加载的文件(a.js)已经加载了其他要加载的文件(b.js),那么在主文件(main.js)中不会重复加载,直接会拿到其他要加载的文件(b.js的接口对象)接口对象

如下图所示
在这里插入图片描述

判断加载模块标识

核心模块

核心模块的本质也是文件

核心模块文件已经被编译到了二进制文件中了,我们只需要按照名字来加载就可以了,例如

require('fs')
require('http')

第三方模块

凡是第三方模块都必须通过 npm 来下载

使用的时候就可以通过 require('包名’) 的方式来进行加载才可以使用
不可能有任何一个第三方包和核心模块的名字是一样的
既不是核心模块、也不是路径形式的模块

例如:模板引擎art-template第三方模块

先找到当前文件所处目录中的 node_modules 目录

  • node_modules/art-template
  • node_modules/art-template/package.json 文件
  • node_modules/art-template/package.json 文件中的 main 属性
  • main 属性中就记录了 art-template 的入口模块

然后加载使用这个第三方包
实际上最终加载的还是文件


注意

我们一个项目有且只有一个 node_modules,放在项目根目录中,这样的话项目中所有的子目录中的代码都可以加载到第三方包
不会出现有多个 node_modules

自己写的模块

路径形式的模块:

  • ./ 当前目录,不可省略

  • …/ 上一级目录,不可省略

  • /xxx 几乎不用(例如: d:/a/foo.js 几乎不用)
    首位的 / 在这里表示的是当前文件模块所属磁盘根路径

  • 另外:.js 后缀名可以省略

require('./myfoo.js')

模块查找机制

  1. 优先从缓存加载
  2. 核心模块
  3. 路径形式的文件模块
  4. 第三方模块
    • node_modules/art-template/
    • node_modules/art-template/package.json
    • node_modules/art-template/package.json main
    • index.js 备选项
      进入上一级目录找 node_modules
      按照这个规则依次往上找,直到磁盘根目录还找不到,最后报错:Can not find moudle xxx

一个项目有且仅有一个 node_modules 而且是存放到项目的根目录

例如:art-template的查找规则

如果 package.json 文件不存在或者 main 指定的入口模块是也没有
则 node 会自动找该目录下的 index.js
也就是说 index.js 会作为一个默认备选项

如果以上所有任何一个条件都不成立,则会进入上一级目录中的 node_modules 目录查找
如果上一级还没有,则继续往上上一级查找

如果直到当前磁盘根目录还找不到,最后报错:

can not find module xxx
var template = require('art-template')

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多