如何让 Closure Compiler 找到 window.crypto?

How to get Closure Compiler to find window.crypto?

我是 javascript 的新手,正在处理这个现有的包,它使用闭包编译器 v20120917 将 vanilla javascript 包编译成一个缩小的 js 文件。

我正在尝试使用加密:

function computeChallenge(buffer) {
    return window.crypto.subtle.digest('SHA-256', buffer); 
}

但 Closure 编译器抛出错误:ERROR - Property subtle never defined on Window.prototype.crypto

我可以 运行 在我的浏览器控制台上执行此操作,而且效果很好。为什么闭包编译器找不到方法?我需要导入一些文件吗?我该怎么做?

执行JS扫描对象自动生成extern的工具:
JavaScript 外部生成器
GitHub Repo
Runnable Demo
保存 extern.js 文件,然后将其添加到您的 externs:

java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS \
  --js myjs.js --externs extern.js

另一种方法是在访问属性时使用字符串键进行所有调用
例如:window["sjcl"]["cipher"]["aes"]()

Closure Compiler 2012 版本太旧并且缺少大量全局变量的外部变量,高级 Closure Compiler 将需要这些变量,否则它将把它们视为可修改的属性(随后将其视为无操作)。
建议升级,因为在过去的 8 年里已经有了很多改进,但是由于必须编写代码的方式发生了很大变化(正如您的评论所暗示的),这可能不切实际。以下是向后移植外部人员和声明您自己的一些选项。如果您有使用 TypeScript 的经验,那么创建 extern 的过程应该很熟悉。

这里有一些来自 Google 的预建外部程序,您应该可以直接使用它们,这样您就可以使用加密 API(和其他新的 APIs):

对于您想使用的任何库(无需将其捆绑并与您的程序一起编译),您将必须声明 externs 以防止混淆:
Declaring Externs Docs
这是为了让 Closure Compiler 知道它们是已经存在的函数和对象的名称,不应该被破坏
例如:

// myexterns.js
function MyExternFunction(){};
window["MyGlobalVariable"];
java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS \
  --js myjs.js --externs myexterns.js

注意:尝试使用 Closure Compiler Advanced 捆绑库,尤其是 2012 版本,除非它们已经以 CC 为目标,否则很可能无法实现。只需声明外部人员并收工即可。

此文档解释了为什么您需要 extern 以及 mangling 如何影响您的代码:
Restrictions for Advanced Optimizations Docs