Javascript 带有AMD和require.js的Typescript

Javascript 带有AMD和require.js的Typescript,javascript,html,typescript,requirejs,amd,Javascript,Html,Typescript,Requirejs,Amd,我正在AMD和require.js中使用Typescript,但我无法让Typescript编译器输出代码,这些代码将在加载模块后执行 这是main.ts: import { foo } from './bar'; foo('world'); export function foo(name: string) { alert('Hello ' + name); } 这是bar.ts: import { foo } from './bar'; foo('world'); export

我正在AMD和require.js中使用Typescript,但我无法让Typescript编译器输出代码,这些代码将在加载模块后执行

这是
main.ts

import { foo } from './bar';

foo('world');
export function foo(name: string) {
  alert('Hello ' + name);
}
这是
bar.ts

import { foo } from './bar';

foo('world');
export function foo(name: string) {
  alert('Hello ' + name);
}
我使用以下
tsconfig.json
文件编译此文件:

{
    "compilerOptions": {
        "alwaysStrict": true,
        "module": "amd",
        "outFile": "client.js",
        "target": "es5"
    },
    "files": [
        "main.ts"
    ]
}
并将其包含在我的HTML中,如下所示:

<script data-main="client/client.js" src="/static/require.js"></script>
define("bar", ["require", "exports"], function (require, exports) {
    "use strict";
    function foo(name) {
        alert('Hello ' + name);
    }
    exports.foo = foo;
});
define("main", ["require", "exports", "bar"], function (require, exports, bar) {
    "use strict";
    bar.foo('world');
});
一切都很好,除了我想直接在
main
模块中执行代码之外。所以最后一个定义应该是

define(["require", "exports", "bar"], ...
而不是

define("main", ["require", "exports", "bar"], ...

目前,我需要用JavaScript编写的第三个脚本来加载<代码>主< /代码>模块,我认为将<代码>主< /代码>模块作为可重用代码是不好的风格。


如何让typescript编译器将
main.ts
输出为可执行定义而不是模块定义?

当您使用“导入…”时,typescript将编译AMD模块,如您问题中所示。您可以尝试下面的代码()来验证它是否会导致您请求的输出吗

/// <reference path="[YOUR IMPORT FILE]" />
/// ...

/**
 * Main entry point for RequireJS
 */
require(
    [
        // YOUR IMPORT DEFINITIONS
    ],
    (/* YOUR IMPORT VARIABLES */) => {
        'use strict';

        // YOUR CODE HERE
    }
);
//
/// ...
/**
*RequireJS的主要入口点
*/
要求(
[
//您的导入定义
],
(/*您的导入变量*/)=>{
"严格使用",;
//你的代码在这里
}
);

函数define
只定义一个模块,无论TypeScript如何生成代码,它都不会执行该模块

定义完所有模块后,您必须执行一个脚本,该脚本应包含一个调用
require
方法的语句

所以在你的脚本加载后,你有一个脚本,它不应该是AMD格式的,它应该只包含以下语句

require(['main'],函数(main){
//你的主机已经加载!!!
});
Typescript不会生成这样的语句,因为它假定所有模块都是AMD格式。然而,调用和执行模块是AMD loader的功能,调用方应该手动调用和调用模块。

不要对模块使用
//
。只需导入它们。