有 requirejs 在模块加载时运行回调

yes*_*ska 4 javascript amd requirejs js-amd

我需要在加载模块时加载 css,所以我使用 shims 这样做:

function loadCss(url) {
    var link = document.createElement("link");
    link.type = "text/css";
    link.rel = "stylesheet";
    link.href = url;
    document.getElementsByTagName("head")[0].appendChild(link);
}

requirejs.config({ paths: paths, shim: {
    'easyzoom': {
        'deps': ['jquery'],
        init: function () { loadCss('/lib/easyzoom/css/easyzoom.css'); }
    }}
});
Run Code Online (Sandbox Code Playgroud)

它适用于其他库,如 Datatables,因为它们是非 Amd 模块。但是对于 Amd 模块,requireJs 不会寻找垫片,因此不会提升我的 init 函数。

有没有办法在加载模块后调用回调?或者加载一个 Amd 模块,因为它是一个普通的 javascript 文件来寻找垫片?

Lou*_*uis 5

shim为适当的 AMD 模块(调用define)定义 a 会导致未定义的行为。

你可以做的是使用map如下:

map: {
    '*': {
        easyzoom: 'easyzoom-intercept'
    },
    'easyzoom-intercept': {
        easyzoom: 'easyzoom'
    }
}
Run Code Online (Sandbox Code Playgroud)

它的作用是指定当任何模块 ( '*') 需要该模块时easyzoomeasyzoom-intercept应改为加载该模块。但是,当easysoom-intercept要加载时easyzoomeasyzoom应该加载模块。然后你创建一个easyzoom-intercept这样的模块:

define([easyzoom], function (ez) {
    loadCss('/lib/easyzoom/css/easyzoom.css');
    return ez;
});
Run Code Online (Sandbox Code Playgroud)

此代码将在easyzoom加载后立即执行。