default
是 ES6 模块(import/export
)的特性,通常用于获取模块的 默认导出。为了更好地理解为什么要加 default
,我们先来看一下 ES6 模块的基本概念和 CommonJS 模块的差异。
1. ES6 模块和 CommonJS 模块的导出差异
ES6 模块(import/export
)
ES6 模块使用 export
和 import
来导出和导入模块。一个模块可以有多个导出,也可以有一个默认导出。
示例:
// foo.js
export const foo = 'bar'; // 命名导出
export default function() { // 默认导出
console.log('Hello World');
}
在其他文件中导入时:
import foo, { foo } from './foo'; // 导入默认导出和命名导出
import foo from './foo'
引入的是 默认导出。import { foo } from './foo'
引入的是 命名导出。
CommonJS 模块(require
)
CommonJS 是 Node.js 的模块系统,它通常通过 module.exports
导出模块。默认导出是通过 module.exports
来实现的。
示例:
// foo.js (CommonJS)
module.exports = function() {
console.log('Hello World');
}
在其他文件中导入时:
const foo = require('./foo'); // 导入默认导出
2. default
的作用
Webpack 在处理 ES6 模块时,会自动将默认导出转换成一个对象。这个对象包含一个 default
属性,这个属性对应的是默认导出的内容。
为什么要加 default
?
在 CommonJS 模块系统中,默认导出是直接返回的,而在 ES6 模块中,默认导出是作为一个对象的 default
属性存储的。
举个例子:
假设你在使用 require
来引入一个 ES6 模块,它会被打包成 CommonJS 模块格式。这个打包后的模块会有一个 default
属性,里面存储的是你模块的默认导出内容。
举个例子:
假设 TiAccordion
组件是一个默认导出的 ES6 模块,Webpack 会把它转换为:
// 转换后的模块
module.exports = {
default: function TiAccordion() {
// ...
}
};
所以如果你使用 require(30)
获取的模块是这样的结构:
var TiAccordionModule = require(30); // TiAccordionModule = { default: function TiAccordion() {...} }
如果你直接访问 TiAccordionModule
,你会得到一个包含 default
的对象。所以我们需要通过 TiAccordionModule.default
来获取默认导出:
var TiAccordion = TiAccordionModule.default; // 访问到默认导出的函数或对象
3. 总结:
default
:是 ES6 模块的默认导出,Webpack 在转换时会把默认导出的内容放在default
属性里。- 当你使用
require(x)
获取 ES6 模块时,返回的是一个包含default
属性的对象,默认导出的内容就在这个属性里。 - 所以你需要加
default
来访问模块的默认导出内容。
例子:
var TiAccordion = require(30).default; // 获取模块的默认导出
如果模块本身是通过 CommonJS 风格导出的(没有使用 export default
),则不需要 .default
,因为模块内容本身就直接是默认导出的对象。