簡體   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