如何将 momentjs 添加到缩小的捆绑文件中?
How to add momentjs to a minified bundle file?
我打算在项目中添加 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 模块加载,这导致即使在生产中也加载其文件环境。那么如何在不修改原始源代码的情况下避免这个问题呢?我想如果它作为一个全局变量加载,它应该可以工作,但是有没有其他方法可以解决这个问题?
很抱歉这么大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
用于说明目的。选择合理的可能不会引起冲突的东西。
我打算在项目中添加 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 模块加载,这导致即使在生产中也加载其文件环境。那么如何在不修改原始源代码的情况下避免这个问题呢?我想如果它作为一个全局变量加载,它应该可以工作,但是有没有其他方法可以解决这个问题?
很抱歉这么大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
用于说明目的。选择合理的可能不会引起冲突的东西。