Fix require monkey-patching in electron build

Summary:
In D39311893 (094c5bdfdd) we started monkey-patching `require` to resolve global dependencies in the plugins. Apparently, patching `globalThis.require` did not work in the electron env. On my local machine it kept working because I had the experimental `flipper-server` feature enabled which embeds flipper-server into the electron build. In flipper-server we properly patch `require` via `Module.prototype.require` which affected the global require in electron.
With this fix we now properly patch require in electron via Module.prototype.require all the time

Changelog: Fix plugin loading with experimental flipper-server disabled

Reviewed By: nikoant

Differential Revision: D39633821

fbshipit-source-id: 9554f643c625620d116075ae87f573d8447850f6
This commit is contained in:
Andrey Goncharov
2022-09-20 01:36:56 -07:00
committed by Facebook GitHub Bot
parent d600203627
commit 8716761cb3
6 changed files with 32 additions and 21 deletions

View File

@@ -12,10 +12,10 @@ import {
InstalledPluginDetails,
Logger,
MarketplacePluginDetails,
wrapRequire,
} from 'flipper-common';
import {PluginDefinition} from '../plugin';
import React from 'react';
import * as ReactJsxRuntime from 'react/jsx-runtime';
import ReactDOM from 'react-dom';
import ReactDOMClient from 'react-dom/client';
import ReactIs from 'react-is';
@@ -101,10 +101,6 @@ class UIPluginInitializer extends AbstractPluginInitializer {
}
}
declare module globalThis {
let require: any;
}
let uiPluginInitializer: UIPluginInitializer;
export default async (store: Store, _logger: Logger) => {
setGlobalObject({
@@ -118,21 +114,8 @@ export default async (store: Store, _logger: Logger) => {
antd,
emotion_styled,
antdesign_icons,
ReactJsxRuntime,
});
// Whenever we bundle plugins, we assume that they are going to share some modules - React, React-DOM, ant design and etc.
// It allows us to decrease the bundle size and not to create separate React roots for every plugin
// To tell a plugin that a module is going to be provided externally, we add the module to the list of externals (see https://esbuild.github.io/api/#external).
// As a result, esbuild does not bundle hte contents of the module. Instead, it wraps the module name with `require(...)`.
// `require` does not exist ion the browser environment, so we substitute it here to feed the plugin our global module.
globalThis.require = wrapRequire(
// globalThis.require might exist in the electron build
globalThis.require ??
((module: string) => {
throw new Error(
`Dynamic require is not supported in browser envs. Tried to require: ${module}`,
);
}),
);
uiPluginInitializer = new UIPluginInitializer(store);
await uiPluginInitializer.init();