标签: google-closure-compiler

闭包编译器并不总是内联枚举。为什么?

enumGoogle 的闭包编译器在决定 an是否内联时遵循哪些规则?

当我通过闭包编译器运行代码时,JSDoc注释 enum类型未内联。然而,当我创建一个简化的示例时,enum类型是内联的,正如这个无意义的示例将演示的那样:

 var my_name_space = (function () {
     'use strict';

     /** @enum {number} */
     var TASK_STATUS = {
         REJECT: -1,
         UNKNOWN: 0,
         APPROVE: 1
     };

     function init_(a) {
         if (a === TASK_STATUS.UNKNOWN) {
             alert("Reject");
             a = TASK_STATUS.REJECT;
         } else if (a === TASK_STATUS.APPROVE) {
             alert("Unknown");
             a = TASK_STATUS.UNKNOWN;
         } else {
             alert("Approve");
             a = TASK_STATUS.APPROVE;
         }
         return a;
     }
     return { init: init_};

 }());  // my_name_space


 my_name_space.init(-1);
Run Code Online (Sandbox Code Playgroud)

闭包的输出:

 var my_name_space=function(){return{init:function(a){0===a?(alert("Reject"),a=-1):1===a?(alert("Unknown"),a=0):(alert("Approve"),a=1);return …
Run Code Online (Sandbox Code Playgroud)

javascript enums google-closure-compiler

5
推荐指数
1
解决办法
808
查看次数

Google Closure 编译器错误地删除了函数调用

我正在开发一个 HTML5 游戏,在高级模式下使用 Phaser 和 Google Closure 编译器来打包游戏。

我遇到了一个问题,似乎我无法销毁精灵。检查编译器的输出后,我注意到它不断删除我的销毁函数调用。

我的代码很简单,我已经测试了以下内容:

sprite.destroy();Phaser.Component.Destroy.prototype.destroy.call(sprite);

这两行都只是从我的代码库中删除。这并不是因为它是无法访问的代码,如果我将console.log语句放在相同的范围内,它们就会保留在那里。

所以原来的代码是这样的:

if (typeof this.sprite != 'undefined'){
    console.log('destroy sprite');
    this.sprite.destroy();
    Phaser.Component.Destroy.prototype.destroy.call(this.sprite);
    console.log('sprite destroyed');
}
Run Code Online (Sandbox Code Playgroud)

它被编译为:

"undefined"!=typeof this.sprite&&(console.log("destroy sprite"),console.log("sprite destroyed"))
Run Code Online (Sandbox Code Playgroud)

我不明白为什么代码被删除,Phaser 设置为外部,并且我没有使用任何其他方法或 Phaser 类遇到此问题。

顺便说一下,简单地调用eval('this.sprite.destroy();');就可以了。这证明该函数确实存在。然而,这是一个非常糟糕的解决方案,并且只有在编译器在这种情况下没有替换时才有效sprite

更新

我已经能够用很少的代码可靠地重现该问题,请参阅下面的答案。但我还不知道为什么会发生这种情况。

更新2

感谢 Hacketo,我们发现出现此问题是因为缺少正确的 Phaser 外部文件。专门针对此问题创建一个文件可以修复它,但是如果没有完整的文件,总会有可能出现更多问题。

对于这个特定问题,添加以下文件作为 extern 修复了它:http ://pastebin.com/nXA0fiZr

javascript google-closure-compiler typescript phaser-framework

5
推荐指数
1
解决办法
485
查看次数

如何在闭包编译器的 javascript 中注释嵌套对象并使所有属性可选?

这是我的 A 类,我希望所有选项都是可选的。它适用于 a、b、c 属性,但不适用于 c.cX 属性。如何正确地使所有属性成为可选?

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// ==/ClosureCompiler==

/**
 * @typedef {{
 *     a: (string|undefined),
 *     b: (number|undefined),
 *     c: ({
 *         ca: (string|undefined),
 *         cb: (number|undefined),
 *         cc: (Function|undefined)
 *     }|undefined)
 * }}
 */
var Options;


/**
 * @param {Options=} options
 * @constructor
 */
var A = function(options) {
    console.log(this);
};


new A({
    a: 'x',
    c: {
        ca: 'x',
        //cb: 1,
        cc: function() {}
    }
});
Run Code Online (Sandbox Code Playgroud)

javascript google-closure-compiler

5
推荐指数
1
解决办法
365
查看次数

Change default Laravel Mix Minimizer/Minifier (webpack)

Is there a way to change the default minifier that Laravel Mix uses?

By default, it uses 'Terser' (the Webpack default), but I would like it to instead use Closure Compiler (see here).

I have tried various things but have not had any luck yet. This is my latest failed attempt:

mix.webpackConfig({
    module: {
        rules: [
            // ...
        ]
    },
    plugins: [
        // ...
    ],
    resolve: {
        alias: {
            // ...
        }
    },
    optimization: {
        minimizer: [
            new ClosurePlugin({mode: …
Run Code Online (Sandbox Code Playgroud)

javascript google-closure-compiler webpack webpack-plugin laravel-mix

5
推荐指数
0
解决办法
559
查看次数

google closure编译jQuery插件

我正在测试谷歌闭包编译器,并希望使用选项"高级" 编译facebox插件,尝试查找"aH"的函数发生错误.

有没有人试图用这个选项编译jQuery插件,效果很好.

谢谢.

编辑: 显然这重新命名jQuery方法,但是可以包含jQuery并同等地重命名所有方法吗?

编辑

带有"externs_url"选项的代码示例:

with closure-compiler

js输入代码

// ==ClosureCompiler==
// @output_file_name default.js
// @formatting pretty_print
// @compilation_level ADVANCED_OPTIMIZATIONS
// @warning_level QUIET
// @externs_url http://code.jquery.com/jquery-1.5.min.js
// ==/ClosureCompiler==

// ADD YOUR CODE HERE

var test = function($, context) {

  var
    _self = this;

  _self.mymethod = function() {

    var lista = $("a", context);

    lista.attr("target", "_blank");

    return lista.html();

  };


  return {"mymethod":_self.mymethod};

}.call({}, jQuery, context);    
Run Code Online (Sandbox Code Playgroud)

js输出代码

(function(b, c) {
  this.a = function() {
    var a = b("a", …
Run Code Online (Sandbox Code Playgroud)

jquery google-closure-compiler

4
推荐指数
1
解决办法
4932
查看次数

单击关闭窗口工具来编译文件夹中的所有js文件

是否有工具或bat文件或某些允许一次单击将文件夹中的所有js文件编译成一个已编译的js文件?

谢谢.

javascript windows minify google-closure-compiler

4
推荐指数
1
解决办法
1369
查看次数

是否可以使用闭包编译器ADVANCED_OPTIMIZATIONS与jQuery?

我不断收到给定对象不存在函数(重命名)的错误.是否有发布或设置或其他东西使它工作?

javascript compiler-construction jquery google-closure google-closure-compiler

4
推荐指数
2
解决办法
4506
查看次数

在JavaScript中为Google Closure编译器注释Singleton对象,或"危险使用全局此对象"警告

我正在使用ADVANCED_OPTIMIZATIONS编译级别的Google Closure Compiler并开始注释我的构造函数,因为我收到了各种警告:

警告 - 危险使用全局此对象

对于我的'构造函数'类型函数,我将像这样注释它们:

/**
 * Foo is my constructor
 * @constructor
 */
Foo = function() {
   this.member = {};
}

/**
 * does something
 * @this {Foo}
 */
Foo.prototype.doSomething = function() {
   ...
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好,但是如果我有一个'singleton'对象不是用var myFoo = new Foo()构造的呢?我在文档中找不到如何注释这种类型的对象,因为它的类型只是对象吗?

Bar = {
   member: null,
   init: function() {
      this.member = {};
   }
};
Run Code Online (Sandbox Code Playgroud)

javascript google-closure-compiler jsdoc

4
推荐指数
2
解决办法
2343
查看次数

closure编译器/ uglifyjs - this.function名称没有缩短?

如果我通过闭包编译器或uglifyjs运行这段代码,this.init不会缩短..任何人都可以告诉我为什么会这样?

function test() {
    var v = "abc";
    this.init = function() {
         alert('var = ' + v + ' and func = ' + f());
         f2();
    }
    function f() {
        return 'def';
    }
    function f2() {
        v = "ghi";
        alert('blabla');
        alert('filler');
    }
}

test();
Run Code Online (Sandbox Code Playgroud)

uglifyjs把它变成:

function test(){function c(){a="ghi",alert("blabla"),alert("filler")}function b(){return"def"}var a="abc";this.init=function(){alert("var = "+a+" and func = "+b()),c()}}test()
Run Code Online (Sandbox Code Playgroud)

美化是:

function test() {
    function c() {
        a = "ghi", alert("blabla"), alert("filler")
    }
    function b() {
        return "def"
    }
    var a = "abc";
    this.init …
Run Code Online (Sandbox Code Playgroud)

compression jquery function google-closure-compiler uglifyjs

4
推荐指数
1
解决办法
920
查看次数

由于Jquery的$未声明,无法使用ant和closure编译器编译javascript

我试图让谷歌闭包编译器工作来编译我使用Jquery的javascript代码,但我一直在变量$ is unclared有没有办法让它看到$变量.有没有办法让闭包编译器看到Jquery库但不能编译它.这是我的蚂蚁脚本

<?xml version="1.0"?>
<project basedir="." default="compile">

<taskdef name="jscomp" classname="com.google.javascript.jscomp.ant.CompileTask"
       classpath="build/compiler.jar"/>

<target name="compile">

<jscomp compilationLevel="simple" warning="verbose" 
        debug="false" output="output/file.js">

  <sources dir="${basedir}/src">
    <file name="js.js"/><!-- the file I'm trying to compile -->
  </sources>

</jscomp>

</target>

</project>
Run Code Online (Sandbox Code Playgroud)

我的Jquery库名为min.js,它位于带有js.js的src文件夹中

我确信这是一个简单的问题,但我只是遗漏了一些东西.提前致谢!

javascript ant jquery google-closure-compiler

4
推荐指数
1
解决办法
3313
查看次数