require 用来加载一个文件的代码,关于 require 的机制这里不展开讲解,请仔细阅读 官方文档

简单概括以下几点:

  • require 可加载 .js、.json 和 .node 后缀的文件
  • require 的过程是同步的,所以这样是错误的:

    setTimeout(() => {
    module.exports = { a: 'hello' }
    }, 0)
    

    require 这个文件得到的是空对象 {}

  • require 目录的机制是:

    • 如果目录下有 package.json 并指定了 main 字段,则用之
    • 如果不存在 package.json,则依次尝试加载目录下的 index.js 和 index.node
  • require 过的文件会加载到缓存,所以多次 require 同一个文件(模块)不会重复加载
  • 判断是否是程序的入口文件有两种方式:
    • require.main === module(推荐)
    • module.parent === null

循环引用

循环引用(或循环依赖)简单点来说就是 a 文件 require 了 b 文件,然后 b 文件又反过来 require 了 a 文件。我们用 a->b 代表 b require 了 a。

简单的情况:

a->b
b->a

复杂点的情况:

a->b
b->c
c->a

码农进阶题库 - 每天一道面试题 or Js小知识@Js中文网

每天弄懂一道面试题(Javascript小知识)来鞭策自己学习思考,每天进步一点,帮助你提高你的代码编写质量

循环引用并不会报错,导致的结果是 require 的结果是空对象 {},原因是 b require 了 a,a 又去 require 了 b,此时 b 还没初始化好,所以只能拿到初始值 {}。当产生循环引用时一般有两种方法解决:

  1. 通过分离共用的代码到另一个文件解决,如上面简单的情况,可拆出共用的代码到 c 中,如下:

    c->a
    c->b
    
  2. 不在最外层 require,在用到的地方 require,通常在函数的内部

总的来说,循环依赖的陷阱并不大容易出现,但一旦出现了,对于新手来说还真不好定位。它的存在给我们提了个醒,要时刻注意你项目的依赖关系不要过于复杂,哪天你发现一个你明明已经 exports 了的方法报 undefined is not a function,我们就该提醒一下自己:哦,也许是它来了。

官方示例: https://nodejs.org/api/modules.html#modules_cycles

上一节:1.2 MongoDB 的安装与使用

下一节:2.2 exports 和 module.exports

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「IT平头哥联盟」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""