【问题标题】:Is there a way to have RequireJS modules depend on code loaded with <script>?有没有办法让 RequireJS 模块依赖于 <script> 加载的代码?
【发布时间】:2015-03-06 21:31:43
【问题描述】:

我在一个项目中,我们正在开发一个小部件系统。我将尽量不详细介绍这一点,但在这个系统中,小部件必须能够指定其依赖项。我们通过允许小部件使用 RequireJS 指定其第 3 方依赖项来实现这一点。

小部件用于内部开发的应用程序。这些应用程序不使用 RequireJS 作为它们自己的依赖项,它们只是为了小部件而包含 RequireJS。

现在,假设我有一个小部件想要使用库 X。X 是一个指定 AMD 对 jQuery 的依赖的库(AMD 模块 jquery)。现在,jQuery 包含在每个内部开发的应用程序中(它是我们应用程序的核心部分),所以这应该不是问题。但是,由于 jQuery 不是通过 RequireJS 加载的(它是在包含 RequireJS 之前通过脚本标签手动加载的),因此 AMD 模块永远不会注册,并且库 X 无法加载,因为它找不到 jquery 模块。

如何让库 X 找到 AMD 模块 jquery,即使没有使用 RequireJS 加载 jQuery?我怀疑以某种方式使用 RequireJS 垫片 (http://requirejs.org/docs/api.html#config-shim) 可以解决这个问题,但我还没有弄清楚如何解决。非常感谢任何帮助。

【问题讨论】:

    标签: requirejs amd


    【解决方案1】:

    方法是这样的:

    define('jquery', [], function () {
        return jQuery;
    });
    

    这只是获取通常通过script 加载的jQuery 并使其可用作RequireJS 模块

    同样的原则也适用于在之前 RequireJS 加载的任何其他库,并将自身导出为全局空间中的符号:只需为其创建一个伪模块,该模块仅返回库导出的符号全局空间。

    您可以将该代码放在一个名为jquery.js 的单独文件中,并将define 设置为define([], function () {(没有模块名称),但我认为这样做没有多大好处。我更喜欢使用上面第一个 sn-p 中的模块名称调用 define,并将定义放在我调用 require.config 之前。

    【讨论】:

    • 感谢您精心编写的答案!我想这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    相关资源
    最近更新 更多