从TypeScript发出的AMD依赖项中省略“require”和“exports”

给定以下TypeScript文件,
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这样做?)

我认为你所做的事情没有实质性的优势.对于任何超过玩具应用程序的应用程序,通过删除未使用的依赖项而节省的执行时间将与应用程序其余部分的执行时间相比相形见绌. require和export都是虚拟模块,实例化成本很低. (通过“虚拟”我的意思是它们完全是你使用的AMD加载器的内部,不需要从网络或磁盘上的文件中获取任何内容.)我看到你提到的 issue 669自2014年9月开始以来被视为“已接受” 2015年4月.似乎没有人受到如此严重的伤害,以至于他们急于提出拉动请求.

我不知道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首先发出你想要的代码.

相关文章

我最大的一个关于TypeScript的问题是,它将原型的所有方法(无...
我对React很新,我正在尝试理解子组件之间相互通信的简洁方法...
我有一个非常简单的表单,我将用户电子邮件存储在组件的状态,...
我发现接口非常有用,但由于内存问题我需要开始优化我的应用程...
我得到了一个json响应并将其存储在mongodb中,但是我不需要的...
我试图使用loadsh从以下数组中获取唯一类别,[{"listing...