17

我正在尝试将大量 JavaScript 页面转换为使用 TypeScript,并使用 RequireJS 来管理模块依赖项。

我遇到的问题是,除了 TypeScript 文件之间的相互依赖关系之外,该页面还依赖于一些与系统其他部分共享但尚未转换为 AMD 的常见 JavaScript 文件。

将非 AMD 脚本放在<SCRIPT>Require 标记上方的普通标记中是否非常危险,并假设它们已加载?

如果这是一个坏主意,有什么更好的方法来处理这个问题?我是否需要每个脚本都有 AMD 和非 AMD 版本?或者我是否需要转换所有脚本以便它们可以选择调用define()

4

2 回答 2

17

最近版本的 RequireJS 允许您假装普通的 JS 文件实际上是 AMD 模块,它们什么都不返回。

我尝试的最新版本 - 2.1.4 - 实际上允许您将纯 JS 文件视为模块。例子:

require(
    [
        'path/to/module' // <- AMD module
        ,'path/to/plainjs' // <- actually a plain JS file
    ]
    , function(module, plain){
        // module will be per define in that file.
        // plain will be 'undefined' type
    }
)

您可以自由地将类似模块的引用混合到普通的 JS 文件中。只要它们以正确的顺序加载,它们就会更新它们更新的任何全局变量,你就会得到你想要的。例子:

require(['js/underscore'], function(){

    // nesting to insure Underscore, a prereq to BackBone
    // completes loading before backbone starts
    require(
        [
            'path/to/module' // <- AMD module
            ,'js/backbone' // <- actually a plain JS file
        ]
        , function(module){
            // module will be per define in that file.

            window.BackBone // is available for you

        }
    )

})

请注意,虽然 RequireJS 曾经要求您将“.js”添加到纯 JS 文件的末尾以表明它们是纯 JS,但在上面的示例中,您不使用“.js”这个,无扩展名的模块引用允许要遵循的模块 IDpathsmaps别名,而带有的 ID.js被视为文字并且从不翻译。

于 2013-01-30T11:56:12.350 回答
1

您可以手动在脚本标签中包含额外的脚本,但这可能会成为您的团队总是中断的原因(有人忘记添加特定的脚本)。

您可以从“绝对类型化”中引用 require.d.ts 定义并直接调用函数require而不是import语句,这可能会使您的事情更加一致。

于 2013-01-29T17:04:14.350 回答