Javascript 闭包编译器:如何将对象及其所有属性声明为extern?

Javascript 闭包编译器:如何将对象及其所有属性声明为extern?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,我正在尝试编译我的Google Chrome扩展,它使用了Chrome.i18n.getMessage()和一些其他Chrome属性 我使用Java库进行编译,有一个externs.js文件,其中包含--externs参数 我想知道是否可以将chrome声明为extern,而不必指定我要保留的所有属性 到目前为止,我已经尝试了以下三种方法: 示例1: /** @const */ var chrome = {}; // chrome.i18n.getMessage() gets renamed t

我正在尝试编译我的Google Chrome扩展,它使用了
Chrome.i18n.getMessage()
和一些其他
Chrome
属性

我使用Java库进行编译,有一个
externs.js
文件,其中包含
--externs
参数

我想知道是否可以将
chrome
声明为extern,而不必指定我要保留的所有属性

到目前为止,我已经尝试了以下三种方法:

示例1:

/** @const */
var chrome = {}; // chrome.i18n.getMessage() gets renamed to chrome.a.b()
/** @const */
window.chrome = {}; // chrome.i18n.getMessage() gets renamed to chrome.a.b()
/* chrome.i18n.getMessage() is preserved, but chrome.runtime.connect() is renamed
 * to chrome.b.c()
 */
var chrome = {
  i18n: {
    getMessage: function(){}
  }
};
示例2:

/** @const */
var chrome = {}; // chrome.i18n.getMessage() gets renamed to chrome.a.b()
/** @const */
window.chrome = {}; // chrome.i18n.getMessage() gets renamed to chrome.a.b()
/* chrome.i18n.getMessage() is preserved, but chrome.runtime.connect() is renamed
 * to chrome.b.c()
 */
var chrome = {
  i18n: {
    getMessage: function(){}
  }
};
示例3:

/** @const */
var chrome = {}; // chrome.i18n.getMessage() gets renamed to chrome.a.b()
/** @const */
window.chrome = {}; // chrome.i18n.getMessage() gets renamed to chrome.a.b()
/* chrome.i18n.getMessage() is preserved, but chrome.runtime.connect() is renamed
 * to chrome.b.c()
 */
var chrome = {
  i18n: {
    getMessage: function(){}
  }
};

我在修复编译后引入的bug时使用了第三个示例,最终在定义越来越多的
chrome
属性时遇到了一些困难。我当时的想法是看看是否有人为
chrome
创建了一个extern文件,这让我找到了google闭包编译器的源代码。谷歌已经很好地为几个著名的库创建了externs文件:

如果您的库未在上面列出,则闭包编译器Externs提取器也可能有用:

通过查看contrib/externs/chrome_extensions.js,我的问题的答案似乎是:你不能


看起来所有的东西(或者至少是你调用的部分)都需要在externs文件中明确定义,以确保不执行重命名。

为什么要重新定义
chrome
3次这是3个不同的例子-我将更新我的问题以澄清这一点。你可以使用数组表示法。铬['i18n']['…']。不过,最好的做法是创建一个externs文件