Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add module federation support #11241

Closed
wants to merge 29 commits into from

Conversation

hasanayan
Copy link
Contributor

@hasanayan hasanayan commented Jul 23, 2021

I re-enabled @raix's code to enable module-federation and added the necessary changes to the webpack config. Tested the changes by making the same modifications using craco in apps that both run as standalone or remote apps and it works fine.

With this PR, to enable Module Federation, you'll need a file named .modulefederationrc.js which exports ModuleFederationPlugin parameters as json.

const deps = require("./package.json").dependencies;

module.exports = {
  name: "my_app",
  exposes: {
    "./App": "./src/App",
  },
  filename: "remoteEntry.js",
  shared: {
    ///...
  }
}

in addition to that, including a mmodule federation file and setting EXTERNAL_TEMPLATE_REMOTES env var to 'true' includes ExternalTemplateRemotesPlugin into the config.


(if you want to help out on that, then checkout this branch - when checking of the cra project run yarn then create a provider and consumer app using yarn create-react-app and read the MF docs using docusaurus/docs yarn start :)

raix and others added 26 commits May 28, 2021 09:32
* Revert "Revert "Update postcss packages" (facebook#10216)"

This reverts commit 3968923.

* Revert "Update postcss packages" (facebook#10216)

This reverts commit 580ed5d.

* Update postcss and loader

* Update fork-ts-checker-webpack-plugin@5.2.1

References:
* [hook rename](TypeStrong/fork-ts-checker-webpack-plugin#490)
* [include/exclude](TypeStrong/fork-ts-checker-webpack-plugin#450) and [issue options](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin#issues-options)
* [release notes 5.0.0](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/releases/tag/v5.0.0)

* Update fork-ts-checker-webpack-plugin 6.0.5

* Add css-minimizer-webpack-plugin@1.1.5 remove

Add css-minimizer-webpack-plugin@1.1.5
Remove optimize-css-assets-webpack-plugin and postcss-safe-parser

References:
* https://webpack.js.org/plugins/css-minimizer-webpack-plugin/

* Add support for Webpack 5 message objects

* Update WebpackManifestPlugin to v3.0.0

* Support both "SingleEntryPlugin" and "EntryPlugin"

* Support Webpack 5 IgnorePlugin signature

Reference:
* https://webpack.js.org/plugins/ignore-plugin/#example-of-ignoring-moment-locales
* facebook#10006

* Update webpack and dev server

* Enable persistent cache

* Fix react-error-overlay webpack

* Fix dev server config

* Remove support for SingleEntryPlugin

* update workbox-webpack-plugin

* Fix post css config

* Comment out WebpackManifestPlugin for now having issues with undefined path

* Add fast refresh entries to ModuleScopePlugin

* Format files

* Remove unused variables in start command

* git ignore tsconfig.tsbuildinfo
supporting incremental typescript builds

* simplify output path

review feedback from @kumarlachhani

* Use asset modules in react-scripts

* Use asset modules in react-error-overlay

* eslint-config-react-app typo fix (facebook#10317)

This just fixes a shell snippet in the readme file for this plugin

* Fix link address (facebook#10907)

Replace the Github home link with a link to the repo's main page or a link to the source (https://github.com/CodeByZach/pace/blob/master/pace.js)

* Bump immer version for fixing security issue (facebook#10791)

Bump immer minor version to fix `Prototype Pollution` Security issue.

* test(create-react-app): add integration tests (facebook#10381)

* Revert "Use asset modules in react-error-overlay"

This reverts commit 952f896.

* Disable broken tests for now

* Revert source-map bump in react-error-overlay

* JSON is using default export

* Webpack config: Remove invalid parser configuration

* Fix issue with ModuleScope and babel runtime

* Fix svgr configuration

* Webpack config svg use file-loader instead of url-loader

* Update postcss-normalize

* Fix asset output name

* Update test matrix using node 12+14

postcss normalize only support node >=12

* Fix file output extension

* Align assetModuleFilename

* pipeline update configuration names

* Add back webpack-manifest-plugin

* Fix kitchen sink get actual href value

.href is prefixed with http://localhost etc.

* Update kitchen sink test to webpack 5 asset modules

* Let webpack handle global this

* Fix eject copy config/webpack/persistentCache folder

* Move tsbuildinfo into cache folder

* Update dependencies

* Update webpack-dev-server to beta.3

* Compilation.modules changed to type Set

reference: comment by @slorber facebook#9994 (comment)

* Format JsonInclusion.js using prettier

* Run prettier on webpack dev server config

* Enable e2e behavior tests using node 12+14

* Comment out e2e behavior tests for now

* Add experimental support for module federation

* Fix missing wds socket path update

accordingly to review by @xiaokekeT

* Revert "Add experimental support for module federation"

This reverts commit 8fdc63b.

Co-authored-by: Ian Schmitz <ianschmitz@gmail.com>
Co-authored-by: jasonwilliams <jase.williams@gmail.com>
Co-authored-by: Joseph Atkins-Turkish <spacerat3004@gmail.com>
Co-authored-by: e-w-h <46170930+e-w-h@users.noreply.github.com>
Co-authored-by: Shamprasad RH <shamprasad.rh@mail.weir>
Co-authored-by: James George <jamesgeorge998001@gmail.com>
prevent yarn warnings
…ized

Would be great with wildcard support in ModuleScopePlugin
Warning: Ubuntu 16.04 LTS environment is deprecated and will be removed on September 20, 2021. Migrate to ubuntu-latest instead. For more details, see actions/runner-images#3287
this should be the default already in webpack 5 - to enable require ensure use https://webpack.js.org/plugins/internal-plugins/#requireensureplugin
On v4.14.1 linux tests failed: Node Sass does not yet support your current environment: Linux 64-bit with Unsupported runtime
This is a breaking change in the webpack 5 update
@hasanayan
Copy link
Contributor Author

@raix I recreated the module federation PR but some of the checks are still missing. It seems build and lint pipelines work only on push, and integration tests work when the target branch of the PR is main. So everything seems fine here.

@hasanayan
Copy link
Contributor Author

@raix are you happy with the current state of the PR? is there anytrhing else I should do?

@raix
Copy link
Contributor

raix commented Jul 27, 2021

@hasanayan overall looks good, Thanks for picking up this task 👍

Ive asked the maintainer group if there were any objections for getting this in - so waiting for responses.

Only notes/thoughts I have is that I need to test/qa a bit, not sure if the template plug-in is needed for the initial pr (eg. We could also add the plugin for auto sharing of dependencies etc. Ideally with some sane defaults/without the need for configuration - but could go in later)

@hasanayan
Copy link
Contributor Author

@raix you are welcome. Thanks for working hard on wp5 support and opening way for this.

it's an opt-in feature, however, If you decide that the template plugin should go, just let me know. Also, if you need any clarification (possibly on publicPath values I set) I'll be happy to help.

@raix
Copy link
Contributor

raix commented Jul 29, 2021

@hasanayan for now the maintainer group decided to prioritize wp5 update as the 5.0 version, it's a large change to triage issues - module federation would go into a next minor release as it's not breaking anything eg. 5.1
(So positive response)

@raix raix added this to the 5.1 milestone Jul 30, 2021
@raix raix linked an issue Jul 30, 2021 that may be closed by this pull request
This was referenced Jul 30, 2021
@shuttleriiiz
Copy link

I'm having the same issue with #9510 (comment).

yarn start stuck at "Starting the development server" when I expose a module, it works fine if I don't expose anything.

Interestingly, I don't have an issue if I turn off FAST_REFRESH

@hasanayan
Copy link
Contributor Author

@shuttleriiiz it’s actually supposed to work even with fast refresh and we are using an almost identical config in development/production. I will look into it in the morning.

@shuttleriiiz
Copy link

@hasanayan I did some digging and found that there is a bug on react-refresh-webpack-plugin when using module federation. Apparently, they have fixed the bug on version 0.5.0-rc.1. Your PR works after I updated the plugin.

see: https://github.com/pmmmwh/react-refresh-webpack-plugin/pull/434/files

@hasanayan
Copy link
Contributor Author

thanks @shuttleriiiz , I opened another PR to fix react-refresh-webpack-plugin version: #11316

@hasanayan hasanayan changed the base branch from wp5 to main August 19, 2021 14:24
@hasanayan
Copy link
Contributor Author

hasanayan commented Aug 19, 2021

trying to sync with main branch messed this PR. I'll recreate this this evening

@raix
Copy link
Contributor

raix commented Aug 20, 2021

@hasanayan not sure if you could do git revert c7c916e2b29ed1e953e2a26d472023020fce1d20 to add back the initial work or if that's only on my repo (eg. the documentaion md is missing from this pr. but was in the initial work)

@shuttleriiiz
Copy link

@hasanayan what's the current status of this PR?

@bmuenzenmeyer
Copy link
Contributor

bmuenzenmeyer commented Dec 3, 2021

@hasanayan in testing this, I am seeing webpack errors when trying to process a CSS package that contains a url(...) reference to a relative file in node_modules.

Failed to compile.

HookWebpackError: Invalid URL
-- inner error --
TypeError [ERR_INVALID_URL]: Invalid URL

For example:

App.js

import `typeface-roboto`

typeface-roboto/index.css

/* roboto-100normal - latin */
@font-face {
  font-family: 'Roboto';
  font-style: normal;
  font-display: swap;
  font-weight: 100;
  src:
    local('Roboto Thin '),
    local('Roboto-Thin'),
    url('./files/roboto-latin-100.woff2') format('woff2'), /* Super Modern Browsers */
    url('./files/roboto-latin-100.woff') format('woff'); /* Modern Browsers */
}
...

This seems related to https://github.com/facebook/create-react-app/pull/11241/files#diff-8e25c4f6f592c1fcfc38f0d43d62cbd68399f44f494c1b60f0cf9ccd7344d697R327-R331

Commenting out that block seems to retain all intended and existing functionality, but I'd love more eyes or context - I don't dive into webpack too often.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Webpack 5 support (module federation)
7 participants