从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. 2017年7月4日更新: 在实施之前,是否有任何实用的解决方法? (或者,有没有办法让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首先发出你想要的代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |