前言

个人理解:我将require分为2类的原则是,该字符串中是否含有路径。如以下示例

1、无路径(也称为加载模块):require('find')
2、有路径(也称为加载文件):require('./find.js')

加载模块

例子:require('find')
1、node会先查找find模块是否是内置模块(nodejs内置的模块有fs、http等),找不到则进行下一步
2、从当前目录向外寻找node_moludes查找是否有find.js文件,找不到进行下一步;
3、在node_moludes中找find文件夹,寻找index.js文件;
4、没有index.js文件,则去package.json中查找main字段,该字段对应于一个入口路径;
5、以上都找不到,报错。

加载文件

例子:require('./find')
1、node会先找当前目录下的find.js文件;
2、进而寻找find.json文件;
3、寻找当前目录下的find文件夹的index.js
4、没有index.js文件,则去package.json中查找main字段,该字段对应于一个入口路径;
5、以上都找不到,报错。

require函数性质

require函数是一种运行时同步加载的机制(拷贝该文件),当node加载该文件后,会有一个require.cache函数对该文件进行缓存,即

let a = require('./find.js')
let b = require('./find.js')
console.log(a==b)

这是因为a、b都指向了该缓存文件,且该文件只会加载一次,后续的加载文件会先在缓存中先进行查找,如果有的话,则直接使用,没有的话,则按上面的查找规则进行加载文件。

node热更新

        用过node的人应该知道,当我们保存文件时,并不会自动更新代码,其本质因为node加载有缓存文件的原因,而要使用node热更新可以用nodemon,保存即重新运行。

总结

1、react中我们常用文件夹+index.jsx形式去创建组件,其原因就是webpack是基于nodejs的,而nodejs有着上面的加载机制;

2、加载文件时,为了提高性能,应将文件路径写清楚,避免多次查找;

3、node没有热更新,本质原因是require有缓存机制;

参考文献

nodeJs-require函数详解_三色之光的博客-CSDN博客_nodejs require

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