Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让闭包编译器找到window.crypto?_Javascript_Google Closure Compiler - Fatal编程技术网

Javascript 如何让闭包编译器找到window.crypto?

Javascript 如何让闭包编译器找到window.crypto?,javascript,google-closure-compiler,Javascript,Google Closure Compiler,我是javascript新手,正在开发这个现有的包,它使用闭包编译器v20120917将一个普通javascript包编译成一个简化的js文件 我正在尝试使用加密: function computeChallenge(buffer) { return window.crypto.subtle.digest('SHA-256', buffer); } 但是闭包编译器抛出了一个错误:error-Property从未在Window.prototype.crypto上定义过 我可以在我的浏览

我是javascript新手,正在开发这个现有的包,它使用闭包编译器v20120917将一个普通javascript包编译成一个简化的js文件

我正在尝试使用加密:

function computeChallenge(buffer) {
    return window.crypto.subtle.digest('SHA-256', buffer); 
}
但是闭包编译器抛出了一个错误:
error-Property从未在Window.prototype.crypto上定义过


我可以在我的浏览器控制台上运行它,它工作得很好。为什么闭包编译器找不到该方法?我是否需要导入一些文件,我将如何导入?

通过执行JS并扫描对象自动生成外部文件的工具:
JavaScript外部生成器


保存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 advanced将需要这些外部变量,或者将它们视为可管理属性(随后将它们视为无操作)。
建议升级,因为在过去的8年中已经有了很多改进,但这可能不实用,因为必须对代码的编写方式进行大量更改(正如您的评论所暗示的)。下面是一些用于备份外部程序和声明自己的外部程序的选项。如果您有使用TypeScript的经验,那么您应该熟悉创建外部程序的过程

下面是一些来自Google的预构建外部程序,您应该能够直接使用这些外部程序,以便使用crypto API(和其他新API):

  • 更新的全局外部数据的回购位置:

  • WebCryptoAPI外部程序的回购位置:

对于您想要使用的任何库(无需将其捆绑并与程序一起编译),您必须声明外部以防止损坏:

这是为了让闭包编译器知道它们是已经存在的函数和对象的名称,不应该被破坏
例如:

java-jar compiler.jar——编译级高级优化\
--js myjs.js——externs myexterns.js
注意:尝试使用Closure Compiler Advanced捆绑库,特别是2012版本,很可能是不现实的,除非它们已经以CC为目标。只需申报外部人员,就到此为止

本文档解释了您为什么需要外部人员,以及损坏如何影响您的代码:

您使用的编译器版本是什么?你使用的是过时的版本吗?此外,您应该能够关闭严格模式,以便这是一个警告而不是错误,并且编译器可以pass@user120242我使用的是v20120917。我将尝试更新它。我曾尝试关闭严格模式,但编译后的输出文件是一个空方法。啊。window.crypto相对较新。2012年肯定太老了。它不会出现在他们的全局列表中,因此高级_模式会在损坏后将其视为未定义的属性,然后将其视为不可操作。如果您不想升级,window['crypto']['digest']['digest'](…)也会工作,如果有点难看的话。或者你可以自己申报。但是编译器在过去8年中有了很多改进,所以我会尝试升级anyways@user120242谢谢升级版本时遇到一些问题。我也在考虑使用SJCL:你知道我如何在闭包编译器中使用它吗?从那以后有了一些很大的变化。很多库不会像闭包编译器那样工作,尤其不是2012版本,它在编写代码的方式上有很多要求。谢谢。我要使用的外部库只是一个文件。我已经将此文件复制到我的项目中。但当我尝试使用sjcl.encrypt时,闭包编译器抱怨变量sjcl未声明。如何从该文件中找到sjcl?我添加了一个指向外部生成工具的链接。在使用externs生成extern之后,您可能仍然应该清理它,文件不会使用缩小的文件进行编译,对吗?我应该如何包括图书馆?因为我正在创建一个SDK,它将被其他网站使用。对。您只需像通常包含js文件一样包含它。它所做的就是维护全局引用,这样它们就不会被破坏。如果您想像我们现在使用webpack和模块一样捆绑它,您必须将closure编译器升级到最新版本。或者,这可能需要做大量不切实际的工作,修改库,使其可以用高级模式编译。嘿,我升级了闭包编译器版本。增加了另一个关于使用它编译sjcl的问题:
// myexterns.js
function MyExternFunction(){};
window["MyGlobalVariable"];