davideicardi / live-plugin-manager

Plugin manager and installer for Node.JS
MIT License
225 stars 43 forks source link

pluginManager.require results in an immediate exception - 'MODULE_NOT_FOUND' #32

Closed karlitos closed 3 years ago

karlitos commented 3 years ago

Hello,

I am trying to use the live-plugin-manager to allow users use different json-resume themes without needing to bundle them with my app. The themes are basically nodejs packages exposing a render method.

My code looks like this:

export const getLocalTheme = async (theme: IThemeEntry) => {
    try {
       await pluginManager.install(theme.name);
       const themePkg = await pluginManager.require(theme.name); // the NPM package name
        return themePkg;
    } catch (err) {
        console.log('Something went wrong', err)
    }
};

Calling getLocalTheme end in the catch block just after await pluginManager.require(theme.name) I get:

Error: Cannot find module 'fs'
    at Function.webpackEmptyContext [as resolve] (/Users/kmacha/Dev/kiss-my-resume/.webpack/main/index.js:23417:10)
    at PluginVm.isCoreModule (/Users/kmacha/Dev/kiss-my-resume/.webpack/main/index.js:24688:118)
    at PluginVm.sandboxResolve (/Users/kmacha/Dev/kiss-my-resume/.webpack/main/index.js:24645:18)
    at PluginVm.sandboxRequire (/Users/kmacha/Dev/kiss-my-resume/.webpack/main/index.js:24652:31)
    at Object.assign.resolve (/Users/kmacha/Dev/kiss-my-resume/.webpack/main/index.js:24596:25)
    at /Users/kmacha/Library/Application Support/kiss-my-resume/themes/jsonresume-theme-material/index.js:2:10
    at /Users/kmacha/Library/Application Support/kiss-my-resume/themes/jsonresume-theme-material/index.js:277:2
    at Script.runInContext (vm.js:127:20)
    at PluginVm.vmRunScriptInSandbox (/Users/kmacha/Dev/kiss-my-resume/.webpack/main/index.js:24554:16)
    at PluginVm.load (/Users/kmacha/Dev/kiss-my-resume/.webpack/main/index.js:24479:22) {
  code: 'MODULE_NOT_FOUND'
}

Needles to say I am in the electron environment and I build my app with the help of electron-forge. Here is the complete output, when I started my app with the DEBUG=* flag:

davideicardi commented 3 years ago

Yes, I think that it is related to electron or webpack environments, maybe similar to #13 .

Can you try to provide fs module as a staticDependencies. You can create LivePluginManager with a code like:

const pluginManager = new PluginManager({
    staticDependencies: {
        'fs': require('fs')
    }
});

Also it is possible to access/debug the host application, where live plugin manager is used. Or a similar environment where I can reproduce the problem.

thanks

karlitos commented 3 years ago

Dear David, many thanks that solved that issue. 👍 This is great news, because your wonderful project will be a very important part of one of my OSS projects.

karlitos commented 3 years ago

So, I pushed an updated to the electron-app branch of my project. With

const pluginManager = new PluginManager({
            pluginsPath: localThemesPath,
            staticDependencies: {
                fs: require('fs'),
                path: require('path'),
            }
        });

I was able to fetch some of the json-resume-themes and used their render method.

When looking in the directory, where I cache the installed packages, there were no packages fs or path. But then later I got Error: Cannot find module lodash and Error: Cannot find module mustache, even though those packages were present in the cache directory. And since my own app does not depend on mustache, adding it to the staticDependencies breaks the build.

You can check out the electron-app branch and try to start the electron app to investigate the problem. Just select for example the jsonresume-theme-moon and then click on process resume, which will install and require the theme and try to create a HTML markup.

davideicardi commented 3 years ago

lodash and mustache are dependencies of jsonresume-theme-moon? Looking here https://raw.githubusercontent.com/adamjmoon/jsonresume-theme-moon/master/package.json they are marked as devDependencies but live-plugin-manager doesn't install development dependencies, so maybe they are not installed. Can you try to put it in dependencies instead? Also put every other required modules in dependencies...

karlitos commented 3 years ago

Hi, you are absolutely right. I think the author of this particular theme did a mistake putting those packages in a devDependencies. I would like to offer the users to use as many of those themes as possible, on the other hand I can't and don't want manage some 250+ 3rd party packages - I guess I will be going to try all the themes one-by-one and blacklist those, with dependency issues I can't fix on my side.

Thank you thought for helping me and explaining how to use the static dependencies with live-plugin-manager - we might close this issue at this moment. Once again - great work you did here, saving me the necessity of bundling 25MB of NPM with my app.

davideicardi commented 3 years ago

Thanks @karlitos ! I'm closing the issue for now. Probably I need to investigate better why in some circustances (electron?, webpack?) some dependencies are not available (like fs and path) but I will probably create a dedicated issue.

NateAGeek commented 3 years ago

I know this issue is closed. However, I can confirm I had the same issue with my webpacked package. I do wonder if it is a webpack issue or maybe a vm issue.

NateAGeek commented 3 years ago

Also, I think it might be useful to maybe put some of this info into the Readme since it was a head scratcher for me until I was luckily able to find this thread. Thank you so much for the awesome project!

davideicardi commented 3 years ago

@NateAGeek Are you running inside electron? See #13 Can you describe your environment and version?