将 RequireJS 与非 AMD JavaScript 文件一起使用

Using RequireJS alongside non-AMD JavaScript files

本文关键字:一起 文件 JavaScript RequireJS 与非 AMD      更新时间:2023-09-26

我正在尝试将一个JavaScript繁重的页面转换为使用TypeScript,并使用RequireJS来管理模块依赖项。

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

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

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

最新版本的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" 这种无扩展模块引用允许模块 ID 跟随 pathsmaps别名,而带有 .js 的 id 被视为文字,永远不会被翻译。

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

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