Skip to content

Commit

Permalink
feat: support for shared eager dependencies #5 (#13)
Browse files Browse the repository at this point in the history
* feat: support for shared eager dependencies #5

* feat: support for shared eager dependencies #5

* feat: support for shared eager dependencies #5

* fix: it works but umnnn
  • Loading branch information
MadaraUchiha-314 authored Nov 8, 2023
1 parent 91d9c3f commit dbe9094
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 9 deletions.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion packages/examples/project-a/federation.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ export const federationconfig = {
'./index': './src/index.js',
},
shared: {
react: {},
react: {
eager: true,
},
'react-dom': {},
uuid: {},
redux: {},
Expand Down
44 changes: 37 additions & 7 deletions packages/rollup-plugin-module-federation/src/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { readFileSync } from 'node:fs';
import { resolve, dirname, sep } from 'node:path';
import { resolve, dirname, sep, parse } from 'node:path';
import { fileURLToPath } from 'node:url';
import { EOL } from 'node:os';

Expand Down Expand Up @@ -39,6 +39,7 @@ const FEDERATED_IMPORT_EXPR = '__federatedImport__';
const FEDERATED_IMPORT_MODULE_ID = '__federatedImport__';
const FEDERATED_IMPORT_FILE_NAME = `${FEDERATED_IMPORT_MODULE_ID}.js`;
const FEDERATED_IMPORT_NAME = 'federatedImport';
const FEDERATED_EAGER_SHARED = '__federated__shared__eager__';

const MODULE_VERSION_UNSPECIFIED = '0.0.0';

Expand Down Expand Up @@ -150,6 +151,8 @@ export default function federation(federationConfig) {
name, filename, exposes, shared,
} = federationConfig;

const remoteEntryFileName = filename ?? REMOTE_ENTRY_FILE_NAME;

const projectRoot = resolve();
const pkgJson = JSON.parse(
readFileSync(`${projectRoot}${sep}${PACKAGE_JSON}`, 'utf-8'),
Expand Down Expand Up @@ -332,7 +335,7 @@ export default function federation(federationConfig) {
type: 'chunk',
id: REMOTE_ENTRY_MODULE_ID,
name: name ?? REMOTE_ENTRY_NAME,
fileName: filename ?? REMOTE_ENTRY_FILE_NAME,
fileName: remoteEntryFileName,
importer: null,
});
},
Expand Down Expand Up @@ -365,6 +368,16 @@ export default function federation(federationConfig) {
* Import from the virtual module FEDERATED_IMPORT_MODULE_ID
*/
import { setSharedScope } from '${FEDERATED_IMPORT_MODULE_ID}';
${Object.entries(shared)
.filter(([, sharedModule]) => sharedModule?.eager ?? false)
.map(([key, sharedModule]) => {
const importedModule = sharedModule.import ?? key;
/**
* For shared modules that are eager we use: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import#module_namespace_object
*/
return `import * as ${FEDERATED_EAGER_SHARED}${importedModule} from '${importedModule}';`;
})
.join('')}
function register(sharedScope, moduleNameOrPath, version, fallback) {
if (!Object.prototype.hasOwnProperty.call(sharedScope, moduleNameOrPath)) {
sharedScope[moduleNameOrPath] = {};
Expand All @@ -384,13 +397,21 @@ export default function federation(federationConfig) {
const { shareKey } = sharedModule;
const importedModule = sharedModule.import ?? key;
const versionForSharedModule = getVersionForModule(importedModule);
return importedModule
? `
register(sharedScope, '${
if (importedModule) {
if (sharedModule?.eager) {
return `
register(sharedScope, '${
shareKey ?? key
}', '${versionForSharedModule}', () => Promise.resolve(${FEDERATED_EAGER_SHARED}${importedModule}).then((module) => () => module))
`;
}
return `
register(sharedScope, '${
shareKey ?? key
}', '${versionForSharedModule}', () => import('${importedModule}').then((module) => () => module))
`
: '';
`;
}
return '';
})
.join('')}
};
Expand Down Expand Up @@ -524,6 +545,15 @@ export default function federation(federationConfig) {
resolvedModulePath,
)
) {
/**
* Eager shared dependencies need to be bundled along with the remote entry.
* Currently we return null and let rollup figure out the best chunking strategy.
* NOTE: Providing the chunk name the same as the remote entry name doesn't work as it ends up creating multiple chunks.
* TODO: Raise this bug with rollup.
*/
if (sharedOrExposedModuleInfo[resolvedModulePath].versionInfo.eager) {
return null;
}
return getChunkNameForModule(
sharedOrExposedModuleInfo[resolvedModulePath],
);
Expand Down

0 comments on commit dbe9094

Please sign in to comment.