nodejs require - yaokun123/php-wiki GitHub Wiki

require

一、require加载模块是同步的。

二、加载模块过程

情况一、require('./test.js')是具体文件名
直接根据给定的路径去加载模块,找到了就加载成功,找不到就加载失败

情况二、require('./test')不是具体的文件名
1、根据指定的路径,依次添加文件后缀.js、.json、.node进行匹配
2、如果没有找到,查找是否有test目录(尝试找test包)
    -找不到,加载失败
    -找到了,依次在test目录下查找package.json文件(找到该文件后尝试找main字段中的入口文件)、index.js、index.json、index.node找不到则加载失败。

情况二、require()的参数不是路径,直接就是一个模块名称
1、现在核心模块中查找,是否有和给定的名字一样的模块,如果有则直接加载
2、如果核心模块中没有该模块,那么就认为这个模块是一个第三方模块(自定义模块)
    --先会去当前js文件所在的目录下去找是否有一个node_modules文件夹
    --没有再去找父目录

三、require加载模块时的注意点

  • 1、所有模块第一次加载完毕之后都会有缓存,避免了二次开销,因为有缓存,所以模块中的代码只在第一次加载时候执行一次。

  • 2、每次加载模块的时候都优先从缓存中加载,缓存中没有的情况下才会按照node.js加载模块的规则去查找

  • 3、核心模块在node.js源码编译的时候,都已经编译为二进制执行文件,所以加载速度较快(核心模块的加载的优先级仅次于缓存加载)

  • 4、核心模块都保存在lib目录下

  • 5、试图加载一个和核心模块同名的自定义模块(第三方模块)是不会成功的

  • 6、核心模块只能通过模块名称来加载

  • 7、require()加载模块使用./相对路径时,相对路径是相对当前模块,不受执行node命令的路径影响。

  • 8、建议加载文件模块的时候,始终添加文件后缀名,不要省略。

四、module.exports介绍

用于设置模块返回值使用(require()的返回值)

module.exports = 'hello'
module.exports = 666
module.exports = function(){}

注意:不设置的时候返回是{}

module.exports与exports区别

最终require()返回的是module.exports对象中的数据