保護 JavaScript 原始碼
應用程式的 JavaScript 原始碼可以透過編譯成原生程式碼並由 NW.js 載入來保護。您只需要在生產環境中將已編譯的程式碼與應用程式一起發佈即可。
編譯
JS 原始碼會使用 SDK 建置中提供的工具 nwjc
編譯成原生程式碼。
使用方式
nwjc source.js binary.bin
*.bin
檔案需要與您的應用程式一同散佈。您可以隨意命名。
如果您正在編譯模組,則需要 --nw-module
引數。
載入已編譯的 JavaScript
nw.Window.get().evalNWBin(frame, 'binary.bin');
win.evalNWBin() 方法的引數與
Window.eval()
方法類似,其中第一個參數為目標 iframe(主框架為 null
),第二個參數為二進位碼檔案。
如果您正在為模組載入二進位碼,則應改用 win.evalNWBinModule()。
從遠端載入已編譯的 JavaScript
已編譯的 JavaScript 可以從遠端擷取(例如透過 AJAX),並即時執行。
var xhr = new XMLHttpRequest(); xhr.responseType = 'arraybuffer'; // make response as ArrayBuffer xhr.open('GET', url, true); xhr.send(); xhr.onload = () => { // xhr.response contains compiled JavaScript as ArrayBuffer nw.Window.get().evalNWBin(null, xhr.response); }
注意
已編譯的程式碼會在 瀏覽器內容 中執行。您可以使用任何 Web API(例如 DOM)和 存取瀏覽器內容中執行的 NW.js API 和 Node API。
在 Web Workers 中使用
工作人員內容中引入了函式 importNWBin(ArrayBuffer)
。二進位碼檔案可以在主執行緒中讀取為陣列緩衝區,傳送到工作人員,然後使用新函式在那裡執行。
已知問題
在 0.22 之前,已編譯的程式碼執行速度比一般 JS 慢:根據 v8bench,效能約為 30%。其他未編譯的 JS 原始碼不會受到影響。在 0.22.0-beta1 中,此問題已獲得修復。請查看我們的部落格文章:https://nwjs.io/blog/js-src-protect-perf/
已編譯的程式碼無法跨平台,也不相容於 NW.js 的不同版本。因此,當您封裝應用程式時,需要為每個平台執行 nwjc
。