JavaScript模块import语法疑问:带大括号与无大括号导入的区别
嗨,刚接触JavaScript模块的话,搞不懂这两种导入方式太正常了!我给你用最直白的话讲清楚,保证一听就懂:
首先你得知道,JS模块里的导出分两种核心类型——命名导出和默认导出,不同的导出方式对应不同的导入写法。
1. 带大括号的import {objectName} from 'object':挑着拿「命名导出」的单个成员
如果一个模块里用export直接导出某个变量、函数或者对象(每个都有自己的专属名字),这就叫「命名导出」。比如假设object.js这个模块里写了:
// object.js 中的代码 export const userName = "MicroFarad"; export function sayHello() { console.log("哈喽呀!"); }
这里的userName和sayHello都是单独命名好的导出项。这时候你在别的文件里只需要用其中一个,就用大括号把它的名字括起来导入——就像从工具箱里只拿出你要用的螺丝刀,不用把整个箱子都搬回家。
比如你只需要sayHello函数,就这么写:
import { sayHello } from 'object'; sayHello(); // 直接就能调用这个函数
要是需要同时用多个,就把它们都放进大括号里用逗号隔开:import { userName, sayHello } from 'object'。
划重点:这种写法不是导入整个模块,只是挑你需要的那几个命名好的部分,而且导入的名字必须和模块里导出的名字完全对应(要是想改名字,可以用as,比如import { userName as myName } from 'object',之后就可以用myName来代替userName)。
2. 不带大括号的import objectName from 'object':拿整个「默认导出」的内容
每个JS模块只能有一个默认导出,用export default来定义。比如object.js里是这样写的:
// object.js 中的代码 const fullModuleContent = { userName: "MicroFarad", sayHello: () => console.log("哈喽呀!") }; export default fullModuleContent;
这时候fullModuleContent就是这个模块的默认导出内容。你导入的时候不用加大括号,而且可以给它随便起名字——比如你叫它myObj或者whatever都没问题:
import myObj from 'object'; myObj.sayHello(); // 调用它的函数 console.log(myObj.userName); // 访问它的属性
说白了,这种方式就是把模块里默认导出的那个“整体”直接拿过来,你想叫它啥就叫它啥,然后就能用里面的所有内容了。
快速总结
- 带大括号的导入:对应模块里的命名导出,只能导入指定的单个/多个成员,名字需与导出时一致(可通过
as重命名) - 不带大括号的导入:对应模块里的唯一默认导出,导入整个默认内容,名字可以自定义
- 若要导入整个模块的所有内容:用
import * as wholeModule from 'object',得到包含所有导出项的对象(一般不推荐,除非你真的需要所有内容)
备注:内容来源于stack exchange,提问作者MicroFarad




