【发布时间】:2015-04-13 07:28:59
【问题描述】:
我将在项目中添加momentjs 库(及其moment-timezone 插件)。在这个项目中,我使用dojo 及其 AMD 加载程序(与requirejs 非常相似)在调试模式下工作。但是对于生产环境,我创建了三个压缩包:一个包含所有外部库(如jquery、bootstrap 和其他插件),另一个包含私有 js 框架,第三个包含应用程序的特定代码。
好吧,在开发模式下momentjs 没有问题,因为在配置文件中定义了它的路径后,它会正确加载,但我想将它添加到外部捆绑文件中。这就是我遇到问题的地方,因为虽然捆绑文件包含 momentjs 代码,但文件 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 模块加载,这会导致即使在生产环境中也可以加载其文件。那么如何在不修改原始源代码的情况下避免这个问题呢?我认为如果将它作为全局变量加载,它应该可以工作,但是还有其他方法可以解决这个问题吗?
对这篇大文章感到抱歉,但我已尽力解释得更好。
【问题讨论】:
标签: javascript dojo requirejs bundle momentjs