import oo from './xx' console.log(oo.bar);
在这种写法中oo是随意的变量,乍一看可能会觉的和第二种写法一样,其实不然,来看一下编译后的代码:
'use strict'; var _ = require('./xx'); var _2 = _interopRequireDefault(_); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } console.log(_2.default.bar);
在最后一行,oo.bar被编译成了_2.default.bar,多了一个default,这里的bar当然就找不到了,所以这种用法不是用来引入export的属性的,而是下面要说的export default。
export default 曝露且一次性曝露
export与export default我会在别的文章总结,这里我们只说export default的用法,下面来看代码。
var foo=123; export default foo;
被babel编译后
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var foo = 123; exports.default = foo;
看到最后一行foo会被赋给exports.default,这样正好对应上了import oo from './xx'这种写法里面会调用default里面的属性,所以这两种用法对应使用。既然属性的值是会赋给exports.default,那么就可以有下面的用法
export default 123;
export default {foo:123};
export default function f(){}
export default function (){}
上面的代码是分开写的,因为一个js里面只能使用一次export default,理由和使用module.exports一样,除了不能写多个,下面也是错误的写法:
export default var foo=123; //错误
export default还可以用来曝露class这里不多说了,都是曝露。
其他的一些用法
继承
这里说是模块继承,其实就是一个父模块引入子模块,然后又将子模块曝露出来的属性曝露出去:
export * from './xx';
被编译后
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _ = require('./xx'); Object.keys(_).forEach(function (key) { if (key === "default" || key === "__esModule") return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _[key]; } }); });
注意下面这句
if (key === "default" || key === "__esModule") return;
default属性不向外曝露...这说明,我们的引入的xx.js这个文件里面用exports default是无效的,替代写法是