TypeScript:仅包​​含语句的导入模块

时间:2013-05-09 05:45:59

标签: requirejs typescript amd

我有一个page-a.ts,可以编译成page-a.js

alert('this is from page-a');

我有main.ts汇编成main.js

import pageA = module('page-a')
alert('this is from main');

这是我的tsc命令行:

tsc --module amd page-a.ts main.ts

我正在使用requirejs这样:

<script src="require.js" data-main="main.js"></script>

加载页面时,我无法从page-a看到提醒消息框。在生成的脚本main.js中,没有page-a

我的问题是,为什么会发生这种情况?如何强制打字稿导入代码未明确使用的模块?

3 个答案:

答案 0 :(得分:11)

除了@basarat提到的方法之外,还有另外两种方法可以确保导入的模块包含在define函数中并因此加载。

将amd-dependency元素包含在TypeScript文件的顶部。

///<amd-dependency path="pathToFileRelativeToBaseWithoutFileExtension"/>

import moduleName = require("pathToFileRelativeToBaseWithoutFileExtension");
moduleName;  //Does not require declaring a new variable.

前者可能是副作用最小的人。不幸的是,元素及其用法没有很好的记录。

我在使用延迟加载AngularJS模块时发现了这些方法,这些模块创建并注册要依赖注入的类型。由于就TS编译器而言永远不会创建或分配类型,因此它不会为define函数创建必要的参数。

他们说这是设计的(https://typescript.codeplex.com/workitem/2436),但我恭敬地不同意。如果我已导入模块/文件并且我在该模块中引用了具体类型,则必须在该点加载该模块才能运行。必须做额外的步骤是多余的。

答案 1 :(得分:3)

您生成的js不会导入未在代码中明确使用的模块。 Typescript非常聪明,不会为只导入和未使用的模块生成任何js。

你需要:

  • 在第一个模块中导出变量AND
  • 导入第二个模块中的第一个模块AND
  • 在第二个模块中使用导出的变量

所以有一个像-a.js的东西:

export var x = 123; // just to export something that you can use
alert('this is from page-a');

和main.ts为:

import pageA = module('page-a')
var foo = pageA.x; // If you remove this line and you will not get the alert from page-a
alert('this is from main');

答案 2 :(得分:0)

我知道我迟到了,但这是实现这个目标的另一种方法:
您可以使用以下方法告诉typescript导入模块只是为了副作用:
import "path/to/external/module";
虽然这是es6语法,但是当你将-module amd传递给tsc时,它会将它转换为AMD require(),因为它只是为副作用导入它不会被删除。