使用谷歌闭包和高级优化编译moment.js

时间:2014-11-19 06:30:58

标签: momentjs google-closure-compiler

我正在开发一个项目,该项目使用Google的闭包编译器,并启用了高级优化。我想在汇编中包含moment.js,但是我的所有尝试都没有结果。

我已尝试导出时刻函数,但仍存在运行时问题,以及一些编译错误。

有没有人使用高级优化成功编译了moment.js,或者知道怎么做?

我能想出的唯一解决方案是将缩小的文件连接到已编译的源,并使用externs为我使用的每个函数提供。但这不是一个理想的解决方案。

3 个答案:

答案 0 :(得分:1)

我看到代码的两个问题,在momentjs与ADVANCED_OPTIMIZATIONS兼容之前必须纠正。可能会有更多,但这些是明显的:

  1. 使用原型的别名:.fn的所有引用都需要替换为.prototype
  2. 使用辅助函数添加方法: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你的外部文件在哪里。