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

How to add momentjs to a minified bundle file?

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

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

很抱歉这么大post,但我已经尽力把痛苦表达得更好了。

如果您有一个检测 AMD 加载程序并仅在加载程序存在时才声明自己为 AMD 模块的库,并且想要加载此库以使其不将自己声明为 AMD 模块,那么您需要要在 script 元素 中加载此库,然后 加载 AMD 加载器。

或者,必须在加载您的库后加载您的 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 用于说明目的。选择合理的可能不会引起冲突的东西。