export = {};
tsc(带“module”:“amd”)将发出:
define(["require","exports"],function (require,exports) { "use strict"; return {}; });
但是,我宁愿它发出
define([],function() { "use strict"; return {}; });
……如果我明确导入它们,只包括require或exports,即
import relativeRequire = require("require");
有没有办法告诉TypeScript不要在发出的AMD模块中发出require和export(即要求它不要使用CommonJS simplified wrapping)?
笔记:
>我建议的输出完全符合AMD spec.
>一个空的依赖项数组是only way,模块具有零依赖性(而不是省略依赖项数组,这意味着需要,导出和模块依赖性).
2017年7月4日更新:
看起来这实际上是TypeScript GitHub repo:https://github.com/Microsoft/TypeScript/issues/669中的一个开放问题
在实施之前,是否有任何实用的解决方法? (或者,有没有办法让TypeScript这样做?)
我不知道TypeScript会以什么方式开箱即用.我最近研究了TypeScript如何发出其定义调用,因为我需要将名为“module”的虚拟模块添加到依赖项列表中. (如果你使用Angular,你想使用module.id将当前模块的id传递给Angular,以便它可以解决诸如相对模板路径等问题.你可以使用module.id而不会出现CommonJS输出问题但是使用AMD默认情况下,输出模块不包含在依赖项列表中.)我通过编写一个构建步骤解决了这个问题,该步骤在tsc发出后修改了tsc发出的代码.它使用regexp修改依赖项列表以添加“module”,并修改回调以添加相应的参数.这对我有用,因为我正在添加.对于您要尝试执行的操作,这不是一个很好的方法,因为您想要删除依赖项,但可能会出现删除它们会导致代码无效的情况.
对于变通方法,您可以使用Esprima来检查由tsc生成的JavaScript,并且如果传递给定义的工厂函数内的代码不使用模块“require”和“exports”的值,则从中删除未使用的模块依赖项列表和传递给工厂函数的参数列表中的相应参数.这将是最通用的解决方案. (除此之外,它与使用AMD加载器提供的异步require调用(在工厂函数中的形式require([…],function(…){}))兼容.)但是编码这个逻辑可能就像生成一个拉请求一样,让tsc首先发出你想要的代码.