TypeScript UMD都是'模块'并且'定义'未定义

时间:2016-07-18 11:30:46

标签: javascript typescript typescript1.5 es6-module-loader umd

我使用" -m umd"来描述我的TypeScript。因为我的项目包括服务器,客户端和共享代码。但是,客户端代码在浏览器中不起作用。浏览器甚至没有显示任何错误,我找到的断点也没有,所以我不得不删除js-ts映射。然后,我能够调试它,我发现了问题。

以下是UMD生成的代码:

(function (factory) {
    if (typeof module === 'object' && typeof module.exports === 'object') {
        var v = factory(require, exports); if (v !== undefined) module.exports = v;
    }
    else if (typeof define === 'function' && define.amd) {
        define(["require", "exports", "./model"], factory);
    }
})(function (require, exports) {
    //my code
});

它不起作用,因为两个'模块'并且'定义'未定义。因此我的代码没有被执行,甚至没有任何例外。

出了什么问题?我怎么能让它发挥作用?

1 个答案:

答案 0 :(得分:3)

今天,没有一个浏览器可以原生地理解AMD模块。 (事实上​​,在MS Edge的一些新版本中,除了标准ES6之外,没有任何模块格式。)

所以你必须将模块加载器与你的代码捆绑在一起。我建议您使用AMD模块和轻量级AMD加载器,将模块和模块加载器连接在一个文件中,或者使用RollupJS,它可以从标准ES6模块生成无加载程序包。如果我没记错,rollup-plugin-typescript插件不能很好地处理多个文件,所以我建议将带有tsc的typescript编译成es6模块,然后在第二步中将它与rollupjs捆绑在一起。

您可以在此StackOverflow线程中阅读有关模块捆绑器的更多信息:Do I need require js when I use babel?

修改

今天(2016年9月),rollup-plugin-typescript插件就像魅力一样!绝对这是现在推荐的方式。