我将在项目中添加momentjs
库(及其moment-timezone
插件)。在这个项目中,我使用dojo
及其AMD加载程序(与requirejs
非常相似)在调试模式下工作。但是对于生产环境,我创建了三个缩小的包:一个包含所有外部库(如jquery
,bootstrap
和其他插件),另一个包含私有js框架,第三个包含特定代码为申请。
好吧,在开发模式下,momentjs
没有问题,因为在配置文件中定义了它的路径后,它被正确加载,但我想将它添加到外部包文件中。我在这里遇到问题,因为虽然捆绑文件中包含momentjs
代码,但{em} moment.js
和moment-timezone-with-data.js
文件也被加载,因为它们是必需的模块的开头。
要解决类似文件的这个问题,我使用条件加载文件。例如,这适用于jquery
:如果我正在调试该库是明确加载的。如果我没有调试,我认为它是通过捆绑文件加载的,并且它可以正常运行,因为$
被加载为全局变量。
我的问题的根源:momentjs
会在开头进行检查,以查看是否定义了define
函数:
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
global.moment = factory()
}(this, function () {
'use strict';
[...]
});
显然,define
函数由dojo
定义,并且引发momentjs
必须始终作为amd模块加载,这导致即使在生产环境中也要加载其文件。那么如何在不修改原始源代码的情况下避免这个问题呢?我认为如果将它作为全局变量加载,它应该可以工作,但还有其他方法可以解决这个问题吗?
对于这篇大文章感到抱歉,但我已尽力尽力开除。
答案 0 :(得分:1)
如果您有一个检测到AMD加载程序的库并且仅在加载器存在时将其自身声明为AMD模块,并且想要加载此库以使其不将其自身声明为AMD模块,那么您需要加载在加载AMD加载程序之前,script
元素中的此库。
或者,必须在加载AMD加载程序后加载库,您可以暂时取消定义define
并在之后再次定义:
<script>
my_variable_for_saving_define = define;
window.define = undefined;
</script>
<script [that loads your module]></script>
<script>
define = my_variable_for_saving_define;
</script>
my_variable_for_saving_define
仅供参考。选择一些可能不会引起冲突的事情。