标签: google-closure-compiler

如何使用 Google 的 Closure Compiler 编译 ES6 模块

在实现一些新功能之前,我一直在审查过去项目的代码。目标之一是通过将代码迁移到 ES6 模块来简化代码的管理。这一切进展顺利,让生活变得更加轻松。

但是,在构建最终应用程序的过程中,我们一直在使用 Google 的 Closure Compiler 来缩小代码。这运行良好,但现在......

拿这个示例 HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML file to test compilation of JS modules</title>
</head>
<body>

<script src="JSModule1.js" type="module"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

并添加这两个模块

JSModule1.js

import {Thing} from './JSModule2.js'

let item = new Thing('Something');
let otherItem = new Thing();

item.speak();
otherItem.speak();
Run Code Online (Sandbox Code Playgroud)

JSModule2.js

function Thing(word) {
    let words = (word || "I've nothing to say.");
    this.speak = function() {
        console.log(words);
    }
}

export {Thing}
Run Code Online (Sandbox Code Playgroud)

如果我尝试编译,JSModule1.js我会收到一个错误:

JSC_JS_MODULE_LOAD_WARNING: Failed to load …

javascript module google-closure-compiler

6
推荐指数
0
解决办法
913
查看次数

Angular 中的惯用条件 TypeScript 编译

我正在使用 Angular 9,我有一些这样的代码:

(features.ts, autogenerated:)
// AUTO-GENERTATED FILE. DO NOT EDIT!
export const Features = {
  // Whether to reveal our Secret New Feature to the world
  ENABLE_SECRET_FEATURE: 1
};

(mycode.ts, app code)
import { Features } from 'generated/features.ts';

