Electron: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдЖрдпрд╛рдд рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ | рдЖрдпрд╛рдд {ipcRenderer} 'рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди' рд╕реЗ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдЬреБрд▓ре░ 2017  ┬╖  65рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: electron/electron

рдореИрдВрдиреЗ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдРрдк рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИред рдЬрдм рддрдХ рдореИрдВрдиреЗ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА, рддрдм рддрдХ рд╕рдм рдХреБрдЫ рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЕрдЧрд░ рдореИрдВ рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рдРрдк рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрдХреНрд╖ рд╕реЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 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 рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореЗрдВ рд╣реИ)ред

рд╕рднреА 65 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕реАрдЖрд░рдП рд╡реЗрдмрдкреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдорд╛рдирдХ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдбрд┐рдВрдЧ (рдПрдлрдПрд╕ рд╕рд╣рд┐рдд) рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рд╡реЗрдмрдкреИрдХ рдХреЗ рд▓рд┐рдП рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореЛрдб рдореЗрдВ рджреЗрдЦрдиреЗ рдФрд░ рд╕реАрдЖрд░рдП рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛

рдЧрд┐рдЯрд╣рдм рдореБрджреНрджреЗ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рд╣реИрдВ, рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рд╕рдореБрджрд╛рдп рдпрд╛ рд╕реНрд▓реИрдХ рдЪреИрдирд▓ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред

@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:

рдареАрдХ рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдорд╛рдзрд╛рди рд╣реИред

  1. рдХреЛрдб рдХреЗ рд╕рд╛рде preload.js file рдмрдирд╛рдПрдВ:
window.ipcRenderer = require('electron').ipcRenderer;
  1. рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдиреЗ main.js рдореЗрдВ webPreferences рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реАрд▓реЛрдб рдХрд░реЗрдВ:
  mainWindow = new BrowserWindow({
    width: 800, 
    height: 600,
    webPreferences: {
      nodeIntegration: false,
      preload: __dirname + '/preload.js'
    }
  });
  1. рдЕрдм, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдРрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рд╣реЛрдЧрд╛ред рдЬреИрд╕реЗ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛:
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

рдмрд╕ рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝реЗрдВ: рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ "рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд░"ред
рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ {
...
рд▓рдХреНрд╖реНрдп: "рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд░"
...
}

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдЙрдкрдХрд░рдг рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:

  • рд╡реЗрдмрдкреИрдХ: "3.8.1"
  • рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди: "4.2.1"

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ electron-renderer рд╕рд┐рд░реНрдл рдЗрд╕ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдореБрдЭреЗ window.required рдЬреИрд╕реЗ рд╡рд╛рдпрд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдЯрд╛рдЗрдкрд┐рдВрдЧ рднреА рдЦреЛ рдЧрдпрд╛ рд╣реИ!

рдореЗрд░реЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд┐рдпрд╛: рд╡реЗрдмрдкреИрдХ рдФрд░ рдиреЛрдб рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП "рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд┐рдВрдЧ": рдмреНрд░рд╛рдЙрдЬрд╝рд░рд╡рд┐рдВрдбреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕рдЪ
рдореИрдВ рдЖрдЬ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╡реЗрдмрдкреИрдХ+рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди+рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рд╕реЗрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рдЗрди рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ рднреА рдЗрд╕ рддреНрд░реБрдЯрд┐ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдХрд╣реА рдЧрдИ рдмрд╛рддреЛрдВ рдХрд╛ рдпреЛрдЧ рд╣реИ:

  1. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ "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;
};
  1. рдиреЛрдб рдПрдХреАрдХрд░рдг рдЬреЛрдбрд╝реЗрдВ
new BrowserWindow({
  webPreferences: {
    nodeIntegration: true
  }
});
  1. 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 (рдЗрдВрдЯрд░-рдкреНрд░реЛрд╕реЗрд╕-рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди) рдХреЗ рд╕рд╛рде рд╣реИред рдпрд╣ рдореБрдЦреНрдп рдФрд░ рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмреАрдЪ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдХрд╛ рддрд░реАрдХрд╛ рд╣реИред рдЯреВрдЯрд╛ рд╣реБрдЖ, рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЗ рдРрдк рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ:

  1. рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░рд╡рд┐рдВрдбреЛ рдореЗрдВ preload рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЧреБрдг рдПрдХ js рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ require рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рд▓реЛрдб рд╣реЛрддреА рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ ipcRenderer рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ)
  2. рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░рджреВрд╖рдг рд╣рдорд▓реЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░рд╡рд┐рдВрдбреЛ рдореЗрдВ contextIsolation: true рднреА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреА рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрдИрдкреАрд╕реА рд░реЗрдВрдбрд░рд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдмреНрд░рд┐рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  3. рдкреНрд░реАрд▓реЛрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╕рдВрджрд░реНрдн рдмреНрд░рд┐рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЕрдкрдиреА рд░реЗрдВрдбрд░рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ ipcRenderer рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ
  4. рдЕрдкрдиреА рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдЖрдк ipcRenderer ( ipcMain рдореЙрдбреНрдпреВрд▓ рдореЗрдВ) рдХреЗ рд▓рд┐рдП рд╢реНрд░реЛрддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрди рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рднреАрддрд░ рдЖрдк 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)
        }
    }
)

