我正在尝试使用 Google Closure Compiler 根据将要运行的位置(在服务器上与客户端上)通过单个变量拆分我的应用程序代码。在此示例中,将在服务器上调用的所有内容都在 isServerSide 变量后面,但是,正在为客户端编译代码。所以我将 isServerSide 设置为 false 并让编译器删除客户端不会运行的所有内容......
app.js 内部:

goog.provide('my.app');
my.app.log = function(message) {
  document.write(message);
}
my.app.initClientSide = function() {
  my.app.log('hello client');
}

my.app.initServerSide = function() {
  my.app.log('hello server');
}

if (isServerSide) {
  my.app.log('initing server');
  my.app.initServerSide()
}else my.app.initClientSide();
externs.js 内部:
/**
 * @define {boolean} is server side?
 */
var isServerSide=false;

命令:
java -jar bin/compiler.jar --js closure-library/closure/goog/base.js --js app.js --externs externs.js --manage_closure_dependencies true --process_closure_primitives true --summary_detail_level 3 --warning_level VERBOSE --compilation_level=ADVANCED_OPTIMIZATIONS --closure_entry_point my.app

预期输出:
document.write("hello client");

实际输出:
isServerSide?(document.write("initing server"),document.write("hello server")):document.write("hello client");

如果我在 isServerSide=false; 中手动输入 app.js 那么我可以让它编译为:
isServerSide=false;document.write("hello client");

这让我觉得我的 externs.js 设置错误(或者我只是不明白 externs 实际上应该用于什么)。

有关如何使其工作的任何建议?

最佳答案

您可以通过直接在编译器调用中设置 @define 值来指定它们。
Externs 服务于不同的目的,如 hyperslug 正确状态。

您通过将 @define 定义(来自您的 extern)放入 app.js 然后像这样调用编译器来实现预期的结果:

java -jar compiler.jar \
--define "isServerSide=false" \
--js closure-library/closure/goog/base.js \
--js app.js \
--manage_closure_dependencies true \
--process_closure_primitives true \
--summary_detail_level 3 \
--warning_level VERBOSE \
--compilation_level=ADVANCED_OPTIMIZATIONS \
--closure_entry_point my.app

关于javascript - Google Closure Compiler - 基于 externs 的死代码移除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8059572/

10-10 23:48