本文转载自微信公众号「JS每日一题」,作者灰灰。转载本文请联系JS每日一题公众号。
NodeJS对CommonJS进行了支持和实现,让我们在开发node的过程中可以方便的进行模块化开发:
而模块化的核心是导出与导入,在Node中通过exports与module.exports负责对模块中的内容进行导出,通过require函数导入其他模块(自定义模块、系统模块、第三方库模块)中的内容
require方法接收一下几种参数的传递:
require参数较为简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同,如下图:
从上图可以看见,文件模块存在缓存区,寻找模块路径的时候都会优先从缓存中加载已经存在的模块
而像原生模块这些,通过require方法在解析文件名之后,优先检查模块是否在原生模块列表中,如果在则从原生模块中加载
如果require绝对路径的文件,则直接查找对应的路径,速度最快
相对路径的模块则相对于当前调用require的文件去查找
如果按确切的文件名没有找到模块,则 NodeJs 会尝试带上 .js、.json或 .node拓展名再加载
默认情况是根据根目录中package.json文件的main来指定目录模块,如:
- { "name" : "some-library",
- "main" : "main.js" }
如果这是在./some-library node_modules目录中,则 require('./some-library') 会试图加载 ./some-library/main.js
如果目录里没有 package.json文件,或者 main入口不存在或无法解析,则会试图加载目录下的 index.js 或 index.node 文件
在每个文件中都存在module.paths,表示模块的搜索路径,require就是根据其来寻找文件
在window下输出如下:
- [ 'c:\\nodejs\\node_modules',
- 'c:\\node_modules' ]
可以看出module path的生成规则为:从当前文件目录开始查找node_modules目录;然后依次进入父目录,查找父目录下的node_modules目录,依次迭代,直到根目录下的node_modules目录
当都找不到的时候,则会从系统NODE_PATH环境变量查找
举个例子:
如果在/home/ry/projects/foo.js文件里调用了 require('bar.js'),则 Node.js 会按以下顺序查找:
这使得程序本地化它们的依赖,避免它们产生冲突
通过上面模块的文件查找策略之后,总结下文件查找的优先级:
参考文献
http://nodejs.cn/api/modules.html#modules_file_modules
https://blog.csdn.net/qq_36801250/article/details/106352686
https://www.cnblogs.com/samve/p/10805908.html
文章标题:面试官:说说Node文件查找的优先级以及Require方法的文件查找策略?
标题来源:http://www.csdahua.cn/qtweb/news36/323536.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网