如何防止Typescript自动丢弃“未使用”的依赖项?

7
具体来说,想象一下这种情况:我有一个jQuery插件$ .mega()。
我可以创建以下定义文件来定义这个插件:
/// <reference path="../jquery/jquery.d.ts"/>

// Extend jquery with .mega()
interface JQuery { mega(options?:any):void; }

// Declare an external module, to import mega using AMD.
// NB. You still need to setup require.js to find the bower module.
declare module mega { export function dummy():void; }
declare module "mega" { export = mega; }

那么我可以通过一个脚本调用插件,使用以下命令:

/// <reference path="../../defs/jquery/jquery.d.ts"/>
/// <reference path="../../defs/mega/mega.d.ts"/>
import mega = require('mega');
import $ = require('jquery');

((...r:any[]) => {})(mega);  // <---- WTF!

$('.target').mega();

由于TypeScript会自动削减和丢弃未使用的依赖项作为优化步骤,如果没有实际使用一个模块,该模块将被丢弃,因此我不得不使用以下方式“伪造”对该模块的使用:

((...r:any[]) => {})(mega); 

没有这个,编译后的JavaScript代码如下:
define(["require", "exports", 'jquery'], function(require, exports, $) {
    //((...r:any[]) => {})(mega);
    $('.target').mega();
});

那么,在typescript编译时,有没有确保require包含不被“优化”的方法呢?

对我来说,无论是编译标志还是特殊的构建定义文件方式都可以正常工作~

Nb。这更适用于AMD,但同样适用于commonjs模块。


可能是重复的问题:TypeScript:编译会删除未引用的导入 - thomaux
2个回答

4
一种更好的解决方案(已在TS 1.8中测试):
import 'mega';

如果只有amd-dependency三斜杠指令,似乎它只在有其他require导入的情况下有效;只有amd-dependency指令会导致TypeScript编译器生成完全没有模块定义的JavaScript代码。


我想使用一个模块的导出 (import {makeHtml} from 'vdom-module'),并且设置 "jsx": "preserve",但由于 .tsx 被转换为 .jsx,tsc 会简单地忽略 jsx 并删除未使用的模块,而我需要在 jsx 中使用它来呈现虚拟 DOM。 - K..

4
您可以使用amd-dependency来指定您想要在amd define调用中提升的内容,例如:
/// <amd-dependency path="mega" />

我有同样的问题,然而,这个 /// <amd-dependency path="sortable" /> import sortable = require('sortable'); 对我没有任何作用。你能否提供一个带有代码示例的解答? - Ivan Koshelev
这似乎只有在TypeScript文件中至少存在1个require调用时才能正常工作。 - bcody
注意:此方法已被弃用,但我无法从TS文档中确定我们应该采取什么措施。 - iono
它一直被弃用。但这是正确的方法。相反,你应该看一下像webpack + commonjs这样的东西,它允许你在外部指定依赖项 - basarat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接