JavaScript中require('file')与require('file.js')的区别是什么
Node.js CommonJS 模块两种require写法的差异及性能问题解答
两种写法的核心差异
这两种写法的区别完全来自Node.js CommonJS规范定义的模块解析逻辑:
- 注:实际本地同目录文件导入通常需要加
./相对路径前缀,这里默认是同目录相对导入的简化写法 - 当使用
require('export')的无后缀写法时,Node.js会按照以下优先级依次查找匹配的模块:- 先查找是否存在和标识符完全同名的文件
- 无匹配则依次尝试添加
.js、.json、.node后缀查找 - 上述步骤都未找到对应文件时,会查找是否存在同名目录,再尝试读取目录下
package.json的main字段指定的入口文件,若还是无匹配则依次查找目录下的index.js、index.json、index.node
- 当使用
require('export.js')的带明确后缀写法时,Node.js会跳过所有后缀补全、目录匹配的逻辑,直接精确查找对应名称的.js文件,查找失败就直接抛出模块不存在的错误。
省略后缀的加载速度差异
理论上无后缀写法的加载速度会稍慢,原因是多了几步文件系统查找校验的逻辑。但这个差异在绝大多数业务场景下完全可以忽略:
- 几次文件查找的耗时通常在微秒级别,且现代操作系统都会对目录文件列表做缓存,重复查找的耗时会进一步降低
- 只有在循环执行数千次以上模块导入的极端场景下,才可能感知到可量化的性能差异
实际开发中选择哪种写法完全取决于团队代码规范,两种写法在你当前的场景下功能完全等价:带后缀写法逻辑更明确,无后缀写法更简洁。
内容的提问来源于stack exchange,提问作者Lars Flieger
相关产品推荐
相关产品推荐

