如何使用闭包编译器优化Javascript并保留函数名?

如何使用闭包编译器优化Javascript并保留函数名?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,我有一个javascript文件(lib.js),我想使用一些 函数,但我不想加载完整的lib.js 然而,我还没有弄明白如何做我想做的事。我想 使用命令行 lib.js function dog() { return 'Fido'; } function famous_human() { return 'Winston'; } function human() { return famous_human(); } code-calling-functions-in

我有一个javascript文件(lib.js),我想使用一些 函数,但我不想加载完整的lib.js

然而,我还没有弄明白如何做我想做的事。我想 使用命令行

lib.js

function dog() {
    return 'Fido';
}

function famous_human() {
    return 'Winston';
}

function human() {
    return famous_human();
}
code-calling-functions-in-lib.js

alert(human());
所需结果,lib-compiled.js

function a() {return 'Winston';}function human() {return a();}
  • 功能狗被删除,因为我不使用它
  • 优化了人的功能
  • 函数human有它的原始名称,因为我想从其他代码调用它
  • code-calling-functions-in-lib.js中没有代码

我的问题有一个简单的答案吗?

您可以导出人类:

function human() {
    return famous_human();
}

window['human'] = human;

由于导出符号会阻止死代码消除,因此最佳做法是将特定于项目的导出保存在单独的文件中,而不包括在库中

例子 库源代码-liba.js 项目特定的导出-Project_Exports.js 编译命令
好的,但是你能更具体一点吗?我可能真的很愚蠢,但我确实需要一个证明自己愚蠢的例子。关于这个问题,我已经读了很多书,尝试了很多例子,但是我没有让它发挥作用。是的@user2473324作为第一个让它发挥作用的尝试,你可以把这一行放在
lib.js
中。在@user2473324上尝试一下,当我用额外的导出行编译你问题中的三个函数时,我得到的结果是:
window.human=function(){return“Winston”}
,这将允许您从其他脚本调用
human()
,因为
window
是全局上下文。我相信@Chad Killingsworth比我更熟悉闭包,所以也许他也可以给出一些建议。@user2473324注释中有太多的内容需要解释,所以我在答案中添加了示例。
function human() {
    return famous_human();
}

window['human'] = human;
function dog() {
  return 'Fido';
}

function famous_human() {
  return 'Winston';
}

function human() {
  return famous_human();
}
window['human'] = human;
java -jar compiler.jar \
  --compilation_level ADVANCED_OPTIMIZATIONS \
  --js liba.js \
  --js project_exports.js \
  --js project_source.js \
  --js_output_file project_compiled.js