[英]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):
更新的全球外部人员的回购位置: https://github.com/google/closure-compiler/tree/master/externs
WebCrypto API externs 的回购位置: https://github.com/google/closure-compiler/blob/master/externs/browser/w3c_webcrypto.js
对于您想要使用的任何库(无需将其捆绑并与您的程序一起编译),您必须声明 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.