使用 GCC 连接多个 JS 模块,从 ES2015 转译并注入带有 @define 注释的变量
Concat several JS modules using GCC with transpiling from ES2015 and injecting variables annotated with @define
我正在尝试创建一个Java Web服务,该服务为JavaScript文件提供服务,并根据请求将一些信息注入到这些文件中。以下是我在javascript
目录中的示例:
主.js:
import {log} from "./lib";
/** @define {string} */
const SCRIPT_ID = "SCRIPT_ID"
let foo = "bar";
log(foo);
// Rest of code
库.js
export function log(str) {
console.log(">>>", str);
};
我希望这些脚本
- 连接在一个文件中; 用
(function() { /* concatenated scripts */ })();
包裹,防止污染全局命名空间;- 修改以用 Java 中的一些变量替换某些代码段(如
main.js
中的SCRIPT_ID
(。
我正在使用Google闭包编译器和以下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_ID
没有注入(因为我一次编译两个文件(,并且我无法将组合结果包装在自调用函数中,因为我在使用 Java 的 GCC 时找不到这样做的方法。如果您使用的是 GCC 命令行工具,您可以为此提供--output_wrapper
选项,但它似乎仅适用于 cli 工具。
有人知道如何解决这个问题吗?也许有一个更好的JavaScript编译器?GCC似乎非常擅长优化JavaScript,但它不适合我的情况。
更新
关于@define
语句,我可以解决它,将所有要用@define
注释的变量放在一个不使用 ES6 模块关键字的单独文件中,即 import
, export
:
全局.js
/** @define {string} */
let SCRIPT_ID = "";
/** @define {boolean} */
let DEBUG = true;
如果将此文件与其他文件一起发送到编译器,则一切按预期工作,注释变量替换为 Java 代码中的相应值。
作为工作对象,您可以将JS文件读入内存,连接并包装它们,然后使用JSSourceFile.fromCode
构建单个源文件并将其馈送到编译器中。
相关文章:
- 使用Objective-C的JavaScript注入方法
- 正在注入包含JS的HTML
- 迷你$provider注入茉莉花和角
- Angularjs工厂注入错误
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- 如何在Ionic Android中将Javascript注入到web视图中
- 为什么要对define.md和module.exports进行条件检查,以及条件何时通过
- Android Webview通过Javascript注入CSS
- Meteor:在启动时将html注入客户端文件
- 注入工厂时,Angular停止工作
- 注入Javascript以选择具有指定值的所有单选按钮
- ACE编辑器正在删除模块,因为define是't一根绳子
- XSS通过地址栏注入
- 注入angularjs指令
- Ember服务在注入组件并在计算属性中使用后是未定义的
- AngularJS依赖注入定时问题
- 如何通过铬扩展注入反应元素
- 如何防止在客户端/服务器两侧对文本框进行sql注入
- 在RequireJS define函数中如何处理参数
- 使用 GCC 连接多个 JS 模块,从 ES2015 转译并注入带有 @define 注释的变量