function doSomething() {
  if (Features.ENABLE_SECRET_FEATURE) {
    doAIBlockChainARThing();
  } else {
    doSomeBoringOldCRUDThing();
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望发出的代码是

function doSomething() {
    doAIBlockChainARThing();
}
Run Code Online (Sandbox Code Playgroud)

或者

function doSomething() {
    doSomeBoringOldCRUDThing();
}
Run Code Online (Sandbox Code Playgroud)

但不是两者兼而有之。

是否有调用ng build它会发生这种情况?我知道 uglify 可以做到这一点,而 Closure Compiler 当然可以。我目前的调用是:ng build --aot=true --stats-json --buildOptimizer=true --optimization=true …

google-closure-compiler typescript webpack angular terser

6
推荐指数
1
解决办法
313
查看次数

如何在 Javascript 中同步计算 SHA-256?

我有一个普通的 javascript 项目,它使用 ClosureCompiler 生成缩小的 js 文件。该文件是一个 SDK,人们可以将其包含在自己的网站中。我需要计算 SHA-256 哈希值,但事实证明它比应有的更加棘手。

我想要的是:

const data = "test"
const hashedData = SHA256(data);
Run Code Online (Sandbox Code Playgroud)

要求:

  1. 应该是同步的。
  2. 应该与普通的 javascript 一起工作。
  3. 应该使用闭包编译器进行编译。
  4. 不应需要依赖外部网站。我很乐意将代码从外部库复制到我自己的项目中。但它应该是像 SJCL 这样值得信赖/可靠的库。

我尝试过的:

Webcrypto.subtle:这返回一个 Promise,而不是一个字符串。它需要我使我的 SHA256 函数异步。这将需要大量的重新架构。

SJCL:不使用闭包编译器进行编译。

javascript sha google-closure-compiler

6
推荐指数
0
解决办法
1305
查看次数

Closure Compiler - a ++> = 3会变成++ a> 3吗?

我承认我问过一个问题,为什么Closure Compiler不会缩短几天前一见钟情的某些代码,但是这个原因并不适用于这种情况,我不确定为什么它没有缩短这里.

我的代码是:

var a = 0;
function b() {
    return a++ >= 3;
}
Run Code Online (Sandbox Code Playgroud)

现在有预增量和后增量.所不同的是返回值- a++收益a增加了,++a第一增量a返回.

这归结为我的代码可以缩短为(忽略空白删除):

var a = 0;
function b() {
    return ++a > 3;
}
Run Code Online (Sandbox Code Playgroud)

但是,Closure Compiler似乎没有改变(或认识)这一点.

因此,我的问题是:++a >使用时会产生哪些副作用而不是a++ >=

javascript pre-increment post-increment google-closure-compiler

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

我如何使用closurebuilder来编译和缩小脚本

我是关闭库的新手,我开始了.我刚刚在我的windows7机器上安装了Python,想要连接和缩小脚本.我按照这里记录的那些命令执行了一些但没有收获 这里有一些参数

  • Python安装在 c:\python27\python.exe

  • 关闭库 c:\closure\

  • Closure编译器 c:\closure\bin\build\compiler.jar

  • 我的Javascript文件 D:\projects\closureapp\js\index.js

index.js的内容如下

/// <reference path="../closure/base.js" />
/// <reference path="../closure/dom/dom.js" />


/*Hello world into Closure Library Example*/

//Load the dom module
goog.require("goog.dom");


//refer the document body
var pageBody = document.body;

//after the body is loaded execute and add a header
pageBody.onload = function () {

    //create a header for the page
    var pageHeader = goog.dom.createDom('h1', { 'style': 'background-color:#EEE' }, 'Hello world!');

    //append the header to the document body
    goog.dom.appendChild(pageBody, pageHeader); …
Run Code Online (Sandbox Code Playgroud)

google-closure google-closure-library google-closure-compiler

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

Internet Explorer,Closure Compiler和Trailing Commas

我正在使用html5boilerplate构建脚本并在缩小脚本时(使用Google Closure Compiler)

我收到了这个错误

-js.all.minify:
     [echo] Minifying scripts
     [copy] Copying 3 files to /Users/Username/Desktop/Web/intermediate/js
    [apply] /Users/Juan/Desktop/Web/js/plugins.js:117: ERROR - Parse error. Internet Explorer has a non-standard intepretation of trailing commas. Arrays will have the wrong length and objects will not parse at all.
    [apply]                 }, { duration: 727 })
    [apply] 

             ^
Run Code Online (Sandbox Code Playgroud)

但是,如果运行未编译,代码将在IE 8中运行.

这是代码

anim1.animate({
                    'left': '+=32px',
                    'filter': 'alpha(opacity=100)',
                    '-moz-opacity': '1',
                    '-khtml-opacity': '1',
                    'opacity': '1',
                }, { duration: 727 })
Run Code Online (Sandbox Code Playgroud)

如何让这段代码通过Compulsure Compiler?

谢谢

jquery build-script google-closure google-closure-compiler html5boilerplate

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

对源进行测试,然后对其缩小版进行测试

我有JS项目:源代码+测试.目前测试是在原始资源上运行的,一切都很好.

但随后消息来源缩小了,我想在他们的缩小版本上运行我的所有测试.请注意,由于缩小,所有函数名称都被重命名.它是可解决的任务吗?理想情况下,测试/来源不会有太大变化.

我现在的配置是:TeamCity,karma.js + mocha,闭包编译器(高级优化).

javascript unit-testing google-closure-compiler karma-runner

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

一个进程调用期间的多个stdin/stdout操作

我使用Google Closure Compiler使用PHP自动编译javascript(需要这样做 - 在PHP中,在Windows机器上没有安全限制).我编写了简单的PHP脚本来调用进程,将.js内容传递给stdin并通过stdout接收重新编译的.js.它工作正常,问题是,当我编译例如40 .js文件时,它需要强大的机器将近2分钟.但是,市长延迟是因为java为每个脚本启动.jar应用程序的新实例.有没有办法如何修改下面的脚本来创建进程只有一个并在进程结束前多次发送/接收.js内容?

function compileJScript($s) {
    $process = proc_open('java.exe -jar compiler.jar', array(
        0 => array("pipe", "r"), 1 => array("pipe", "w")), $pipes);
    if (is_resource($process)) {
        fwrite($pipes[0], $s);
        fclose($pipes[0]);
        $output = stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        if (proc_close($process) == 0) // If fails, keep $s intact
            $s = $output;
    }
    return $s;
}
Run Code Online (Sandbox Code Playgroud)

我可以看到几个选项,但不知道是否可能以及如何做到这一点:

  1. 创建一次进程并仅为每个文件重新创建管道
  2. 强制java将JIT-ed .jar保留在内存中,以便更快地重新执行
  3. 如果PHP无法做到,可以使用bridge(另一个.exe文件,每次都会快速启动,传输stdin/out并将其重定向到正在运行的编译器;如果这样的话甚至存在)

php java google-closure-compiler

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

测试对象是否是Google Closure类框架中的接口实现

如何使用Google Closure继承机制测试JavaScript对象是否是接口的实现?


我找不到任何暗示my.Animal在通过创建对象new my.Dog()object instanceof my.Animal没有奏效.忘记在子类中实现方法时,有关接口的唯一信息是编译器错误.

/**
 * @interface
 */
my.Animal = function() {};

/**
 * Does something.
 * @return {string}
 */
my.Animal.prototype.doSomething;

/**
 * @constructor
 * @implements {my.Animal}
 */
my.Dog = function() {};

/** @inheritDoc */
my.Dog.prototype.doSomething() = function {
    return "something";
}

var dog = new my.Dog();
console.log(dog instanceof my.Animal); // returns false
Run Code Online (Sandbox Code Playgroud)

我找到的一种方法是大致测试接口的属性,尽管这在很多方面都很糟糕:

console.log(!!dog.doSomething); // returns true
Run Code Online (Sandbox Code Playgroud)

javascript google-closure google-closure-library google-closure-compiler

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

内联源映射与闭包编译器?

我正在努力调试Closure Compiler编译的js文件及其相应的源映射文件(问题:关联文件的源代码未显示在Chrome / firefox中)。

Closure Compiler是否有办法将源映射“内联”放在已编译的js文件中(而不是生成单独的源映射文件)?

如果不是,是否可以修改已编译的js文件,以用源地图内容替换源地图链接?

javascript google-closure-compiler source-maps

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