npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

electron-module-manager

v2.4.13

Published

A simple implementation of windows/modules management for React-based Electron application

Downloads

43

Readme

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.