babel 对 ECMAModule的转换

导出 export 和 export default

首先会在 exports 对象上定义 __esModule 属性,标志这是使用 ESModule 的导出。

Object.defineProperty(exports, "__esModule", {
  value: true
});

如果是使用 export 导出,那么会将属性挂在 exports.xxx 上,如果使用的是 export default 上,那么会将属性挂在 exports.default 上。

对于 commonjs 由于是直接在 exports 对象上进行操作,如 module.exports = {}、exports.xxx = xxx,所以不需要 babel 做额外处理。

所以 commonjsexport 都把值挂在 module.exports 上,在导入的时候无区别,而 export default 会把值挂在 module.exports.default 上,在导入的时候会去 default 上取值

导入 import

对于导入来说,既可以导入 commonjs 也可以导入 ESModule

使用非默认导入时,对于使用 commonjs 的导出方式和 export 的导出方式时。如下:

import { clone } from 'lodash'
clone({})
等于下面这段代码
const _lodash = require('lodash');
_lodash.clone({})

如果使用默认导入,对于使用 commonjs 的导出方式和使用 export default 的导出方式。默认导入会被转换如下:

import lodash from 'lodash'
lodash.clone()
或被转换成如下代码
var _lodash = _interopRequireDefault(require("lodash"));

function _interopRequireDefault(obj) {
	// 如果是 esmodule 的默认导出,那么 obj 中有在导出时就会把相信的值挂在 default 上,如果是 commonjs 的导出,那么它内部是没有 default 的,需要将其构造成该种数据结构
	return obj && obj.__esModule ? obj : { default: obj };
}

_lodash.default.clone();

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值