2.4.13 • Published 3 years ago

electron-module-manager v2.4.13

Weekly downloads
107
License
MIT
Repository
github
Last release
3 years ago

Electron Module Manager

A simple implementation of windows/modules management system for React-based Electron application. Allows you to set up simple and secure communication between main and renderer processes, using separate context and state for each window.

Easy to set up, update and maintain 😊.

Installation

  • Add package as dependency:
npm install electron-module-manager
  • Create an enum with list of your module types:
export const enum ModuleType {
    COUNTER
}
  • Create an interface with the module state (optional):
export interface CounterModuleState {
    counter:number;
}
  • Create module class, extending base Module class:
export class CounterModule extends Module<CounterModuleState> {
    public async increaseValue():Promise<void> {
        // updating module state and notifying module view

        this.updateState({
            counter: this._state.counter + 1
        });
    }

    public get windowOptions():WindowBaseOptions {
        // providing initial state for window view

        return {
            moduleTitle: 'Counter',
            width: 250,
            height: 250
        };
    }
}
  • Create module view class, extending base ModuleView class:
export class CounterModuleView extends ModuleView<CounterModule> {
    private _updatesCount:number = 0;

    private increaseCounterValue = async () => {
        this._updatesCount++;
        await this._context.increaseValue();
    };

    public componentDidMount() {
        setInterval(this.increaseCounterValue, 1000);
        super.componentDidMount();
    }

    public render():React.ReactNode {
        return (
            <div className="counter">
                <div>Current window <strong>counter</strong>: { this._updatesCount }</div>
                <div>Global <strong>counter</strong>: { this.state.counter }</div>
            </div>
        );
    }
}
  • Create entry points (application, preload & window scrips):
// application.ts - binding module type with module class

const application = new Application(
    'window.html', 'window.bridge.js', {
        [ModuleType.COUNTER]: CounterModule
    }
);

Electron.app.on('ready', async () => {
    await application.windowManager.createParent<CounterModuleState>(
        ModuleType.COUNTER, {
            // setting up initial module state
            counter: 0
        }
    );
});
// window.bridge.js - preload script, exposing main process API to renderer 

BridgeProcessWorker.createBridge();
// window.js - binding module type with module view class

WindowProcessWorker.createWindow(
    WindowView, '#application', {
        [ModuleType.COUNTER]: CounterModuleView
    }
);
  • Check that "usedExports" flag is enabled in "optimization" options for your webpack config:
// webpack.config.js

module.exports = {
    optimization: {
        usedExports: true
    },

    // ...
};

Communication

Starting from v2.3.0 communication between Module and ModuleView (view state updating) is done using JSON patch.

It leads to a small overhead when modules have a simple state (1-2 fields). But, which is a more realistic situation, gives huge performance when modules state have a complex structure (arrays, trees with deep length, etc).

Example

Example application could be found here.

2.4.13

3 years ago

2.4.12

3 years ago

2.4.11

3 years ago

2.4.10

3 years ago

2.4.7

3 years ago

2.4.6

3 years ago

2.4.9

3 years ago

2.4.8

3 years ago

2.4.1

3 years ago

2.4.0

3 years ago

2.4.3

3 years ago

2.4.2

3 years ago

2.4.5

3 years ago

2.4.4

3 years ago

2.3.1

3 years ago

2.3.0

3 years ago

2.2.0

3 years ago

2.1.1

3 years ago

2.1.0

3 years ago

2.0.0

3 years ago

1.4.6

3 years ago

1.4.5

3 years ago

1.5.3

3 years ago

1.4.4

3 years ago

1.5.2

3 years ago

1.6.0

3 years ago

1.5.1

3 years ago

1.5.0

3 years ago

1.4.8

3 years ago

1.4.7

3 years ago

1.4.3

3 years ago

1.4.2

3 years ago

1.4.1

3 years ago

1.4.0

3 years ago

1.3.4

3 years ago

1.3.3

3 years ago

1.3.2

3 years ago

1.2.5

3 years ago

1.2.4

3 years ago

1.3.1

3 years ago

1.3.0

3 years ago

1.2.3

3 years ago

1.2.2

3 years ago

1.2.0

3 years ago

1.2.1

3 years ago

1.1.3

3 years ago

1.1.2

3 years ago

1.1.1

3 years ago

1.1.0

3 years ago

1.0.9

3 years ago

1.0.8

3 years ago

1.0.7

3 years ago

1.0.6

3 years ago

1.0.5

3 years ago

1.0.4

3 years ago

1.0.3

3 years ago

1.0.2

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago