0.3.0 • Published 6 years ago

electron-dynamic-preload v0.3.0

Weekly downloads
1
License
MIT
Repository
github
Last release
6 years ago

electron-dynamic-preload

Sometimes it's handy to be able to pass parameters to Electron preload scripts

This module uses the session.setPreloads() API introduced in Electron 2.x.x. It won't work on older releases!

addPreloadWithParams(modulePath, exportName[, params, session])

ParameterTypeDescriptionDefault
modulePathstringPath to file to load in preload
exportNamestringName of export to execute
paramsany[]Parameters to pass to default exported function[]
sessionElectron.sessionThe session to add preload scripts tosession.defaultSession

Points to note:

  • All params to the renderer are serialised so dont expect anything to make it through that doesn't survive JSON.parse(JSON.stringify(data)).

  • Electron preload scripts are passed to the renderer via command line arguments. There is probably a limit to the amount of data that can be passed this way. If you have to look up this limit, you're probably attempting to pass something ridiculously large. Do it another way!

Full Example

Say you want to make a library that allows you to set the background colour of all BrowserWindows from the main process (yes this is an oversimplified example):

script.js

import { addPreloadWithParams } from 'electron-dynamic-preload';

export function setBackgroundColor(color) {
  if (process.type === 'browser') {
    addPreloadWithParams(__filename, setBackgroundColor.name, arguments);
  } else {
    window.addEventListener('DOMContentLoaded', () => {
      document.body.style.backgroundColor = color;
    });
  }
}

main.js

import { BrowserWindow, app } from 'electron';
import { setBackgroundColor } from './script';
import * as path from 'path';

// This call in the main process is all that's required!
setBackgroundColor('red');

app.on('ready', () => {
  var win = new BrowserWindow();
  win.loadURL(path.join(__dirname, 'index.html'));
});

How Does It Work?

The Electron session.setPreloads API only lets us pass absolute paths as preload scripts. To get round this, we append a magic string, the export name and the encoded parameters to ensure it still looks like an absolute path.

The above example results in the following --preload-scripts argument being passed to the renderer process.

--preload-scripts="/user/me/my-app/node_modules/electron-dynamic-preload/dist/wrap-require;/user/me/my-app/script.js/edp-require-with-params/setBackgroundColor/%5B%22red%22%5D"

electron-dynamic-preload ensures that the first preload script wraps require. This ensures that subsequent preload scripts have the magic string removed, parameters decoded and then pass them to the named export.

FAQ

  1. Is this not super hacky and 🤮

    Yes, probably!

0.3.0

6 years ago

0.2.5

6 years ago

0.2.4

6 years ago

0.2.3

6 years ago

0.2.2

6 years ago

0.2.1

6 years ago

0.2.0

6 years ago

0.1.4

7 years ago

0.1.3

7 years ago

0.1.2

7 years ago

0.1.1

7 years ago

0.1.0

7 years ago