Menggunakan preload.js dengan betul dalam Electron: Panduan komprehensif
P粉197639753
2023-08-27 20:25:30
<p>Saya cuba menggunakan modul nod (dalam kes ini <code>fs</code>) dalam proses <code>renderer</code>
<pre class="brush:php;toolbar:false;">// main_window.js
const fs = memerlukan('fs')
tindakan fungsi() {
console.log(fs)
}</pre>
<p><sup>Nota: Apabila saya menekan butang dalam <code>main_window</code>, fungsi <code>action</code> </sup></p>
<p>Tetapi ini menghasilkan ralat: </p>
<pre class="brush:php;toolbar:false;">Uncaught ReferenceError: require tidak ditakrifkan
di main_window.js:1</pre>
<p>Saya dapat menyelesaikan masalah ini, seperti yang dicadangkan oleh jawapan yang diterima ini, dengan menambahkan baris ini pada <kod>main.js</code> semasa memulakan <code>main_window</code> /p>
<pre class="brush:php;toolbar:false;">// main.js
main_window = tetingkap Pelayar baharu({
lebar: 650,
ketinggian: 550,
webPreferences: {
nodeIntegration: benar
}
})</pre>
Walau bagaimanapun, menurut dokumentasi, ini bukan amalan terbaik, saya harus membuat fail <code>preload.js</code> dan memuatkan modul Node ini di dalamnya, dan kemudian dalam semua <code>renderer</ kod>Seperti ini:<p><br /></p>
<p><kod>main.js</code>:</p>
<pre class="brush:php;toolbar:false;">main_window = new BrowserWindow({
lebar: 650,
ketinggian: 550,
webPreferences: {
pramuat: path.join(app.getAppPath(), 'preload.js')
}
})</pre>
<p><kod>pramuat.js</code>:</p>
<pre class="brush:php;toolbar:false;">const fs = require('fs')
window.test = function() {
console.log(fs)
}</pre>
<p><kod>main_window.js</code>:</p>
<pre class="brush:php;toolbar:false;">function action() {
window.test()
}</pre>
<p>Dan ia berkesan! </p>
<hr />
<p>Sekarang soalan saya ialah, bukankah berlawanan dengan intuisi bahawa saya harus menulis kebanyakan kod untuk proses <kod>penyampai</kod> dalam <kod>pramuat.js</kod> hanya mempunyai akses kepada modul Node dalam <code>pramuat.js</code>) dan kemudian panggil sahaja fungsi dalam setiap fail <code>renderer.js</code> js</code>)? Apa yang saya tidak faham di sini? </p>
Pertimbangkan contoh ini
Tidak semua dalam dokumentasi rasmi boleh dilaksanakan secara langsung di mana-mana dalam kod. Anda mesti perlu mempunyai pemahaman ringkas tentang persekitaran dan proses.
Pengasingan konteks dan penyepaduan nod
contextIsolation
nodeIntegration
假
假
假
true
true
假
true
true
Bagaimana cara menggunakan pramuat dengan betul?
Anda mesti menggunakan Komunikasi Antara Proses (IPC) Electron agar proses utama dan proses pemapar berkomunikasi.
BrowserWindow.webContents.send() code>
Kaedah untuk menghantar mesej kepada pemaparipcMain.handle()
ipcMain.handle() Kaedah untuk menerima mesej daripada pemaparContoh perlaksanaan
Utama
Dipramuat
Penyampai
Bagaimana pula dengan menggunakan Promise?
Kekalkan komitmen anda terhadap proses/persekitaran yang sama apabila boleh. Janji anda di utama harus kekal di utama. Komitmen anda kepada penyampai juga harus kekal pada penyampai. Jangan membuat komitmen untuk melompat dari program utama kepada pramuat kepada pemapar.
Sistem fail
Sebahagian besar logik perniagaan anda masih harus berada di bahagian utama atau pemapar, tetapi tidak sekali-kali dalam pramuat. Ini kerana pramuat wujud hampir secara eksklusif sebagai medium. Pramuat hendaklah sangat kecil.
Dalam kes OP ,
fs
fs hendaklah dilaksanakan pada bahagian induk.Diedit 2022
Saya telah menerbitkan artikel yang lebih besar tentang sejarah Elektron
(Bagaimana keselamatan telah berubah dalam keluaran Elektron) dan pertimbangan keselamatan lain yang boleh diambil oleh pembangun Elektron untuk memastikan penggunaan pramuat yang betul dalam dokumen aplikasi baharu.preload.js
的正确方法是在您的应用可能需要require
Dedahkan pembalut senarai putih di sekeliling mana-mana modul menggunakanrequire
或通过preload.js
中的require
Dari perspektif keselamatan, mendedahkan apa sahaja yang diambil melalui panggilan adalah berbahaya (lihat ulasan sayaUntuk melakukan ini dengan betul, anda perlu menetapkan BrowserWindowmemerlukan
tanpa ia diganggu oleh pelanggan.require
seperti yang saya perincikan di bawah. Menetapkan pilihan ini memaksa aplikasi Electron anda untuk berkomunikasi melalui IPC (Komunikasi Antara Proses) dan mengasingkan kedua-dua persekitaran antara satu sama lain. Menyediakan aplikasi anda seperti ini membolehkan anda mengesahkan apa sahaja di bahagian belakang yang mungkin merupakan modulDi bawah, anda akan temui contoh ringkas tentang perkara yang saya perkatakan dan penampilannya dalam apl anda. Jika anda baru, saya mungkin mengesyorkan menggunakan
(yang saya pengarangnya) untuk menggabungkan semua amalan terbaik keselamatan ini dari mula apabila membina aplikasi elektron.secure-electron-template
secure-electron-template
Halaman ini
juga mempunyai maklumat yang baik tentang seni bina yang diperlukan apabila menggunakan preload.js untuk membuat aplikasi selamat.main.js