具体来说,想象一下这种情况:我有一个jQuery插件$ .mega()。
我可以创建以下定义文件来定义这个插件:
没有这个,编译后的JavaScript代码如下:
我可以创建以下定义文件来定义这个插件:
/// <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模块。