Javascript 使用GCC从ES2015传输并注入带有@define注释的变量,Concat几个JS模块
我正在尝试创建一个JavaWeb服务,它为JavaScript文件提供服务,并根据请求在这些文件中注入一些信息。下面是我的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) {
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;
我希望这些脚本
(函数(){/*串联脚本*/})()中
防止全局名称空间的污染李>
main.js中的SCRIPT\u ID
)
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这应该可以按预期工作。(如果同时编译更多的输入文件,它也会起作用)