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,因为模块内容本身就直接是默认导出的对象。
 
                             
        