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鈥檒l occasionally send you account related emails.
Already on GitHub? Sign in to your account
Can't retrieve exported components from 傻mod when using production mode #21952
Comments
Unfortunately for this situation, customized Webpack configurations and/or usage of Webpack specific features are not officially supported by the Angular CLI. Customization of the Webpack configuration is also only possible by using third-party builders which are not maintained nor directly supported by the Angular Team. Within the Angular CLI, Webpack is considered an internal implementation detail which may or may not be used to fully build the application in all modes, now or in the future. However, it may be useful to open an issue with the maintainers of either the https://github.com/just-jeb/angular-builders or https://github.com/manfredsteyer/ngx-build-plus projects as they may have more experience in this area. |
Thanks for the answer, I will open an issue with them. I'm aware that this is a specific case, but do you know if there any way to explicitly tell terser to not remove classes or is it totally related to Webpack? Because I know that Angular is using "build-optimizer" so that's why I tried to use |
I think what might work is to assign a static field on the const DECLARATIONS = [
Cmp1,
Cmp2
];
@NgModule({
declarations: DECLARATIONS,
})
export class MyModule {
static declarations: DECLARATIONS
} That said as @clydin mentioned customized Webpack configurations and/or using Webpack specific features are not officially supported by the Angular tooling team. |
One additional note regarding why this currently works in development but not production is that the JIT mode support code is removed in production. This support code adds metadata to the Angular module definitions at runtime which is allowing the reproduction to function. However, since JIT mode support code forces all unused components (including from libraries) to be retained and the application is AOT compiled, the JIT mode support code is removed in production. |
Ok I get it, I fixed it with a static field. |
This issue has been automatically locked due to inactivity. Read more about our automatic conversation locking policy. This action has been performed automatically by a bot. |
馃悶 Bug report
Command (mark with an
x
)Is this a regression?
This behavior also happens in Angular 11 (in production mode) and happens in Angular 12 because of default production mode.Description
Note: I already posted on stackoverflow, but got no answer. Since it is really blocking and I'm not sure if it is a bug, I'm opening a bug report here because it is linked to the AOT compilation.
I'm using Angular with Webpack 5 Module Federation for micro-frontends. I have 2 apps (let's call them app1 and app2) and my main app, app1, is federating components of app2.
In app2, my exposed components are exported by my main module, so when I try to federate some component, I can get it from the export section of my module. Everything works fine in dev mode, I can get my exposed module, retrieve my exported components and then use the component factory resolver to create it where I want in app1.
But when I build in production (I used ng serve --prod to reproduce the prod environment and test it) my exported components are gone but not the imports and providers. This is the module I get:
As you can see, in 傻mod, I have no exported components and no declarations and I expected to see my components here. I guess it is due to AOT compilation and the optimization since it is working in dev mode. Is AOT removing everything in 傻mod on purpose or it is because my components are tree-shaked since they are not directly used by my app2?
I tried to use sideEffects but it is not working. Is there another way to tell the compiler to not remove those components?
馃敩 Minimal Reproduction
I created a reproduction here.
Just use:
yarn install
yarn build:shared
yarn start:first-app
(it is the "host" app, and will start on http://localhost:4200)yarn start:second-app
(it is the "hosted" app, and will start on http://localhost:4201)If you go to http://localhost:4200 and click in the navbar on "second app" you will see that the sidebar added 3 links which are loaded from second-app.
Now if you do the same in production mode:
yarn start:first-app --prod
(it is the "host" app, and will start on http://localhost:4200)yarn start:second-app --prod
(it is the "hosted" app, and will start on http://localhost:4201)Open the devtools, if you go to http://localhost:4200 and click in the navbar on "second app" you will see the object and the error.
馃敟 Exception or Error
馃實 Your Environment
The text was updated successfully, but these errors were encountered: