如何将momentjs添加到缩小的捆绑文件中?

时间:2015-04-13 07:29:00

标签: javascript dojo requirejs bundle momentjs

我将在项目中添加momentjs库(及其moment-timezone插件)。在这个项目中,我使用dojo及其AMD加载程序(与requirejs非常相似)在调试模式下工作。但是对于生产环境,我创建了三个缩小的包:一个包含所有外部库(如jquerybootstrap和其他插件),另一个包含私有js框架,第三个包含特定代码为申请。

好吧,在开发模式下,momentjs没有问题,因为在配置文件中定义了它的路径后,它被正确加载,但我想将它添加到外部包文件中。我在这里遇到问题,因为虽然捆绑文​​件中包含momentjs代码,但{em} moment.jsmoment-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模块加载,这导致即使在生产环境中也要加载其文件。那么如何在不修改原始源代码的情况下避免这个问题呢?我认为如果将它作为全局变量加载,它应该可以工作,但还有其他方法可以解决这个问题吗?

对于这篇大文章感到抱歉,但我已尽力尽力开除。

1 个答案:

答案 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仅供参考。选择一些可能不会引起冲突的事情。