【问题标题】:RequireJS module attempts to load shim'ed moduleRequireJS 模块尝试加载 shim'ed 模块
【发布时间】:2013-07-18 05:30:13
【问题描述】:

我在尝试为我组织中的另一个团队编写的某些 javascript 代码创建 RequireJS shim 时遇到问题。该脚本是通过一个正常的 HTML 脚本加载的:

<script src="MyCustomModule.js" type="text/javascript"></script>

我的 main.js 包含以下内容:

requirejs.config({
    paths: { 'text': 'durandal/amd/text' },
    shim: {
        'MyCustomModule': { exports: 'My.Custom.Module' }
    }
});

我已经尝试过以多种方式访问​​自定义模块,但这是我当前的代码:

define(['MyCustomModule'], function (require, MyCustomModule) {
 ...
}

但每次加载页面/应用程序时,我都会从 RequireJS 收到一个错误,表明它无法加载 app/MyCustomModule.js(我可以在控制台中看到 404 错误,它试图从服务器请求文件)。我做错了什么?

【问题讨论】:

    标签: requirejs shim


    【解决方案1】:

    您还需要在paths 中包含MyCustomModule

    requirejs.config({
        paths: {
            'text': 'durandal/amd/text'
            'MyCustomModule': 'path/to/MyCustomModule'
        },
        shim: {
            'MyCustomModule': {
                exports: 'My.Custom.Module'
            }
        }
    });
    

    如果您不这样做,define(['MyCustomModule'] (...) 将在 baseUrl 位置查找依赖项,在您的情况下为:app/MyCustomModule


    换句话说:shim 不能“拾取”未被 RequireJS 加载的全局变量。

    【讨论】:

    • 这是否记录在某处,requirejs.org/docs/api.html#config-shim 处的文档没有提及设置路径的任何内容(但我明天回去工作时肯定会尝试)。
    • 您链接的几乎整个章节 kind of 意味着 shim 仅适用于 RequireJS 加载的依赖项("假设 [libraries] 已安装在 baseUrl 目录中。如果不是,那么您可能需要为它们设置路径配置:", "要加载属于或使用 shim 配置的模块,需要正常的 require/define 调用",等),但你是对的,它似乎没有明确提到它。这是 James Burke 本人提出的相同问题的替代(无垫片)解决方案:groups.google.com/forum/#!msg/requirejs/CI79vnKEsWM/…
    • 这基本上是我们已经在做的,我希望通过实施垫片来清理大约 15 个这些文件。似乎垫片是一种“更清洁”的方式。也许不是……
    • 这确实修复了它,但导致了其他问题。看起来我们应该坚持詹姆斯伯克建议的解决方案。感谢您的信息。