我有一个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
。
我的问题是,为什么会发生这种情况?如何强制打字稿导入代码未明确使用的模块?
答案 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。
你需要:
所以有一个像-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(),因为它只是为副作用导入它不会被删除。