Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用GCC从ES2015传输并注入带有@define注释的变量,Concat几个JS模块_Javascript_Java_Gcc - Fatal编程技术网

Javascript 使用GCC从ES2015传输并注入带有@define注释的变量,Concat几个JS模块

Javascript 使用GCC从ES2015传输并注入带有@define注释的变量,Concat几个JS模块,javascript,java,gcc,Javascript,Java,Gcc,我正在尝试创建一个JavaWeb服务,它为JavaScript文件提供服务,并根据请求在这些文件中注入一些信息。下面是我的javascriptdir中的示例: main.js: import {log} from "./lib"; /** @define {string} */ const SCRIPT_ID = "SCRIPT_ID" let foo = "bar"; log(foo); // Rest of code lib.js export function log(str) {

我正在尝试创建一个JavaWeb服务,它为JavaScript文件提供服务,并根据请求在这些文件中注入一些信息。下面是我的
javascript
dir中的示例:

main.js:

import {log} from "./lib";

/** @define {string} */
const SCRIPT_ID = "SCRIPT_ID"
let foo = "bar";
log(foo);

// Rest of code
lib.js

export function log(str) {
    console.log(">>>", str);
};
/** @define {string} */
let SCRIPT_ID = "";

/** @define {boolean} */
let DEBUG = true;
我希望这些脚本

  • 被连接在一个文件中
  • 包装在
    (函数(){/*串联脚本*/})()中
    防止全局名称空间的污染
  • 被修改为使用Java中的一些变量替换某些代码段(如
    main.js中的
    SCRIPT\u ID
  • 我正在使用Google Closure编译器进行此操作,并使用以下Java代码:

    CompilerOptions options = new CompilerOptions();
    options.setLanguageIn(CompilerOptions.LanguageMode.ECMASCRIPT6);
    options.setLanguageOut(CompilerOptions.LanguageMode.ECMASCRIPT5);
    options.setInlineVariables(CompilerOptions.Reach.ALL);
    options.setDefineToStringLiteral("SCRIPT_ID", "12345");
    
    嗯,它不起作用。
    SCRIPT\u ID
    没有被注入(因为我一次编译了两个文件),并且我不能将组合的结果包装到自调用函数中,因为在使用Java中的GCC时,我找不到一种方法。如果您使用的是GCC命令行工具,您可以为此提供
    --output\u wrapper
    选项,但它似乎只适用于cli工具

    有人知道如何解决这个问题吗? 也许有更好的JavaScript编译器?GCC似乎非常擅长优化JavaScript,但它不适合我的情况

    更新

    关于
    @define
    语句,我可以将所有要用
    @define
    注释的变量放在一个单独的文件中,该文件不使用ES6模块关键字,即。e<代码>导入
    导出

    globals.js

    export function log(str) {
        console.log(">>>", str);
    };
    
    /** @define {string} */
    let SCRIPT_ID = "";
    
    /** @define {boolean} */
    let DEBUG = true;
    

    如果您将此文件与其他文件一起发送到编译器,则一切正常,带注释的变量替换为Java代码中的相应值。

    作为工作,您可以将JS文件读入内存,压缩并包装它们,然后使用
    JSSourceFile.fromCode
    构建单个源文件并将其输入编译器。

    好主意,但是@define annotations呢?@coquin这应该可以按预期工作。(如果同时编译更多的输入文件,它也会起作用)