рдореИрдВрдиреЗ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдРрдк рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИред рдЬрдм рддрдХ рдореИрдВрдиреЗ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рддрдм рддрдХ рд╕рдм рдХреБрдЫ рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЕрдЧрд░ рдореИрдВ рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рдРрдк рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрдХреНрд╖ рд╕реЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ipcRenderer рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
рдпрд╣ рд▓рд╛рдЗрди рдРрдк рдХреЛ рдХреНрд░реИрд╢ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИ:
import { ipcRenderer } from 'electron';
рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: fs.existsSync рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ
(рдЕрдирд╛рдо рд╕рдорд╛рд░реЛрд╣)
node_modules/рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди/index.js:6
3 |
4 | var pathFile = path.join(__dirname, 'path.txt')
5 |
> 6 | if (fs.existsSync(pathFile)) {
7 | module.exports = path.join(__dirname, fs.readFileSync(pathFile, 'utf-8'))
8 | } else {
9 | throw new Error('Electron failed to install correctly, please delete node_modules/electron and try installing again')
рдореБрдЭреЗ Google рдкрд░ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рд╣реИред
рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
рд╕реАрдЖрд░рдП рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдорд╛рдирдХ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдбрд┐рдВрдЧ (рдПрдлрдПрд╕ рд╕рд╣рд┐рдд) рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рд╡реЗрдмрдкреИрдХ рдХреЗ рд▓рд┐рдП рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореЛрдб рдореЗрдВ рджреЗрдЦрдиреЗ рдФрд░ рд╕реАрдЖрд░рдП рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛
рдЧрд┐рдЯрд╣рдм рдореБрджреНрджреЗ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рд╣реИрдВ, рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рд╕рдореБрджрд╛рдп рдпрд╛ рд╕реНрд▓реИрдХ рдЪреИрдирд▓ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред
@MarshallOfSound рдореЗрд░реА рдЧрд▓рддреА рд╣реИред
рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ # 7300 рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
const { ipcRenderer } = window.require('electron');
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рдЖрдк рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдк рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЕрдВрджрд░ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрднреА рднреА рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рд╡рд┐рдВрдбреЛ.require рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореЗрдВ рд╣реИ)ред
рдпрджрд┐ рдЖрдк app.quit() рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const {рдРрдк} = window.require ('рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди')ред рд░рд┐рдореЛрдЯ;
рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ ...
@CiriousJoker рдпреЗ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рдзрдиреНрдпрд╡рд╛рдж!
рдореБрдЭреЗ рдЕрднреА рднреА window.require is not a function
ред рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ (https://github.com/kriasoft/react-starter-kit) рдХреЗ рд╕рд╛рде рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореИрдВрдиреЗ рд╡реЗрдм рд╕реЗ рдЕрдкрдирд╛ рдРрдк рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдк рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрдк рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ:
https://gist.github.com/holgersindbaek/68f6db82f507967a51ca75c527faeff6
рдореИрдВ рдЬреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ ipcRenderer
рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рддрдм рднреА рд╕рдВрднрд╡ рд╣реИ рдЬрдм рдореЗрд░рд╛ рдРрдк рд╡реЗрдм рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛред рдХреЛрдИ рд╕реБрдЭрд╛рд╡?
@holgersindbaek
рдЙрд╕реА рдирд╛рд╡ рдореЗрдВ рдЬреИрд╕реЗ рдЖрдк... рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛?
рдирд╣реАрдВ, рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ ipcRenderer рд▓реЛрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдкрдирд╛ рд░рд┐рдПрдХреНрдЯ рдРрдк рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЗрд╕реЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХреЗ рдЕрдВрджрд░ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЖрдкрдХреЛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
@Amthieu рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рд░рд┐рдПрдХреНрдЯ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдХреЛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореЗрдВ рдХреИрд╕реЗ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдХрд┐рд╕реА рднреА рд╕рд▓рд╛рд╣ рдХреА рдХрд╛рдлреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА:
https://discuss.atom.io/t/getting-electron-to-work-with-react-starter-kit/48594
рдареАрдХ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдорд╛рдзрд╛рди рд╣реИред
1) рдХреЛрдб рдХреЗ рд╕рд╛рде preload.js file
рдмрдирд╛рдПрдВ:
window.ipcRenderer = require('electron').ipcRenderer;
2) рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдиреЗ main.js рдореЗрдВ webPreferences
рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реАрд▓реЛрдб рдХрд░реЗрдВ:
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: false,
preload: __dirname + '/preload.js'
}
});
3) рдЕрдм, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдРрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рд╣реЛрдЧрд╛ред рдЬреИрд╕реЗ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛:
componentDidMount() {
if (isElectron()) {
console.log(window.ipcRenderer);
window.ipcRenderer.on('pong', (event, arg) => {
this.setState({ipc: true})
})
window.ipcRenderer.send('ping')
}
}
рдиреЛрдЯ - рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП: isElectron()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП https://github.com/cheton/is-electron
@HemalR рдЪрд░рдг 3 рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд (рдЕрдм) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
componentDidMount() {
if (window.isElectron) {
console.log(window.ipcRenderer);
window.ipcRenderer.on('pong', (event, arg) => {
this.setState({ipc: true})
})
window.ipcRenderer.send('ping')
}
}
рдиреЛрдЯ : window.isElectron
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИред
@nparsons08
рдХреНрд╖рдорд╛ рдпрд╛рдЪрдирд╛ - рдореБрдЭреЗ рдЬрд╣рд╛рдВ рд╕реЗ isElectron рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдЙрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рдореЗрд░реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИ: https://github.com/cheton/is-electron
@holgersindbaek
рдХреНрдпрд╛ рдЕрдм рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ
рдореЗрд░реЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдВ рдЬрдм nodeIntegration
true
;
webPreferences: {
nodeIntegration: true,
preload: __dirname + '/preload.js'
}
@HemalR рд╕рдорд╛рдзрд╛рди рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд░реЗрдВ!
рдЕрдм рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рд╕реЗ рдХреИрд╕реЗ рднреЗрдЬреЗрдВ?
рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рд╢ рдХреА
рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдкрдХреНрд╖ рдкрд░
ipcMain.emit("pong", "Hello!");
рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢реНрд░реЛрддрд╛ рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рд╛
window.ipcRenderer.on("pong", (event, arg) => {
console.log("PONG");
});
ipcMain.emit() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд╣реА рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдареАрдХ рд╣реИ рдмрд╕ рдкрд╛рдпрд╛ рдХрд┐ рдореБрдЭреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ (рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░)
mainWindow.webContents.send("pong", "Hello!");
рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж!
рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реБрдЖред рдореЗрд░реЗ рд▓рд┐рдП рдЬреЛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╡рд╣ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд╣реИрдХ рдерд╛ред рдлрд╝рд╛рдЗрд▓ ./node_modules/electron/index.js
рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рдФрд░ рд╣рд╛рд░реНрдб рдХреЛрдб рдХреЛ electron.exe
. рдХреЗ рдкрде рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ
рдЬреИрд╕реЗ
function getElectronPath() {
return 'D:\\Repos\\MyProject\\node_modules\\electron\\dist\\electron.exe';
}
module.exports = getElectronPath();
рд╡рд╛рд╣, рдореИрдВ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ IPCRenderer рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрд╛ред рдореИрдВрдиреЗ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдХреНрдпрд╛ рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕рдВрдпреЛрдЧ рд╕реЗ рдХреЛрдИ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдзрдиреНрдпрд╡рд╛рдж
рд╣рдореНрдо... рдореЗрд░рд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдк рдЕрднреА рднреА рдКрдкрд░ рджрд┐рдП рдЧрдП рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ (рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХреЗрдЧрд╛? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд▓реЛрдЧ рдЕрдкрдиреЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рд╕рдВрд╕реНрдХрд░рдг рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХреЗрдВ?
@cyclonstep рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ? рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдпрд╛ рдХреБрдЫ рд▓реЙрдЧ рдХреЗ рдмрд┐рдирд╛ рдорджрдж рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ ...
рдореИрдВ рдмрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
Window.require рдиреЗ рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рднреА рд╣рд▓ рдХрд┐рдпрд╛ (рдпрд╣ рднреА рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпрд╛ рдирд╣реАрдВ):
'vue/dist/vue.min' рд╕реЗ Vue рдЖрдпрд╛рдд рдХрд░реЗрдВ
'./App' рд╕реЗ рдРрдк рдЖрдпрд╛рдд рдХрд░реЗрдВ// рдЦрд░рд╛рдм? рдЖрдпрд╛рдд {ipcRenderer} 'рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди' рд╕реЗ
// рдЦрд░рд╛рдм? const {ipcRenderer} = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди')
// рдЕрдЪреНрдЫрд╛:
const {ipcRenderer} = window.require ('рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди')
(рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдЧреЗ рдиреАрдЪреЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди "рдкреЛрдВрдЧ-рдбреЗрдореЛ" рд╣реИ , рдЬреЛ рдереЛрдбрд╝реЗ рд╕реЗ рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)
рд╢рд╛рдпрдж рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп: рдЧрд▓рдд рдХрд░рдиреЗ рдкрд░ рднреА, рдмрдВрдбрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рдмрдврд╝рддрд╛ (рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдпрд╣ рдЕрдм рддрдХ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдФрд░ рдЕрдм рддрдХ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд░реЗрдВрдбрд░-рд╕рд╛рдЗрдб рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдЖрдпрд╛рдд рд╣реИ) рдкреВрд░реЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдЖрдХрд╛рд░ рдпрд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд▓рдЧрднрдЧ 20kb рддрдХ , рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХреБрдЫ рд╢рд┐рдо/рдЖрд╡рд░рдг рдХреЛрдб рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ node_modules/electron-download/node_modules/debug/dist/debug.js
:242:ff... рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИред
2: [function (require, module, exports) { // shim for using process in browser var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it
рд╡реИрд╕реЗ рднреА, рдЪреАрдЬреЗрдВ рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред
рдиреЛрдб рд╕рдВрд╕реНрдХрд░рдг 10.2.0
рдХреНрд░реЛрдо рд╕рдВрд╕реНрдХрд░рдг 66.0.3359.181
рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рд╕рдВрд╕реНрдХрд░рдг 3.0.2
window.require
рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдореЗрд░реА рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ window is not defined
, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ const electron = eval('require')("electron")
рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рд╡реЗрдмрдкреИрдХ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдореЗрд░реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд┐рд╡рд░рдг рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд░рд╣рд╛ рдерд╛ред
@MarshallOfSound рдореЗрд░реА рдЧрд▓рддреА рд╣реИред
рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ # 7300 рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
const { ipcRenderer } = window.require('electron');
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рдЖрдк рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдк рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЕрдВрджрд░ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрднреА рднреА рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рд╡рд┐рдВрдбреЛ.require рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореЗрдВ рд╣реИ)ред
рдФрд░ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдХреЗ рд▓рд┐рдП:
import {IpcRenderer} from 'electron';
declare global {
interface Window {
require: (module: 'electron') => {
ipcRenderer: IpcRenderer
};
}
}
const { ipcRenderer } = window.require('electron');
@moshfeu рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рд╢рд╛рдирджрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ IpcRenderer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Webpack рдпрд╛ Browserfy рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдлрд┐рд░ рд╕реЗ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж :D
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдФрд░ рдКрдкрд░ рд╕реЗ @HemalR рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ nodeIntegration: true
: https://github.com/electron/electron/issues/9920#issuecomment -336757899:
рдареАрдХ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдорд╛рдзрд╛рди рд╣реИред
- рдХреЛрдб рдХреЗ рд╕рд╛рде
preload.js file
рдмрдирд╛рдПрдВ:window.ipcRenderer = require('electron').ipcRenderer;
- рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдиреЗ main.js рдореЗрдВ
webPreferences
рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реАрд▓реЛрдб рдХрд░реЗрдВ:mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: false, preload: __dirname + '/preload.js' } });
- рдЕрдм, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдРрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рд╣реЛрдЧрд╛ред рдЬреИрд╕реЗ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛:
componentDidMount() { if (isElectron()) { console.log(window.ipcRenderer); window.ipcRenderer.on('pong', (event, arg) => { this.setState({ipc: true}) }) window.ipcRenderer.send('ping') } }
рдиреЛрдЯ - рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:
isElectron()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП https://github.com/cheton/is-electron
рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд
https://github.com/electron/electron/issues/9920#issuecomment -447157348
рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:
import { IpcRenderer } from 'electron';
declare global {
interface Window {
ipcRenderer: IpcRenderer
}
}
export const { ipcRenderer } = window;
рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ! stenciljs рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдХреЛрдгреАрдп
рдмрд╕ рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝реЗрдВ: рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ "рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд░"ред
рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ {
...
рд▓рдХреНрд╖реНрдп: "рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд░"
...
}
рдирдорд╕реНрддреЗ, рдореИрдВ рд╕реАрдЖрд░рдП + рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдореИрдВ рд▓рдХреНрд╖реНрдп 'рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд░' рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реВрдВред рдмрд┐рд▓реНрдб рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ url localhost:3000
рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдореЗрдВ рдиреЛрдб рдПрдкреАрдЖрдИ рдФрд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕рдорд╛рдзрд╛рди рд╣реИ? рдзрдиреНрдпрд╡рд╛рджред
TypeError: fs.existsSync is not a function
рд╣рд╛рдБ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ fs
рдПрдкреАрдЖрдИ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдореИрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдЖрдк react-scripts start
(рдЬреЛ рд╕реАрдЖрд░рдП рдореЗрдВ npm start
рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рдРрдк рдЪрд▓рд╛рддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ electron .
рдЪрд▓рд╛рдирд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдбреЙрдХреНрд╕ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: https://electronjs.org/docs/tutorial/first-appред
рдПрд▓рдПрдордХреЗ рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдк рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдРрдк рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - https://github.com/moshfeu/y2mp3 (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╕реАрдЖрд░рдП рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛)
рдирдорд╕реНрддреЗ, рдореИрдВ рд╕реАрдЖрд░рдП + рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдореИрдВ рд▓рдХреНрд╖реНрдп 'рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд░' рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реВрдВред рдмрд┐рд▓реНрдб рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ url
localhost:3000
рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдореЗрдВ рдиреЛрдб рдПрдкреАрдЖрдИ рдФрд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕рдорд╛рдзрд╛рди рд╣реИ? рдзрдиреНрдпрд╡рд╛рджред
TypeError: fs.existsSync is not a function
рдмрд╕ рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝реЗрдВ: рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ "рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд░"ред
рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ {
...
рд▓рдХреНрд╖реНрдп: "рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд░"
...
}
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдЙрдкрдХрд░рдг рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ electron-renderer
рд╕рд┐рд░реНрдл рдЗрд╕ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ window.required
рдЬреИрд╕реЗ рд╡рд╛рдпрд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдЯрд╛рдЗрдкрд┐рдВрдЧ рднреА рдЦреЛ рдЧрдпрд╛ рд╣реИ!
рдореЗрд░реЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд┐рдпрд╛: рд╡реЗрдмрдкреИрдХ рдФрд░ рдиреЛрдб рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП "рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд┐рдВрдЧ": рдмреНрд░рд╛рдЙрдЬрд╝рд░рд╡рд┐рдВрдбреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕рдЪ
рдореИрдВ рдЖрдЬ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╡реЗрдмрдкреИрдХ+рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди+рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рд╕реЗрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рдЗрди рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ рднреА рдЗрд╕ рддреНрд░реБрдЯрд┐ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдХрд╣реА рдЧрдИ рдмрд╛рддреЛрдВ рдХрд╛ рдпреЛрдЧ рд╣реИ:
"electron-renderer"
рдХреЛ target
ред рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП rescripts
рд╕рд╛рде rescript-env
рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВредpackage.json
"rescripts": [
"env"
],
.rescriptsrc.js
рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕ = [require.resolve(./webpack.config.js")];
webpack.config.js
:
module.exports = config => {
config.target = "electron-renderer";
return config;
};
new BrowserWindow({
webPreferences: {
nodeIntegration: true
}
});
src/typings.d.ts
:declare var window: Window;
interface Window {
require: any;
}
рдФрд░ рдЖрдк рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЗ рдРрдк рдореЗрдВ рд╣реИрдВ
App.tsx
const { remote } = window.require("electron");
console.log(remote.getCurrentWindow());
@рд▓реБрдХрд╛рд╕рдмреЙрдореНрдмреИрдЪ
рдпрд╣ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
declare var window: Window;
interface Window {
require: NodeRequire
}
рдлрд┐рд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд╕реНрдЯ рдкрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣реЛрдЧреА
рдзрдиреНрдпрд╡рд╛рдж!
рдпрд╣рд╛рдБ рд╡реЗ рдЪрд░рдг рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдореИрдВрдиреЗ Vue рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕реЗ рд╡реЗрдм рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдиреЛрдб рдПрдХреАрдХрд░рдг рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
new BrowserWindow({
webPreferences: {
nodeIntegration: true,
},
})
````
Configure webpack to package your application for electron renderer by adding a target to your `vue.config.js` (or wherever you set your vue settings).
```js
module.exports = {
configureWebpack: {
target: 'electron-renderer',
},
}
рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рднреАрддрд░ рдЖрдкрдХреЛ рдЬреЛ рдЪрд╛рд╣рд┐рдП рдЙрд╕реЗ рдЖрдпрд╛рдд рдХрд░реЗрдВред рдореИрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдореЗрдВ рдЦреЛрд▓ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдЬреИрд╕реЗ:
import { shell } from 'electron'
рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдпрд╣ рдЕрдм рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ
```рдЬреЗрдПрд╕
рдирдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░рд╡рд┐рдВрдбреЛ({
рд╡реЗрдм рд╡рд░реАрдпрддрд╛рдПрдБ: {
рдиреЛрдбрдПрдХреАрдХрд░рдг: рд╕рдЪ
}
});
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЖрдкрдХреЗ рдРрдкреНрд╕ рдореЗрдВ fs
рдпрд╛ ipcRenderer
рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рдкрд╛рдпрд╛ рд╣реИ, рдФрд░ рдкреБрд░рд╛рдиреЗ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред tl;dr - рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдиреЛрдб рдореЙрдбреНрдпреВрд▓ (рдпрд╛рдиреА fs
) рдпрд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореЙрдбреНрдпреВрд▓ (рдпрд╛рдиреА ipcRenderer
) рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рднреЗрджреНрдпрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдк _рд╕рдВрднрд╡_ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдХрднреА рднреА рдЕрдкрдирд╛ рдРрдк рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдпрд╛ рдмреЗрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЖрдЧреЗ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЬрд╛рдКрдВ, рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ _рдХреНрдпреЛрдВ_ рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдкреНрд╕ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдРрдкреНрд╕ рдореЗрдВ рдиреЛрдб рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЕрджреНрднреБрдд рд╢рдХреНрддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрдмрдВрдзреА рдЪрд┐рдВрддрд╛рдПрдВ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдРрдк рдХреЛ рдиреЗрдЯрд┐рд╡-рдУрдПрд╕ (рдпрд╛рдиреА рдиреЛрдб) рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдЙрдирдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП ред
рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ @raddevus рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рджреВрд░рд╕реНрде рд╕рд╛рдордЧреНрд░реА рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдСрдлрд╝рд▓рд╛рдЗрди/рд╕реНрдерд╛рдиреАрдп рд╣реИ, рддреЛ рдЖрдк рд╢рд╛рдпрдж
nodeIntegration:true
рдЪрд╛рд▓реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЕрднреА рднреА рдЖрдкрдХреЗ рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрдХрд╕реНрдорд┐рдХ/рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПnodeIntegration:false
рд░рдЦрдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдиреВрдВрдЧрд╛, рдФрд░ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореИрд▓рд╡реЗрдпрд░ рдХреЛ рд░реЛрдХреВрдВрдЧрд╛ рдЬреЛ рдХрднреА рднреА рдЖрдкрдХреА рдорд╢реАрди рдкрд░ рдЖрдкрдХреЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдк рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИредnodeIntegration:true
рд╣рдорд▓рд╛ рд╡реЗрдХреНрдЯрд░ (рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рджреБрд░реНрд▓рдн, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)!
рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░рд╡рд┐рдВрдбреЛ рдореЗрдВ nodeIntegration: true
рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЗ рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдиреЛрдб рдореЙрдбреНрдпреВрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдорд┐рд▓рддреА рд╣реИред _рдпрд╣_ рдХрд░рдирд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ require("fs")
рдФрд░ require("electron")
, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ XSS рднреЗрджреНрдпрддрд╛ рдорд┐рд▓рдиреА рд╣реИ, рддреЛ рд╡реЗ рдЖрдкрдХреА рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдЬрд╛рдЧрд░ рдХреА рдЧрдИ рдХреЛрдИ рднреА рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ
рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рдпрд╛ рдХреБрдЫ рдФрд░ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рд╣реИред
рдиреЛрдб рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдХреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдРрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛред рд╡реЗрдмрдкреИрдХ рдХреБрдЫ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП target: 'electron-renderer'
рдпрд╛ рд╡реЗрдмрдкреИрдХ рдПрдХреНрд╕рдЯрд░реНрдирд▓ рдЬреИрд╕реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрди рдЪрд░реЛрдВ ( ipcRenderer
) рд╕реЗ рдЧреБрдЬрд░рдиреЗ рджреЗрддреА рд╣реИрдВред
рдлрд┐рд░ рднреА, рдЖрдк рдЕрдкрдирд╛ рдРрдк рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
рдЖрдк рд░рд┐рдореЛрдЯ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ ipcRenderer
рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд░реВрдк рдореЗрдВ 'рдж рдЖрд╕рд╛рди рддрд░реАрдХрд╛' рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЕрдиреБрд╢рдВрд╕рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛
рдЕрд░реНрдерд╛рддред рд░рд┐рдореЛрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬреЗрдПрд╕-рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреА рдорд╢реАрди/рдРрдк рдкрд░ рдХрд╣рд░ рдмрд░рдкрд╛ рд╕рдХрддрд╛ рд╣реИред
@marksyzm рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдо рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ ipcRenderer
рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП IPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реЗрдЯрдЕрдк рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░рджреВрд╖рдг рд╣рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдРрдк рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ 80% рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдЕрдкрдиреЗ fs
/ ipcRenderer
рдХреЛ рдЕрдкрдиреА рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ IPC (рдЗрдВрдЯрд░-рдкреНрд░реЛрд╕реЗрд╕-рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди) рдХреЗ рд╕рд╛рде рд╣реИред рдпрд╣ рдореБрдЦреНрдп рдФрд░ рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмреАрдЪ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рддрд░реАрдХрд╛ рд╣реИред рдЯреВрдЯрд╛ рд╣реБрдЖ, рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЗ рдРрдк рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ:
preload
рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЧреБрдг рдПрдХ js рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ require
рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рд▓реЛрдб рд╣реЛрддреА рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ ipcRenderer рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ)contextIsolation: true
рднреА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреА рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрдИрдкреАрд╕реА рд░реЗрдВрдбрд░рд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдмреНрд░рд┐рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИipcRenderer
рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВfs
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ_рдореЛрдЯреЗ рддреМрд░ рдкрд░_ рдпреЗ рд╕рднреА рдЪрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:
main.js
const {
app,
BrowserWindow,
ipcMain
} = require("electron");
const path = require("path");
const fs = require("fs");
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win;
async function createWindow() {
// Create the browser window.
win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: false, // is default value after Electron v5
contextIsolation: true, // protect against prototype pollution
enableRemoteModule: false, // turn off remote
preload: path.join(__dirname, "preload.js") // use a preload script
}
});
// Load app
win.loadFile(path.join(__dirname, "dist/index.html"));
// rest of code..
}
app.on("ready", createWindow);
ipcMain.on("toMain", (event, args) => {
fs.readFile("path/to/file", (error, data) => {
// Do something with file contents
// Send result back to renderer process
win.webContents.send("fromMain", responseObj);
});
});
рдкреНрд░реАрд▓реЛрдб.рдЬреЗрдПрд╕
const {
contextBridge,
ipcRenderer
} = require("electron");
// Expose protected methods that allow the renderer process to use
// the ipcRenderer without exposing the entire object
contextBridge.exposeInMainWorld(
"api", {
send: (channel, data) => {
// whitelist channels
let validChannels = ["toMain"];
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
},
receive: (channel, func) => {
let validChannels = ["fromMain"];
if (validChannels.includes(channel)) {
// Deliberately strip event as it includes `sender`
ipcRenderer.on(channel, (event, ...args) => func(...args));
}
}
}
);
index.html
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8"/>
<title>Title</title>
</head>
<body>
<script>
window.api.receive("fromMain", (data) => {
console.log(`Received ${data} from main process`);
});
window.api.send("toMain", "some data");
</script>
</body>
</html>
рдХрдо рд╕реЗ рдХрдо, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди v7 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдкреНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рд╣реИ, рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмреЗрдХ-рдЗрди рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП secure-electron-template
рдмрдирд╛рдпрд╛ рд╣реИред
рдКрдкрд░ @reZach рдХреА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдирд┐рд░реНрдорд╛рдг, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдореБрдЦреНрдп рдЕрдВрддрд░ preload.js рдореЗрдВ рд╣реИ , рдЬрд╣рд╛рдВ рдореЗрд░рд╛ рдПрдкреАрдЖрдИ ipcRenderer рдХреЗ рдХрд░реАрдм рд╣реИред
main.js
let newWindow = null;
function createWindow() {
newWindow = new BrowserWindow({
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
enableRemoteModule: false,
preload: path.join(__dirname, "preload.js")
}
});
newWindow.webContents.on('did-finish-load', () => {
newWindow.webContents.send('APP_MY_INIT', { data: 'hi' });
});
}
ipcMain.on('APP_SOMETHING', (event, ...args) => {
// ...
});
ipcMain.handle('APP_SOMETHING_ELSE', (event, ...args) => {
// ...
return myVar;
});
рдкреНрд░реАрд▓реЛрдб.рдЬреЗрдПрд╕
const { contextBridge, ipcRenderer } = require('electron');
function callIpcRenderer(method, channel, ...args) {
if (typeof channel !== 'string' || !channel.startsWith('APP_')) {
throw 'Error: IPC channel name not allowed';
}
if (['invoke', 'send'].includes(method)) {
return ipcRenderer[method](channel, ...args);
}
if ('on' === method) {
const listener = args[0];
if (!listener) throw 'Listener must be provided';
// Wrap the given listener in a new function to avoid exposing
// the `event` arg to our renderer.
const wrappedListener = (_event, ...a) => listener(...a);
ipcRenderer.on(channel, wrappedListener);
// The returned function must not return anything (and NOT
// return the value from `removeListener()`) to avoid exposing ipcRenderer.
return () => { ipcRenderer.removeListener(channel, wrappedListener); };
}
}
contextBridge.exposeInMainWorld(
'myIpcRenderer', {
invoke: (...args) => callIpcRenderer('invoke', ...args),
send: (...args) => callIpcRenderer('send', ...args),
on: (...args) => callIpcRenderer('on', ...args),
},
);
рдХреНрд▓рд╛рдЗрдВрдЯ.рдЬреЗрдПрд╕
const { myIpcRenderer } = window;
const removeMyListener = myIpcRenderer.on('APP_MY_INIT', data => {
console.log(data);
myIpcRenderer.send('APP_SOMETHING', 'foo');
})
async function test() {
const result = await myIpcRenderer.invoke('APP_SOMETHING_ELSE', 'foo', 'bar');
console.log(result);
}
test();
if (/* should remove listener === true */) {
removeMyListener();
}
рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, type.d.ts
declare global {
interface Window {
myIpcRenderer: MyIpcRenderer,
}
}
export interface MyIpcRenderer {
invoke(channel: string, ...args: any[]): Promise<any>;
send(channel: string, ...args: any[]): void;
/** <strong i="22">@return</strong> A function that removes this listener. */
on(channel: string, listener: (...args: any[]) => void): () => void;
}
рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдЗрд╕реЗ preload.js рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдореЙрдбреНрдпреВрд▓ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИ?
const errorLogging = require('../renderer/utils/errorLogging');
рдзрдиреНрдпрд╡рд╛рдж
@silentlight рдпрд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╢рд╛рдпрдж рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдПрдХ рдЬрд┐рдердм рд░реЗрдкреЛ рд╣реИ рдЬрд╣рд╛рдВ рдмрд╛рддрдЪреАрдд рдЬрд╛рд░реА рд░рд╣ рд╕рдХрддреА рд╣реИ? (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ require()
рдореЗрдВ рдЖрдкрдХрд╛ рдкрде рд╕рд╣реА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреЛрдб рджреЗрдЦреЗ рдмрд┐рдирд╛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рд░рд╣рд╛ рд╣реИ)ред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА window.require
рд╕рдорд╛рдзрд╛рди рд╣реИ, рдореИрдВ рд╕рд┐рд░реНрдл рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛:
function magic(module){
require(module)
}
const { ipcRenderer } = magic('electron')
рдЖрдкрдХреЗ рдмрдВрдбрд▓рд░ рдпрд╣ рдирд╣реАрдВ рдкрд╣рдЪрд╛рдиреЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк ES рдореЙрдбреНрдпреВрд▓ рдпрд╛ рдХреЙрдордирдЬреЗрдПрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕реЗ рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХреА
@ marc2332 рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдк рд╕реАрдзреЗ рдЗрд╕ рдЬрд╛рджреВ рдХреЗ рдЖрд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд╣рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдмреЗрдирдХрд╛рдм рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
@reZach рдореБрдЭреЗ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рдХрд┐
const { ipcRenderer } = eval("require('electron')")
@marc2332 рди рддреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред рдореИрдВ рдмрд╕ рдзреНрдпрд╛рди рджреЗ рд░рд╣рд╛ рд╣реВрдВ, рдпрджрд┐ рдЖрдк рджреВрд░рд╕реНрде рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдЦреЛрд▓ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ
рдзрдиреНрдпрд╡рд╛рдж рд░реЗрдЬрд╝рд╛рдЪ! рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЬрд▓реНрдж рд╣реА рд╕рдордЭреЗрдВрдЧреЗ
рдорд╛рд░реНрдХ рдПрд▓рдлрд┐рдВрд╕реНрдЯрди
www.oxfordsourceltd.com
рд╣рд╛рдп рдЬреИрдЪ, рдХреНрдпрд╛ contextBridge
рд╕рдорд╛рдзрд╛рди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?
contextIsolation: false
рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдореВрд▓ рдХреЛрдб рдмрд╕ window
рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди Promise<MediaStream>
рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ contextBridge
рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧрд┐рд░рд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдореИрдВрдиреЗ contextBridge
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рддреЛ рдореБрдЭреЗ рдПрдХ рдЦрд╛рд▓реА рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИред
рдХреНрдпрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рд▓реЗрдХрд┐рди contextIsolation: true
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рднреА рд╣реИ?
рд╣рд╛рдп рдЬреИрдЪ, рдХреНрдпрд╛
contextBridge
рд╕рдорд╛рдзрд╛рди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?
contextIsolation: false
рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдореВрд▓ рдХреЛрдб рдмрд╕window
рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рдиPromise<MediaStream>
рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐contextBridge
рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧрд┐рд░рд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдореИрдВрдиреЗcontextBridge
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рддреЛ рдореБрдЭреЗ рдПрдХ рдЦрд╛рд▓реА рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИредрдХреНрдпрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рд▓реЗрдХрд┐рди
contextIsolation: true
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рднреА рд╣реИ?
рдирд╣реАрдВ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рджреНрд╡рд╛рд░рд╛ рдпрд╛рдж рдХреА рдЧрдИ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЗрд░рд╛рджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди v8, ( рдкреАрдЖрд░ 20214 ) рдореЗрдВ рдЖрдИрдкреАрд╕реА рдХреЗ рднреАрддрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХреНрд░рдорд╛рдВрдХрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЬрдм рд╕рдВрджрд░реНрдн рдЕрд▓рдЧрд╛рд╡ рдЪрд╛рд▓реВ рд╣реИ) рдЬреЛ рд╕рдорд░реНрдерди рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣рд┐рд╖реНрдХреГрдд, рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкред
рдиреЛрдЯ: рд╡реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ V8 рдХреЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдХреНрд▓реЛрди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рд╕рд╛рде рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕, DOM рдСрдмреНрдЬреЗрдХреНрдЯ, рд╡рд┐рд╢реЗрд╖ рдиреЛрдб/рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреИрд╕реЗ process.env рдпрд╛ WebContents, рдпрд╛ рдРрд╕реЗ рдЖрдЗрдЯрдо рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрд░рд╛рдиреЗ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ :: рдорд╛рди- рдЖрдзрд╛рд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдоред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрд╣рд┐рд╖реНрдХреГрдд рд╣реИ рдФрд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди 9 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред
рдпрд╣ рд╢рд╛рдпрдж рд╡рд╣ рдЦрдмрд░ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╕реБрдирдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдорджрдж рдХреАред
рд╣рд╛рдп рдЬреИрдЪ, рдХреНрдпрд╛
contextBridge
рд╕рдорд╛рдзрд╛рди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?
contextIsolation: false
рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдореВрд▓ рдХреЛрдб рдмрд╕window
рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рдиPromise<MediaStream>
рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐contextBridge
рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧрд┐рд░рд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдореИрдВрдиреЗcontextBridge
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рддреЛ рдореБрдЭреЗ рдПрдХ рдЦрд╛рд▓реА рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИред
рдХреНрдпрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рд▓реЗрдХрд┐рдиcontextIsolation: true
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рднреА рд╣реИ?рдирд╣реАрдВ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рджреНрд╡рд╛рд░рд╛ рдпрд╛рдж рдХреА рдЧрдИ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЗрд░рд╛рджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди v8, ( рдкреАрдЖрд░ 20214 ) рдореЗрдВ рдЖрдИрдкреАрд╕реА рдХреЗ рднреАрддрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХреНрд░рдорд╛рдВрдХрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЬрдм рд╕рдВрджрд░реНрдн рдЕрд▓рдЧрд╛рд╡ рдЪрд╛рд▓реВ рд╣реИ) рдЬреЛ рд╕рдорд░реНрдерди рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣рд┐рд╖реНрдХреГрдд, рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкред
рдиреЛрдЯ: рд╡реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ V8 рдХреЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдХреНрд▓реЛрди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рд╕рд╛рде рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕, DOM рдСрдмреНрдЬреЗрдХреНрдЯ, рд╡рд┐рд╢реЗрд╖ рдиреЛрдб/рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреИрд╕реЗ process.env рдпрд╛ WebContents, рдпрд╛ рдРрд╕реЗ рдЖрдЗрдЯрдо рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрд░рд╛рдиреЗ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ :: рдорд╛рди- рдЖрдзрд╛рд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдоред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрд╣рд┐рд╖реНрдХреГрдд рд╣реИ рдФрд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди 9 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред
рдпрд╣ рд╢рд╛рдпрдж рд╡рд╣ рдЦрдмрд░ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╕реБрдирдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдорджрдж рдХреАред
рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рддреНрд╡рд░рд┐рдд рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ ( @reZach рдФрд░ @aplum рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛), рдФрд░ рдореИрдВ рдЕрдкрдиреЗ client.js
рд╕реЗ preload.js
рд╕реЗ main.js
рддрдХ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬ рд░рд╣рд╛ рд╣реВрдВред
рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рд╕рдм рдХреБрдЫ рдЪрд▓рд╛рддреЗ рд╕рдордп, рд╕рдВрдЪрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ electron-builder
рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рд╕рдВрдЪрд╛рд░ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рдиреЗ рдкрд░ setBadge()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ client.js
рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЧрд┐рдирддреА рд▓реЗ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ contextBridge
рдФрд░ рдлрд┐рд░ main.js
рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ app.dock.setBadge(count)
рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред electron-builder
рд╕рд╛рде рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореЗрдВ рд╕рдВрдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ?
"electron": "^8.2.3",
"electron-builder": "^22.4.0",
const { ipcMain } = electron;
app.on('ready', () => {
mainWindow = new BrowserWindow({
height: height,
width: width,
minHeight: 575,
minWidth: 900,
center: true,
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
enableRemoteModule: false,
spellcheck: true,
preload: path.join(__dirname, "preload.js")
},
});
}
ipcMain.on('SEND_BADGE_COUNT', (e, count) => {
const badgeCount = count > 0 ? count : '';
app.dock.setBadge(`${badgeCount}`)
})
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld(
'setBadgeCountForElectron', {
send: (channel, data) => {
console.log(`Preload ${channel}, ${data}`)
ipcRenderer.send(channel, data)
}
}
)
const { setBadgeCountForElectron } = window;
function sendBadgeCount(count) {
!!setBadgeCountForElectron && setBadgeCountForElectron.send('SEND_BADGE_COUNT', count)
}
sendBadgeCount(count)
"name": "desktop_app",
"version": "0.1.8-beta",
"private": true,
"description": "",
"homepage": "./",
"main": "public/electron.js",
"build": {
"copyright": "Copyright ┬й 2020 My Company",
"appId": "com.my-app.app",
"productName": "My Company",
"buildVersion": "0.0.1-beta",
"mac": {
"category": "public.app-category.utilities",
"icon": "./public/images/mac-icon.png"
},
"win": {
"icon": "./public/images/windows-icon.png"
},
"files": [
"build/**/*",
"node_modules/**/*"
],
"directories": {
"buildResources": "assets"
}
},
@SterlingChin , рдореИрдВ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдЯреАрдо рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░рдХреНрд╖рдХ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рдмрд┐рд▓реНрдбрд░ рд░реЗрдкреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рдкреНрд░рд╢реНрди-рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рдмрд┐рд▓реНрдбрд░ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдореБрджреНрджрд╛ рд╣реИ, рдЬрдм рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд▓ рд▓рд┐рдпрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рдмрд┐рд▓реНрдбрд░ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдореБрджреНрджрд╛ рд╣реИ, рдЬрдм рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд▓ рд▓рд┐рдпрд╛ред
рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯреБрдХрдбрд╝рд╛ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдпрд╣ рд╕рдм рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ electron-builder
рд░реЗрдкреЛ рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЛрдИ рдХрд░реНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рдмрд┐рд▓реНрдбрд░ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдореБрджреНрджрд╛ рд╣реИ, рдЬрдм рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд▓ рд▓рд┐рдпрд╛ред
рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯреБрдХрдбрд╝рд╛ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдпрд╣ рд╕рдм рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ
electron-builder
рд░реЗрдкреЛ рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЛрдИ рдХрд░реНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред
рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдорд╡реАрдкреА рд░реЗрдкреЛ рдмрдирд╛рдпрд╛ рд╣реИ? рдпрд╣ рдХрднреА-рдХрднреА рдорджрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрдкрдХреЛ рдПрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред
@Amthieu рдФрд░ @CiriousJoker рдореИрдВ рдЖрдк рджреЛрдиреЛрдВ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдБ рдзрдиреНрдпрд╡рд╛рджред
рдлрд╝рдВрдХреНрд╢рди addRendererTarget (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди) {
config.target = 'рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд░';
рд╡рд╛рдкрд╕реА рд╡рд┐рдиреНрдпрд╛рд╕;
}
рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕ = рдУрд╡рд░рд░рд╛рдЗрдб (addRendererTarget); `
рдореИрдВ vuejs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдмрд╕ vue.config.js . рдореЗрдВ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ
рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯ = {
"рдкрд╛рд░рджрд░реНрд╢реА рдирд┐рд░реНрднрд░рддрд╛": [
"vuetify"
],
рдкреНрд▓рдЧрдЗрдирд╡рд┐рдХрд▓реНрдк: {
рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирдмрд┐рд▓реНрдбрд░: {
рдиреЛрдбрдПрдХреАрдХрд░рдг: рд╕рдЪ
}
}
}
@genilsonmm рдкрд╡рд┐рддреНрд░ рдмрдХрд╡рд╛рд╕ рдЬрд┐рд╕рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛! рдореИрдВ рдкрд┐рдЫрд▓реЗ 3 рдШрдВрдЯреЗ рд╕реЗ рдкрд╛рдЧрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реВрдВред рдзрдиреНрдпрд╡рд╛рдж!!
рдЙрд╕ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдВрд╢ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ рд╡рд╣ рдерд╛
```рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдкреНрд▓рдЧрдЗрдирд╡рд┐рдХрд▓реНрдк: {
рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирдмрд┐рд▓реНрдбрд░: {
рдиреЛрдбрдПрдХреАрдХрд░рдг: рд╕рдЪ
}
},
"рдкрд╛рд░рджрд░реНрд╢реА рдирд┐рд░реНрднрд░рддрд╛": [
"vuetify"
],
рдпрд╣ рдореБрдЭ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ...рд▓реЗрдХрд┐рди window.require('electron') рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ
рдЙрди рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ "window.require рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ"
рдЖрдкрдиреЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдкрд░ рдПрдХ рдкреНрд░реАрд▓реЛрдбреЗрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ рд╣реИред
рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ preload.js рдирд╛рдо рдХреА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ рдЬрд╣рд╛рдБ рдЖрдкрдХреЗ рдкрд╛рд╕ de рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рдЗрд╕ рдХреЛрдб рдХреЛ рдЙрд╕ рдкрд░ рд░рдЦреЗрдВ:
window.require = рдЖрд╡рд╢реНрдпрдХрддрд╛;
рдЕрдкрдиреА рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдЙрд╕ рдХреЛрдб рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЖрдк рд╡рд┐рдВрдбреЛ рдмрдирд╛рддреЗ рд╣реИрдВ:
рдЬреАрдд = рдирдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░рд╡рд┐рдВрдбреЛ ({
рдЪреМрдбрд╝рд╛рдИ: 1280,
рдКрдВрдЪрд╛рдИ: 720,
рд╡реЗрдм рд╡рд░реАрдпрддрд╛рдПрдБ: {
рдиреЛрдб рдПрдХреАрдХрд░рдг: рдЭреВрдард╛,
рдкреНрд░реАрд▓реЛрдб: __dirname + '/preload.js'
},
})
рдЗрд╕рд╕реЗ рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдХрд░ рджреЗрдВрдЧреЗ, рдЗрд╕рд╕реЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИред рдореБрдЭреЗ рдЖрдкрд╕реЗ рднреА рдЙрдореНрдореАрдж рд╣реИ :)
@reZach рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдПрдХ рдЧрд▓рддреА рджреЗрдЦреА рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдареЛрдХрд░ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдХрд┐рдпрд╛, рдУрд╣!):
receive: (channel, func) => { let validChannels = ["fromMain"]; if (validChannels.includes(channel)) { // Deliberately strip event as it includes `sender` ipcRenderer.on(channel, (event, ...args) => fn(...args)); } }
рдЖрдк рдЕрдкрдиреЗ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ "func" рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ "fn" рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдЖрдк рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред
рд╡рд┐рд╕реНрддреГрдд рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж: +1:
@genilsonmm рдЕрдЧрд░ рдореИрдВ vue.config.js рдбрд╛рд▓рддрд╛ рд╣реВрдВ:
рдкреНрд▓рдЧрдЗрдирд╡рд┐рдХрд▓реНрдк: {
рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирдмрд┐рд▓реНрдбрд░: {
рдиреЛрдб рдПрдХреАрдХрд░рдг: рд╕рдЪ,
рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ "рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ":
рдЕрдЧрд░ рдореИрдВ "рдиреЛрдбрдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди: рдЯреНрд░реВ" рд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдРрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?
@marcoippolito рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ require
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдиреЛрдб рдЬреЗрдПрд╕ рдХреА рдореЙрдбреНрдпреВрд▓ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╡рд┐рдзрд┐ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдк рдиреЛрдб рдПрдХреАрдХрд░рдг рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЬреЛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ рд╣реИ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ ( var
рдЕрдЧрд░ рдореБрдЭреЗ рд╕рд╣реА рдпрд╛рдж рд╣реИ рддреЛ рд▓рдХреНрд╖реНрдп рд╣реИ) рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдИ рднреА рдХреЛрдб рдиреЛрдб рдПрдкрд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдиреЗрдХреНрд╕реНрдЯ.рдЬреЗрдПрд╕ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
https://github.com/vercel/next.js/search?q=ipcRenderer&unscoped_q=ipcRenderer
рдкреНрд░реАрд▓реЛрдб.ts
/* eslint-disable @typescript-eslint/no-namespace */
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { ipcRenderer, IpcRenderer } from 'electron'
declare global {
namespace NodeJS {
interface Global {
ipcRenderer: IpcRenderer
}
}
}
// Since we disabled nodeIntegration we can reintroduce
// needed node functionality here
process.once('loaded', () => {
global.ipcRenderer = ipcRenderer
})
index.tsx
import { useState, useEffect } from 'react'
const Home = () => {
const [input, setInput] = useState('')
const [message, setMessage] = useState(null)
useEffect(() => {
const handleMessage = (event, message) => setMessage(message)
global.ipcRenderer.on('message', handleMessage)
return () => {
global.ipcRenderer.removeListener('message', handleMessage)
}
}, [])
const handleSubmit = (event) => {
event.preventDefault()
global.ipcRenderer.send('message', input)
setMessage(null)
}
return (
<div>
<h1>Hello Electron!</h1>
</div>
)
}
export default Home
@genilsonmm рдкрд╡рд┐рддреНрд░ рдмрдХрд╡рд╛рд╕ рдЬрд┐рд╕рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛! рдореИрдВ рдкрд┐рдЫрд▓реЗ 3 рдШрдВрдЯреЗ рд╕реЗ рдкрд╛рдЧрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реВрдВред рдзрдиреНрдпрд╡рд╛рдж!!
рдЙрд╕ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдВрд╢ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ рд╡рд╣ рдерд╛pluginOptions: { electronBuilder: { nodeIntegration: true } },
рдореИрдВ
рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рднреА NodeIntegration рд╕рдХреНрд╖рдо рд╣реИред рджреЛрдиреЛрдВ window.require рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗред
+рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рд╕рд╛рджрд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдирд╣реАрдВ
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@MarshallOfSound рдореЗрд░реА рдЧрд▓рддреА рд╣реИред
рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ # 7300 рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рдЖрдк рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдРрдк рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЕрдВрджрд░ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрднреА рднреА рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рд╡рд┐рдВрдбреЛ.require рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореЗрдВ рд╣реИ)ред