Node.js中require()引入模块时带{}与不带{}的语法区别
两种require模块引入写法的差异与适用场景
两种写法都是Node.js CommonJS模块规范下的合法引入方式,核心区别来自ES6解构赋值语法的结合使用,选择哪种写法完全由模块的导出结构和你的实际使用需求决定。
整体导入写法:const <variable> = require('moduleName')
- 核心作用:将
require()返回的模块导出内容完整赋值给左侧变量,拿到模块的全部导出能力 - 适用场景:
- 模块本身导出的是单个函数、类或者完整的功能对象,没有拆分提取的必要,比如示例中的
nodemailer包,默认导出的就是完整的邮件服务核心对象,直接引入后即可调用createTransport等所有内置方法 - 业务代码中需要用到模块导出的大量属性、方法,整体引入后通过点操作符访问,比逐个解构的写法更简洁
- 模块本身导出的是单个函数、类或者完整的功能对象,没有拆分提取的必要,比如示例中的
- 示例对应写法:
// 完整引入nodemailer模块,所有导出能力都挂载在nodemailer变量上 const nodemailer = require("nodemailer"); // 调用时直接通过点操作访问对应方法 const transporter = nodemailer.createTransport({ // 邮件服务配置 })
解构导入写法:const {<variable>} = require('moduleName')
- 核心作用:从模块导出的对象中,直接提取指定名称的属性/方法,赋值给同名变量,本质是普通的ES6解构赋值,和以下写法完全等价:
const googleapisModule = require('googleapis'); const google = googleapisModule.google;
- 适用场景:
- 只需要用到模块导出对象里的某一个或少数几个属性、方法,不需要加载整个模块对象,解构后可以直接通过变量名调用,省略冗长的链式点操作
- 支持多层嵌套解构,比如示例中的
const {OAuth2} = google.auth,就是直接从google.auth对象中提取OAuth2类,后续可以直接写new OAuth2(),不用写完整的new google.auth.OAuth2()
- 注意事项:
- 只有模块导出内容是对象时才能使用解构写法,如果模块导出的是单个函数、类或者字符串、数字这类基本类型值,解构拿到的值会是
undefined - 如果解构的属性名在模块导出中不存在,对应变量值为
undefined,导入阶段不会抛错,只有运行时调用该变量时才会触发错误
- 只有模块导出内容是对象时才能使用解构写法,如果模块导出的是单个函数、类或者字符串、数字这类基本类型值,解构拿到的值会是
- 示例对应写法:
// 从googleapis的导出对象中直接提取google属性,不需要持有整个googleapis模块对象 const {google} = require('googleapis'); // 进一步从google.auth中解构出OAuth2类,简化后续调用 const {OAuth2} = google.auth; // 后续直接使用解构出来的变量即可 const oauth2Client = new OAuth2( // 认证参数配置 )
两种写法没有本质的性能差异,只是语法便捷度的区别:需要使用模块的完整能力就选整体导入,只需要模块内部分零散的属性/方法就选解构导入即可。
内容的提问来源于stack exchange,提问作者sabari
相关产品推荐
相关产品推荐

