使用RequireJS和非AMD JavaScript文件

Using RequireJS alongside non-AMD JavaScript files

我正在尝试将一个javascript重页转换为使用typescript,并使用requirejs来管理模块依赖项。

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

把非AMD脚本放在普通的标记中,并假设它们已经加载,这是否非常危险?

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


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

我尝试的最新版本-2.1.4-实际上允许您像处理模块一样处理普通的JS文件。例子:

1
2
3
4
5
6
7
8
9
10
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
    }
)

您可以将类似refs的模块自由地混合到普通JS文件中。只要它们按正确的顺序加载,它们将更新它们更新的全局数据,您就可以得到所需的数据。例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

        }
    )

})

注意,尽管Requirej用于要求您在普通JS文件的末尾添加".js"以表明它们是普通JS,但在上面的示例中,您不使用".js"这一无扩展模块引用允许模块ID跟随pathsmaps别名,而带有.js的ID则被视为文本,并且从不被转换。板条。


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

您可以从"明确键入"中引用require.d.ts定义,并直接调用require函数,而不是import语句,这可能使事情更为一致。