我正在开发一个项目,该项目使用Google的闭包编译器,并启用了高级优化。我想在汇编中包含moment.js,但是我的所有尝试都没有结果。
我已尝试导出时刻函数,但仍存在运行时问题,以及一些编译错误。
有没有人使用高级优化成功编译了moment.js,或者知道怎么做?
我能想出的唯一解决方案是将缩小的文件连接到已编译的源,并使用externs为我使用的每个函数提供。但这不是一个理想的解决方案。
答案 0 :(得分:1)
我看到代码的两个问题,在momentjs与ADVANCED_OPTIMIZATIONS兼容之前必须纠正。可能会有更多,但这些是明显的:
.fn
的所有引用都需要替换为.prototype
。extend
方法隐藏编译器中的定义。必须重构extend
辅助函数的所有使用,以便它们不会隐藏编译器的属性赋值。答案 1 :(得分:1)
截至2015年3月26日,我无法让它工作,但this的存在表明它可能。 Here are the externs
答案 2 :(得分:0)
您必须针对moment.js(或整个对象)使用自己的externs文件(或整个对象,但我发现无故有一些额外的工作)。
例如,我有这个代码片段来测试输入的日期是否在从现在开始的14天之内
$checkout.find('.date-input').on('input', /** @this {Element} */ function () {
const $this = $(this);
const Days = Number($this.attr('data-days'));
if (Days > 0 && moment(/** @type {string} */($this.val())).diff(moment(), 'days') < Days) {
$checkout.find('.date-warning').removeClass('d-none');
} else {
$checkout.find('.date-warning').addClass('d-none');
}
});
我要让它在高级模式下正确编译的唯一方法是创建此外部代码。
/**
* @fileoverview Externs for moment
*
* @externs
*/
/**
* @param {string=} date
* @constructor
* @return {!moment}
*/
function moment(date) {}
/**
* @param {!moment} m
* @param {string} unit
* @return {number}
*/
moment.diff = function (m, unit) {};
moment.prototype.diff = moment.diff;
现在很明显,矩函数的描述并不完美;它缺少了矩函数具有的一些参数,但是我没有使用它们,所以对我来说没关系。
但这就是我开始外派的方式。从需要开始,我便开始使用基础软件,然后继续使用库中需要的更多功能来扩展externs文件。
别忘了用标志--externs 'externs/moment.js'
告诉Closure Compiler你的外部文件在哪里。