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

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

  1. 通过分离共用的代码到另一个文件解决,如上面简单的情况,可拆出共用的代码到 c 中,如下:
c->a
c->b
  1. 不在最外层 require,在用到的地方 require,通常在函数的内部

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

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

require的使用相关推荐

  1. Ubuntu16.04 pip3 install 报错 working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]

    1. 问题现象 Exception: Traceback (most recent call last):File "/usr/lib/python3/dist-packages/pip/b ...

  2. 微信小程序 require module exports 的使用

    require any require(string path) 引入模块.返回模块通过 module.exports 或 exports 暴露的接口. 项目中使用 例如 const { post } ...

  3. php if require,php echo()和print()、require()和include()函数区别说明

    简单总结echo()和print().require()和include()等易混淆函数的区别 1.echo和print的区别 PHP中echo和print的功能基本相同(输出),但是两者之间还是有细 ...

  4. PHP TP5框架 安装运行 Warning: require(E:\phpstudy_pro\WWW\TP5\tp5\public/../thinkphp/base.php): failed to

    创建一个新的项目:进入项目的根目录执行 git 命令: 先执行 git clone -b 5.1 https://git.coding.net/liu21st/thinkphp5.git tp5 进入 ...

  5. node 模块化 require expores,简易实现原理。

    为了更好的理解 Node.js 的 require 实现机制,我实现了一个简易的版本.我们node index.js的时候就是require('./index.js'),话不多说我们直接上代码: 目录 ...

  6. php include include_once 区别,「PHP」include()、include_once()、require()、require_once()的用法及区别...

    1.include:使用include引用外部文件时,只有代码执行到include代码段时,调用的外部文件才会被引用并读取,当引用的文件发生错误时,系统只会给出个警告错误,而整个php文件会继续执行. ...

  7. 统一客服消息返回错误:{errcode:43004,errmsg:require subscribe hint: [9Vv08633952]}

    2019独角兽企业重金招聘Python工程师标准>>> 公众号或者小程序发送客服消息错误: {"errcode":43004,"errmsg" ...

  8. include和require的区别

    细节决定成败! 1.引用文件方式 对include()来说,在include()执行时文件每次都要进行读取和评估:而对于require()来说,文件只处理一次(实际上,文件内容替换了require() ...

  9. PHP 中 include 和 require 的概要及区别介绍

    require() 语句的性能与 include() 相类似,都是包括并运行指定文件.不同之处在于:对 include() 语句来说,在执行文件时每次都要进行读取和评估:而对于 require() 来 ...

  10. Javascript模块化编程(三):require.js的用法

    这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...

最新文章

  1. 华为程序员发现孩子不是自己的!怒提离婚!但老婆只要房子车子!不要孩子!绿他的竟然是个酒吧混混!...
  2. 前端基础——day1
  3. VTK:Utilities之DataAnimationSubclass
  4. hdu5909-Tree Cutting【FWT】
  5. jQuery插件素材网站
  6. java每个月某天,java – 查找一年中的某一天
  7. jQuery学习_具备吸附功能的拖曳框
  8. nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录
  9. 单调栈-leetcode-739. 每日温度
  10. 从CAP 到编程语言的猜想
  11. 山寨抢购 Intel欲提高Atom处理器售价
  12. qt项目转Xcode项目(Xcode开发qt)
  13. 贷记、借记、来帐、往账的区别
  14. Web 3D渲染引擎HOOPS Communicator动画编辑器的使用 | HOOPS教程
  15. AD19 编译报错:has only one pin 和 floating net label
  16. 程序员的10大境界,计算科学的10层楼,比尔盖茨看了会自卑,牛顿看了会落泪!
  17. ETL工具之Informatica
  18. 音视频系列3:编解码技术
  19. TKE用户故事 | 作业帮检索服务基于Fluid的计算存储分离实践
  20. 【狂神说:秦疆老师】Spring5笔记

热门文章

  1. 利用python爬虫自动登录人人网
  2. 获取chrome80谷歌浏览器存储的指定网站Cookie数据方法详解
  3. 16. 如何修改 SAP ABAP OData 模型,使其支持 $expand 操作
  4. R数据分析:交叉滞后模型基础与实例解析
  5. 人工智能知识全面讲解:多层神经网络与误差逆传播算法
  6. [转]大量正版软件下载链接 1
  7. 港中文Adobe提出:开放式实体分割 Open-World Entity Segmentation
  8. parker 0104-00-0059-01
  9. 计算机excel计算If怎么算,Excel函数公式:关于SUMIF函数的那些事儿,全在此篇
  10. android小技巧(一) 格式化时间输出 简单的adapter PreferenceManager handler与 handlerThread