Client.js

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 рдореИрдВ рдЖрдк рджреЛрдиреЛрдВ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдБ рдзрдиреНрдпрд╡рд╛рджред

  1. рдпрд╛рд░реНрди рдРрдб-рдбреА рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝-рд╕реАрдЖрд░рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк-рд░рд┐рд╡рд╛рдпрд░реНрдб
  2. рд░рд┐рдПрдХреНрдЯ-рдРрдк-рд░реАрд╡рд╛рдпрд░реНрдб рд╕реНрдЯрд╛рд░реНрдЯ рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ: "рд╕реНрдЯрд╛рд░реНрдЯ": "рдмреНрд░рд╛рдЙрдЬрд╝рд░ = рдХреЛрдИ рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк-рд░рд┐рд╡рд╛рдпрд░реНрдб рд╕реНрдЯрд╛рд░реНрдЯ рдирд╣реАрдВ",
  3. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдРрдк рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ 'рдХреЙрдиреНрдлрд╝рд┐рдЧрд░-рдУрд╡рд░рд░рд╛рдЗрдб' рдмрдирд╛рдПрдВ:
    `рдХреЙрдиреНрд╕реНрдЯ {рдУрд╡рд░рд░рд╛рдЗрдб} = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝-рдХреНрд░реИ');

рдлрд╝рдВрдХреНрд╢рди addRendererTarget (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди) {
config.target = 'рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд░реЗрдВрдбрд░рд░';

рд╡рд╛рдкрд╕реА рд╡рд┐рдиреНрдпрд╛рд╕;
}

рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕ = рдУрд╡рд░рд░рд╛рдЗрдб (addRendererTarget); `

  1. рдЕрдм рдЖрдк 'рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди' рд╕реЗ {ipcRenderer} рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :)

рдореИрдВ vuejs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдмрд╕ vue.config.js . рдореЗрдВ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ

рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯ = {
"рдкрд╛рд░рджрд░реНрд╢реА рдирд┐рд░реНрднрд░рддрд╛": [
"vuetify"
],
рдкреНрд▓рдЧрдЗрдирд╡рд┐рдХрд▓реНрдк: {
рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирдмрд┐рд▓реНрдбрд░: {
рдиреЛрдбрдПрдХреАрдХрд░рдг: рд╕рдЪ
}
}
}

@genilsonmm рдкрд╡рд┐рддреНрд░ рдмрдХрд╡рд╛рд╕ рдЬрд┐рд╕рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛! рдореИрдВ рдкрд┐рдЫрд▓реЗ 3 рдШрдВрдЯреЗ рд╕реЗ рдкрд╛рдЧрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реВрдВред рдзрдиреНрдпрд╡рд╛рдж!!
рдЙрд╕ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдВрд╢ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ рд╡рд╣ рдерд╛
```рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдкреНрд▓рдЧрдЗрдирд╡рд┐рдХрд▓реНрдк: {
рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирдмрд┐рд▓реНрдбрд░: {
рдиреЛрдбрдПрдХреАрдХрд░рдг: рд╕рдЪ
}
},

"рдкрд╛рд░рджрд░реНрд╢реА рдирд┐рд░реНрднрд░рддрд╛": [
"vuetify"
],

рдпрд╣ рдореБрдЭ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ...рд▓реЗрдХрд┐рди window.require('electron') рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ

рдЙрди рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ "window.require рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ"

рдЖрдкрдиреЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдкрд░ рдПрдХ рдкреНрд░реАрд▓реЛрдбреЗрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ рд╣реИред

  1. рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ preload.js рдирд╛рдо рдХреА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ рдЬрд╣рд╛рдБ рдЖрдкрдХреЗ рдкрд╛рд╕ de рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рдЗрд╕ рдХреЛрдб рдХреЛ рдЙрд╕ рдкрд░ рд░рдЦреЗрдВ:

    window.require = рдЖрд╡рд╢реНрдпрдХрддрд╛;

  2. рдЕрдкрдиреА рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдЙрд╕ рдХреЛрдб рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдЖрдк рд╡рд┐рдВрдбреЛ рдмрдирд╛рддреЗ рд╣реИрдВ:

    рдЬреАрдд = рдирдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░рд╡рд┐рдВрдбреЛ ({
    рдЪреМрдбрд╝рд╛рдИ: 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 рдбрд╛рд▓рддрд╛ рд╣реВрдВ:

рдкреНрд▓рдЧрдЗрдирд╡рд┐рдХрд▓реНрдк: {
рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирдмрд┐рд▓реНрдбрд░: {
рдиреЛрдб рдПрдХреАрдХрд░рдг: рд╕рдЪ,

рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ "рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ":

image

рдЕрдЧрд░ рдореИрдВ "рдиреЛрдбрдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди: рдЯреНрд░реВ" рд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдРрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

@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 рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗред

+рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рд╕рд╛рджрд╛ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди рдирд╣реАрдВ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

reggi picture reggi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rhnorskov picture rhnorskov  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cniaulin picture cniaulin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wsangtoki picture wsangtoki  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lealife picture lealife  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