我用ES6的语法编写了三个类,用于模拟一些应用代码,ModuleBase
类顾名思义就是基类,ModuleA
从ModuleBase
继承,ModuleB
则是独立的类。编写完成,我用Babel进行编译,代码详情如下:
整体的目录结构:
ModuleBase的代码:
class ModuleBase{
constructor(){
this.name = "module base";
}
render(){
console.info(this.name);
}
}
export default ModuleBase;
ModuleA的代码:
import ModuleBase from './module-base';
class ModuleA extends ModuleBase{
constructor(){
super();
this.name = "module a";
}
render(){
console.info(this.name);
}
}
export default ModuleA;
ModuleB的代码:
class ModuleB{
constructor(){
this.name = "module b";
}
render(){
console.info(this.name);
}
}
export default ModuleB;
使用Babel编译的配置文件.babelrc:
{
"presets": ["es2015"],
"plugins": [
"external-helpers",
//编译成AMD
// "transform-es2015-modules-simple-amd",
//编译成UMD
["transform-es2015-modules-umd", {
"globals": {
"es6-promise": "Promise",
"jquery": "jQuery",
"./module-base": "ModuleBase"
},
"exactGlobals": true
}],
["rename-umd-globals", {
"moduleBase": "ModuleBase",
"moduleA": "ModuleA",
"moduleB": "ModuleB"
}]
]
}
HTML页面的测试代码:
<body>
<!-- <script src="./dist/module-a.js"></script> -->
<script src="./external-helpers.js"></script>
<script src="./node_modules/requirejs/require.js" data-main="./index.js"></script>
<script>
</script>
</body>
HTML页面中所引用的index.js的代码:
require(['./lib/module-a','./lib/module-b'],function(ModuleA, ModuleB){
let ma = new ModuleA.default();
ma.render();
let mb = new ModuleB.default();
mb.render();
});
问题来了:
大家回看一下.babelrc文件,其中注释掉的部分,是最初采用transform-es2015-modules-simple-amd
插件将代码编译为AMD模式,然后在index.js中使用的时候,就是正常的直接let ma = new ModuleA()
即可。但是,当使用transform-es2015-modules-umd
编译时,同样是在AMD模式下使用,引用的module就必须多打一个default
才可以,如上面贴出的代码所示。
我查了很多资料,但是都没有解决上面default
的这个问题,请各位帮忙看看:
- 是我的JS模块代码写法有问题?
- 是我的Babel的用法或配置有问题?
不管是哪种问题吧,希望哪位大侠能够指点一二,给出一个解决思路吧,小弟在此谢过各位前辈啦!
试试webpack: output.libraryExport: 'default'