使用 requireJS 加载标准 JavaScript 文件

Load standard javascript files with requireJS

本文关键字:JavaScript 文件 标准 加载 requireJS 使用      更新时间:2023-09-26

我正在尝试requireJS,以便使用Knockout改善Javascript在 ASP.NET MVC应用程序上的加载。

我有一些文件定义了自定义 ko 绑定,如下所示:

(function (ko, bindings) {
    bindings.stopBinding = {
        init: function () {
            return { controlsDescendantBindings: false };
        }
    };
    bindings.anotherBinding = { ... };
})(ko, ko.bindingHandlers);

如果我尝试以这种方式将其加载为 requireJS 模块:

define(['jquery', 'knockout', 'custom/knockout.bindings'], function ($, ko){
   ko.applyBindings(...);
});

我收到一个ko is not defined错误。

我知道我可以将这个文件包含在一个需要回调中,例如为了使其工作:

require(['knockout'], function (ko) {
    (function (ko, bindings) {
        bindings.stopBinding = {
            init: function () {
                return { controlsDescendantBindings: false };
            }
        };
        bindings.anotherBinding = { ... };
    })(ko, ko.bindingHandlers);
});

有没有另一种方法可以让这个文件工作,而不必更新应用程序中的每个旧版JS文件?我想过使用填充程序,但我一无所获,但我是一个 requireJS 的菜鸟,所以也许我错过了一些明显的东西。

多亏了这个答案,我设法将 Knockout 注入到全局命名空间中,使其可用于需要它的遗留 Javascript 文件。

首先,创建一个在全局命名空间中注入 ko 的模块:

define('knockout.inject', ['knockout'], function (k) {
    window.ko = k;
    return k;
});

然后,将模块映射到挖空,以针对每个挖空依赖项执行它。

var require = {
    baseUrl: "/Scripts",
    paths: {
        //...
        "knockout": "knockout-3.3.0.debug",
        "knockoutbindings": "knockout.bindings",
    },
    shim: {
        "knockoutbindings": {
            deps: ["knockout"]
        }
    },
    map: {
        // inject ko back in the global namespace
        '*': {
            'knockout': 'knockout.inject'
        },
        // prevent cycles
        'knockout.inject': { 'knockout': 'knockout' }
    }
};