国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

Electron ASAR Archives

2023-02-16 17:16 更新

在完成 應(yīng)用程序打包 后,應(yīng)用程序的源代碼通常會(huì)被綁定到 ASAR存檔 中,這是一種為 Electron 應(yīng)用程序而設(shè)計(jì)的簡(jiǎn)易存檔格式。通過(guò)捆綁到應(yīng)用程序中,我們可以緩解 Windows 上加載長(zhǎng)路徑名稱的問(wèn)題,加速加載并隱藏你的源碼, 避免粗略的檢查。 通過(guò)捆綁到應(yīng)用程序中,我們可以緩解 Windows 上加載長(zhǎng)路徑名稱的問(wèn)題,加速加載并隱藏你的源碼, 避免粗略的檢查。

打包后的應(yīng)用運(yùn)行在一個(gè)虛擬文件系統(tǒng)并且大多數(shù)API都可以正常執(zhí)行, 但有些時(shí)候你可能在某種情況下需要在 ASAR 壓縮文件內(nèi)執(zhí)行.

使用 ASAR 包?

Electron 有兩套 API:Node API 和 Web API 分別由 Node.js 和 Chromium 提供。 兩套 API 都支持都支持從 ASAR 包內(nèi)讀取文件.

Node API

由于 Electron 的特殊補(bǔ)丁程序, Node API 比如 fs.readFile 和 require 使用 ASAR 就像是使用虛擬目錄一樣, 里面的文件也像是在文件系統(tǒng)內(nèi)一樣.

例如,假設(shè)我們?cè)?nbsp;/path/to 文件夾下有個(gè) example.asar 包:

$ asar list /path/to/example.asar
/app.js
/file.txt
/dir/module.js
/static/index.html
/static/main.css
/static/jquery.min.js

在 ASAR 歸檔中讀取文件:

const fs = require('fs')
fs.readFileSync('/path/to/example.asar/file.txt')

列出檔案根目錄下的所有文件:

const fs = require('fs')
fs.readdirSync('/path/to/example.asar')

使用檔案中的模塊:

require('./path/to/example.asar/dir/module.js')

你也可以在 ASAR 存檔內(nèi)使用 BrowserWindow 來(lái)顯示一個(gè)網(wǎng)絡(luò)頁(yè)面:

const { BrowserWindow } = require('electron')
const win = new BrowserWindow()

win.loadURL('file:///path/to/example.asar/static/index.html')

Web API

在網(wǎng)頁(yè)中,可以使用 file: 協(xié)議請(qǐng)求歸檔中的文件。 就像是 Node API, ASAR 存檔可以被作為目錄處理.

例如,用 $.get 獲取文件:

<script>
let $ = require('./jquery.min.js')
$.get('file:///path/to/example.asar/file.txt', (data) => {
  console.log(data)
})
</script>

將 ASAR 歸檔文件看作是一個(gè)普通文件

某些情況下比如對(duì) ASAR 歸檔文件進(jìn)行校驗(yàn),我們需要像讀取 “文件” 那樣讀取 ASAR 文件。 為此你可以使用內(nèi)置的沒(méi)有asar功能的和原始fs模塊一模一樣的original-fs模塊。

const originalFs = require('original-fs')
originalFs.readFileSync('/path/to/example.asar')

您也可以將 process.noAsar 設(shè)置為 true 以禁用 fs 模塊中對(duì) asar 的支持:

const fs = require('fs')
process.noAsar = true
fs.readFileSync('/path/to/example.asar')

Node API 的局限性?

盡管我們已經(jīng)盡了最大努力使得 ASAR 文件使用 Node API 時(shí)的應(yīng)用盡可能的趨向于真實(shí)的目錄結(jié)構(gòu),但仍有一些底層 Node API 我們無(wú)法保證其正常工作。

檔案文件是只讀的?

歸檔文件中的內(nèi)容不可更改,所以 Node APIs 里那些會(huì)修改文件的方法在使用 ASAR 文件時(shí)都無(wú)法正常工作.

工作目錄不能設(shè)置為檔案文件里的目錄

盡管 ASAR 檔案被視為目錄,但文件系統(tǒng)中沒(méi)有實(shí)際目錄,因此您永遠(yuǎn)不能將工作目錄設(shè)置為 ASAR 檔案中的目錄。將 asar 中的文件夾以 cwd 形式作為參數(shù)傳入一些 API 中也會(huì)報(bào)錯(cuò)。

某些 API 需要額外解壓檔案包

大多數(shù) fs API 可以在不解包的情況下從 ASAR 檔案中讀取文件或獲取文件的信息,但是對(duì)于一些依賴于將真實(shí)文件路徑傳遞給底層系統(tǒng)調(diào)用的 API,Electron 會(huì)將需要的文件提取到一個(gè)臨時(shí)文件中,并將路徑傳遞給API 的臨時(shí)文件,使它們工作。對(duì)于這類(lèi)API,會(huì)增加一些開(kāi)銷(xiāo)。

以下是一些需要額外解壓的 API:

  • child_process.execFile
  • child_process.execFileSync
  • fs.open
  • fs.openSync
  • process.dlopen - 用在 require 原生模塊時(shí)

fs.stat 的不真實(shí)統(tǒng)計(jì)信息

對(duì) asar 檔案中的文件取 fs.stat,返回的 Stats 對(duì)象不是精確值,因?yàn)檫@些文件不是真實(shí)存在于文件系統(tǒng)里。 所以除了文件大小和文件類(lèi)型以外,你不應(yīng)該依賴 Stats 對(duì)象的值。

執(zhí)行 ASAR 檔案中的二進(jìn)制文件

有可以執(zhí)行二進(jìn)制文件的節(jié)點(diǎn) API,如 child_process.exec、child_process.spawn 和 child_process.execFile,但僅支持 execFile 執(zhí)行 ASAR 存檔內(nèi)的二進(jìn)制文件。

因?yàn)?nbsp;exec 和 spawn 允許 command 替代 file 作為輸入,而 command 是需要在 shell 下執(zhí)行的. 目前沒(méi)有 可靠的方法來(lái)判斷 command 中是否在操作一個(gè) asar 包中的文件,而且即便可以判斷,我們依舊無(wú)法保證可以在無(wú)任何 副作用的情況下替換 command 中的文件路徑。

向 ASAR 檔案添加未打包的文件?

如上所述,某些 Node API 被調(diào)用時(shí)會(huì)解壓文件到文件系統(tǒng)。 除了性能問(wèn)題外,可能會(huì)觸犯各種防病毒掃描程序。

作為解決方法,您可以使用 --unpack 選項(xiàng)將各種文件解壓。在以下示例中,不會(huì)打包原生 Node.js 模塊的共享庫(kù):

$ asar pack app app.asar --unpack *.node

運(yùn)行命令后,您將會(huì)看到 app.asar.unpacked 文件夾與 app.asar 文件一起被創(chuàng)建了。 沒(méi)有被打包的文件和 app.asar 會(huì)一起存檔發(fā)布。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)