##关于require 但凡使用过node.js/io.js,一定都会用到require
这个函数来引用其它模块(本身写的或他人的)。但不少人(包括本人)都没有把node中关于require(在文档中modules这一部份)介绍认真看过一遍。node
这里先介绍一下你们可能都已熟知的状况:npm
node中在使用require加载文件时,会尝试在引用文件名不存在的状况下,依次加上.js
、.node
、.json
这三个后缀名来试错。注意,这里指的是引用文件名对应文件不存在的状况下。
例如,当你在代码中使用require('./hello')
来引用当前目录下hello
这个文件的时候,它是会默认先去查找名为hello
这个文件是否存在,假如存在这个文件(即不带任何后缀),那么,它就会直接读取这个文件的内容,而不是去尝试添加后缀。另外须要注意的是,它这里是将这个无后缀看成js文件来解析的,而无论里面是什么代码。json
关于引用文件时路径问题,按照以.
和/
按相对路径或绝对路径来解析。缓存
若是使用require
时候,不带任何相对或绝对路径,那么node会尝试从node_modules
中去寻找所须要的模块。node查找node_modules
的方式是从当前目录找起,一直找到根目录下。即一级一级地先查看是否有node_modules
这个文件夹,若是有就从里面寻找对应模块,若是未找到则进入上一级目录查找。函数
除了在node_modules
下文件夹是一个模块以外,你还能够在其它地方放置一个这样的文件夹做为模块,而后以相对或者绝对路径的方式进行引用。ui
有两种方式(官网上所说三种,其实可并为两种)可使文件夹做为一个模块引用到。翻译
package.json
文件,并使用"main": "abc.js"
方式,这样require
就会去引用目录下abc.js
文件。package.json
这个文件时,它会在文件夹中尝试寻找index.js
或index.node
这两个文件 。若是有,则使用对应文件。! 这里有一个问题,若是同一级存在同名的文件夹和文件时候,会怎么办呢?首先,真正使用如出一辙名字的文件和文件夹在同一级是不能同时存在的。其次,当相似于hi.js
和hi
目录同时存在时呢?它会率先查找使用hi
目录,若是目录按照上面形式并未查找到结果时,则使用hi.js
这个文件。code
因为不少人(包括本人)没认真看过modules模块的介绍,因此对node_modules
文件夹有一个潜意识的假设,认为node_modules
中存放的都是文件夹模块,不能放单个js文件。
其实,node_modules
文件夹中,不只能够放npm install
而来的文件夹模块,还能够放置单个js文件,造成一个模块。文档
如,将一个test.js
文件放入node_modules
文件夹中后,就能够直接在代码中使用require('test')
来引用它了,就像引用一个npm模块同样。
这样作的好处是,不用为一个简单的模块而作一个文件夹,同时还能够不带路径进行引用。io
其实,关于node中require
还有一些必要的知识须要了解,好比引用缓存、互相引用的问题等,这些在modules文档中都有详细说明,这里就再也不翻译了。