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) 我正在开发一个 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
这是我的 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) 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
我正在测试谷歌闭包编译器,并希望使用选项"高级" 编译facebox插件,尝试查找"aH"的函数发生错误.
有没有人试图用这个选项编译jQuery插件,效果很好.
谢谢.
编辑: 显然这重新命名jQuery方法,但是可以包含jQuery并同等地重命名所有方法吗?
编辑
带有"externs_url"选项的代码示例:
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) 是否有工具或bat文件或某些允许一次单击将文件夹中的所有js文件编译成一个已编译的js文件?
谢谢.
我不断收到给定对象不存在函数(重命名)的错误.是否有发布或设置或其他东西使它工作?
javascript compiler-construction jquery google-closure google-closure-compiler
我正在使用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) 如果我通过闭包编译器或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
我试图让谷歌闭包编译器工作来编译我使用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 ×8
jquery ×4
ant ×1
compression ×1
enums ×1
function ×1
jsdoc ×1
laravel-mix ×1
minify ×1
typescript ×1
uglifyjs ×1
webpack ×1
windows ×1