【发布时间】:2013-02-06 18:58:35
【问题描述】:
我刚刚尝试包装我们的一个模块,该模块打算通过 <script> 标记包含在一些样板文件中,以允许使用 requirejs 加载可选的 AMD。
这很痛苦,我能想到的最好办法是:
(function(){
var exports, jQuery;
if (typeof window.define === 'function' && typeof window.requirejs === 'function') {
exports = {};
define(['jquery'], function (jq) {
jQuery = jq;
return thisModule();
});
} else {
exports = window;
jQuery = window.jQuery;
thisModule();
}
function thisModule() {
}
})();
注意这是
- 大量样板文件
- 要求您在变量中声明依赖项(谢天谢地,只有 jQuery)和 amd
- 如果我想获得 CommonJs 支持,还需要更多代码。
我主要关心的是第二点,因为当我超出包装我们的核心文件时,它会变得很糟糕。我确定那里有一些整洁的(呃)包装器实现,但我找不到。
有人有什么建议吗?
【问题讨论】:
-
一个想法:我不会测试
typeof window.requirejs == 'function'。您可能不关心 AMD 的实现。而是测试window.define.amd。但这只是一个调整。 -
感谢@ScottSauyet - 我想我在 knockout.js 源代码的某个地方看到了这一点,想知道这是否是更好的方法。
-
还请注意,Require 可以选择仅使用small amount of configuration 就可以很好地加载非 AMD 模块。因此,尽管您的目标可能是一个有趣的目标,但如果没有它,您也可以侥幸成功。
-
@ScottSauyet - 是的,我知道 shim - 我的部分也是让我们的开发人员明确声明其依赖关系的练习。
标签: javascript amd boilerplate commonjs dynamic-script-loading