繁体   English   中英

如何让 Closure Compiler 找到 window.crypto?

[英]How to get Closure Compiler to find window.crypto?

I am new to javascript and working on this existing package that uses closure compiler v20120917 to compile a vanilla javascript package into a single minified js file.

我正在尝试使用加密:

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

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

我可以在我的浏览器控制台上运行它,它工作正常。 为什么闭包编译器找不到方法? 我需要导入一些文件,我该怎么做?

通过执行JS并扫描对象自动生成外部的工具:
JavaScript 外部发电机
GitHub 回购
可运行演示
保存 extern.js 文件,然后将其添加到您的外部:

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(和其他新 API):

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

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

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

这个文档解释了为什么你需要 externs 以及 mangling 如何影响你的代码:
高级优化文档的限制

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM