【发布时间】:2020-06-19 05:52:39
【问题描述】:
我有一个使用 Closure Compiler v20181210 编译和缩小的 vanilla javascript 项目。我想在该项目中使用 SJCL 进行加密。
我将this file 复制到我自己的项目中并使用该库编写代码。但是当我尝试编译它时,Closure Compiler 从库中抛出一堆错误(粘贴在下面)。
在 SJCL 网站上,它说该文件是使用 Google Closure Compressor 压缩的。所以我想它应该与 Closure 兼容?那为什么不编译呢?
另外,我读到了externs。但我希望所有代码都在一个缩小的文件中。使用 externs,看来我需要另一个 SJCL 导入。
一些闭包编译器错误:
ERROR - cannot instantiate non-constructor
[java] sjcl.hash.sha256=function(a){this._key[0]||this._precompute();a?(this._h=a._h.slice(0),this._buffer=a._buffer.slice(0),this._length=a._length):this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()};
ERROR - Suspicious code. The result of the 'getprop' operator is not being used.
[java] (p^l))+d[b];q=l;l=p;p=h;h=n+g|0;n=k;k=f;f=e;e=g+(f&k^n&(f^k))+(f>>>2^f>>>13^f>>>22^f<<30^f<<19^f<<10)|0}c[0]=c[0]+e|0;c[1]=c[1]+f|0;c[2]=c[2]+k|0;c[3]=c[3]+n|0;c[4]=c[4]+h|0;c[5]=c[5]+p|0;c[6]=c[6]+l|0;c[7]=c[7]+q|0}};"undefined"!==typeof module&&module.exports&&(module.exports=sjcl);"function"===typeof define&&define([],function(){return sjcl});
ERROR - actual parameter 3 of AnyStorageProvider.prototype.setItem does not match formal parameter
[java] found : string
[java] required: (number|undefined)
[java] toucan.storage.Any.setItem(LOGIN_STATE_CACHE_KEY, loginState, 'session');
编辑:我正在使用所有这些参数运行 Closure 编译器。当我删除它们时,项目就会编译。但我不确定删除这些是否安全?
<arg line="--jscomp_error accessControls --jscomp_error ambiguousFunctionDecl --jscomp_error checkRegExp --jscomp_error checkTypes --jscomp_error checkVars --jscomp_error const --jscomp_error constantProperty --jscomp_error duplicateMessage --jscomp_error externsValidation --jscomp_error fileoverviewTags --jscomp_error globalThis --jscomp_error internetExplorerChecks --jscomp_error invalidCasts --jscomp_error missingProperties --jscomp_error nonStandardJsDocs --jscomp_error strictModuleDepCheck --jscomp_error typeInvalidation --jscomp_error undefinedNames --jscomp_error undefinedVars --jscomp_error unknownDefines --jscomp_error uselessCode --jscomp_error visibility"/>
【问题讨论】:
-
粗略地看,他们有一个预处理器,准备使用 Perl 脚本使用闭包 compress_with_closure.sh 进行编译。所以是的,它看起来会起作用,但您可能需要使用 _tmpRC.js。然后,您需要将预处理添加到您的构建链中。有可能你不需要这样做,可以直接包含它们,你可以先尝试一下,看看它是否有效。您必须使用未缩小的来源。
-
看起来您启用了 linter 选项?你会想要关闭它。 2018 应该更兼容,您可能只需将 sjcl 的 core/ 目录添加到您的编译源中以用于闭包编译器。不确定它是否能很好地使用暴露的 sjcl 对象消除死代码。
-
@user120242 我想通了。我正在运行带有一堆 args 的 Closure Compiler(添加到帖子中)。当我删除这些时,项目编译时会出现很多警告。但它有效。删除这些是否安全?
-
这取决于你。这些基本上与 eslint 在您的代码上抛出错误相同。不过,您不应该使用缩小的文件。确保包含在 core/ 目录中。
-
如果您自己解决问题,请在此处发布您的解决方案并接受它作为解决此问题的答案
标签: javascript google-closure-compiler google-closure-library sjcl