当前位置: 首页 > 科技观察

面试官:说说 Node 文件查找的优先级以及 Require 方法的文件查找策略-

时间:2023-03-21 17:37:49 科技观察

面试官:说说Node文件搜索的优先级和Require方法的文件搜索策略?转载本文请联系JS每日一问公众号.1、模块规范NodeJS支持并实现了CommonJS,让我们在开发node的过程中可以方便的进行模块化开发:exports,require通过上述变量进行模块化开发。模块化的核心是导出和导入。在Node中,exports和module.exports负责导出模块的内容,通过require函数导入其他模块(自定义模块、系统模块、第三方库模块中的内容)2.搜索策略require方法接收几个参数的传递:原生模块:http、fs、path等相对路径的文件模块:./mod或../mod绝对路径文件模块:/pathtomodule/mod作为模块的目录:./dirname非nativemodule文件模块:modrequire参数比较简单,但是内部加载很复杂,其加载优先级也不同,如下图:从上图可以看出,文件模块存在于缓存区。在查找模块路径时,会先从缓存中加载已有的模块原生模块。和原生模块一样,通过require方法解析文件名后,首先检查模块是否在原生模块列表中,如果在,则从原生模块加载绝对路径和相对路径。如果需要绝对路径的文件,则直接搜索对应的路径。相对路径最快的模块会相对于当前调用require的文件进行查找,如果根据准确的文件名没有找到模块,NodeJs会尝试带上.js、.json或.node扩展名,然后加载目录作为一个模块。默认情况下,根据根目录下package.json文件的main指定目录模块,如:{"name":"some-library","main":"main.js"}require('./some-library')如果它在./some-librarynode_modules目录中,将尝试加载。/some-library/main.js如果目录下没有package.json文件,或者main入口不存在或者无法解析,会尝试加载目录下的index.js或者index.node文件的非原生模块在每个文件中都有module.paths,表示模块的搜索路径。require就是根据它找到文件。window下输出如下:['c:\\nodejs\\node_modules','c:\\node_modules']可以看出模块路径的生成规则是:从当前文件目录开始到搜索node_modules目录;然后依次进入父目录,查找父目录下的node_modules目录,依次迭代,直到根目录下的node_modules目录全部找不到,则从系统NODE_PATH环境变量中查找。例如:如果在/home/ry/projects/foo.js文件中调用require('bar.js'),Node.js将按以下顺序查找:/home/ry/projects/node_modules/bar.js/home/ry/node_modules/bar.js/home/node_modules/bar.js/node_modules/bar.js这让程序本地化了它们的依赖,避免了它们的冲突3.总结通过以上模块的文件搜索策略,总结一下文件搜索优先级:缓存模块优先级最高,如果是内置模块,直接返回,优先级仅次于缓存模块。如果以绝对路径/开头,则从根目录开始搜索。如果以相对路径./开头,则从当前require文件的相对位置开始搜索。如果文件没有带后缀,先从js、json、node依次查找。如果是目录,则根据package.json的main属性的值来确定目录中的入口文件。默认是index.js。如果该文件是第三方模块,它将导入node_modules文件。如果不在当前仓库文件中,会自动从上层递归查找,直到根目录参考http://nodejs.cn/api/modules.html#modules_file_moduleshttps://blog.csdn.net/qq_36801250/article/details/106352686https://www.cnblogs.com/samve/p/10805908.html