博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Node.js]node中的require到底是怎样工作的
阅读量:5936 次
发布时间:2019-06-19

本文共 1419 字,大约阅读时间需要 4 分钟。

hot3.png

##关于require 但凡使用过node.js/io.js,必定都会用到require这个函数来引用其它模块(自己写的或他人的)。但很多人(包括本人)都没有把node中关于require(在文档中modules这一部份)介绍认真看过一遍。


这里先介绍一下大家可能都已熟知的情况:

文件加载

node中在使用require加载文件时,会尝试在引用文件名不存在的情况下,依次加上.js、.node.json这三个后缀名来试错。注意,这里指的是引用文件名对应文件不存在的情况下。

例如,当你在代码中使用require('./hello')来引用当前目录下hello这个文件的时候,它是会默认先去查找名为hello这个文件是否存在,假如存在这个文件(即不带任何后缀),那么,它就会直接读取这个文件的内容,而不是去尝试添加后缀。另外需要注意的是,它这里是将这个无后缀当作js文件来解析的,而不管里面是什么代码。

关于引用文件时路径问题,按照以./按相对路径或绝对路径来解析。

node_modules加载

如果使用require时候,不带任何相对或绝对路径,那么node会尝试从node_modules中去寻找所需要的模块。node查找node_modules的方式是从当前目录找起,一直找到根目录下。即一级一级地先查看是否有node_modules这个文件夹,如果有就从里面寻找对应模块,如果未找到则进入上一级目录查找。

文件夹作为模块

除了在node_modules下文件夹是一个模块之外,你还可以在其它地方放置一个这样的文件夹作为模块,然后以相对或者绝对路径的方式进行引用。

有两种方式(官网上所说三种,其实可并为两种)可以使文件夹作为一个模块引用到。

  • 文件夹下创建一个package.json文件,并使用"main": "abc.js"方式,这样require就会去引用目录下abc.js文件。
  • 当文件夹中无package.json这个文件时,它会在文件夹中尝试寻找index.jsindex.node这两个文件 。如果有,则使用对应文件。

! 这里有一个问题,如果同一级存在同名的文件夹和文件时候,会怎么办呢?首先,真正使用一模一样名字的文件和文件夹在同一级是不能同时存在的。其次,当类似于hi.jshi目录同时存在时呢?它会率先查找使用hi目录,如果目录按照上面形式并未查找到结果时,则使用hi.js这个文件。


由于很多人(包括本人)没认真看过modules模块的介绍,所以对node_modules文件夹有一个潜意识的假设,认为node_modules中存放的都是文件夹模块,不能放单个js文件。

其实,node_modules文件夹中,不仅可以放npm install而来的文件夹模块,还可以放置单个js文件,形成一个模块。

如,将一个test.js文件放入node_modules文件夹中后,就可以直接在代码中使用require('test')来引用它了,就像引用一个npm模块一样。

这样做的好处是,不用为一个简单的模块而做一个文件夹,同时还可以不带路径进行引用。

其实,关于node中require还有一些必要的知识需要了解,比如引用缓存、互相引用的问题等,这些在modules文档中都有详细说明,这里就不再翻译了。

转载于:https://my.oschina.net/dmdgeeker/blog/401607

你可能感兴趣的文章
is和==, 编码和解码
查看>>
Accessing the Deep Web: A Survey
查看>>
ADODB.Stream在进行文件上传时报错
查看>>
5.5 数据库约束
查看>>
[Angularjs]单页应用之分页
查看>>
js---对象 和 函数this
查看>>
VC 6.0的简单使用
查看>>
IE6 兼容问题总结
查看>>
[转载] 民兵葛二蛋——第17集
查看>>
[转载] 七龙珠第一部——第004话 掳人的妖怪——乌龙
查看>>
【leetcode】75.Sort Colors
查看>>
2017-2018-1 20155332 《信息安全系统设计基础》课程总结
查看>>
strak组件(8):基本增删改查实现及应用和排序
查看>>
汕头市队赛 SRM 09 C 撕书
查看>>
Xcode常用快捷键
查看>>
如何快速有效的投诉上海移动
查看>>
python3爬虫-下载网易云音乐,评论
查看>>
【文文殿下】[BZOJ4008] [HNOI2015] 亚瑟王
查看>>
31.图片放大镜插件——jqzoom
查看>>
addSubview和insertSubview的区别
查看>>