diff --git a/libs/mf-tools/src/lib/web-components/bootstrap-utils.ts b/libs/mf-tools/src/lib/web-components/bootstrap-utils.ts index 5f13f4e0..23b31725 100644 --- a/libs/mf-tools/src/lib/web-components/bootstrap-utils.ts +++ b/libs/mf-tools/src/lib/web-components/bootstrap-utils.ts @@ -45,6 +45,11 @@ export type Options = { * Default value true. */ activeLegacyMode?: boolean; + /** + * Use platformRef.instance.ngZone to run router events + * Default value false. + */ + useInstanceNgZone?: boolean; }; declare interface BootstrapOptions { @@ -193,7 +198,10 @@ export function bootstrap( if (options.appType === 'shell') { shareShellZone(ref.injector); } else if (options.appType === 'microfrontend') { - connectMicroFrontendRouter(ref.injector); + connectMicroFrontendRouter( + ref.injector, + options?.useInstanceNgZone ? ref.instance?.ngZone : undefined + ); } return ref; @@ -209,7 +217,7 @@ function shareShellZone(injector: Injector) { shareNgZone(ngZone); } -function connectMicroFrontendRouter(injector: Injector) { +function connectMicroFrontendRouter(injector: Injector, ngZone: NgZone = undefined) { const router = injector.get(Router); const useHash = location.href.includes('#'); @@ -218,5 +226,5 @@ function connectMicroFrontendRouter(injector: Injector) { return; } - connectRouter(router, useHash); + connectRouter(router, useHash, ngZone); } diff --git a/libs/mf-tools/src/lib/web-components/router-utils.ts b/libs/mf-tools/src/lib/web-components/router-utils.ts index 2fea414d..616be474 100644 --- a/libs/mf-tools/src/lib/web-components/router-utils.ts +++ b/libs/mf-tools/src/lib/web-components/router-utils.ts @@ -1,4 +1,5 @@ import { Router, UrlMatcher, UrlSegment } from '@angular/router'; +import { NgZone } from '@angular/core'; export function startsWith(prefix: string): UrlMatcher { return (url: UrlSegment[]) => { @@ -20,19 +21,23 @@ export function endsWith(prefix: string): UrlMatcher { }; } -export function connectRouter(router: Router, useHash = false): void { +function navigateWithNgZone(router: Router, ngZone: NgZone, url: string) { + ngZone.run(() => router.navigateByUrl(url)); +} + +export function connectRouter(router: Router, useHash = false, ngZone = undefined): void { let url: string; if (!useHash) { url = `${location.pathname.substring(1)}${location.search}`; - router.navigateByUrl(url); + !!ngZone ? navigateWithNgZone(router, ngZone, url) : router.navigateByUrl(url); window.addEventListener('popstate', () => { - router.navigateByUrl(url); + !!ngZone ? navigateWithNgZone(router, ngZone, url) : router.navigateByUrl(url); }); } else { url = `${location.hash.substring(1)}${location.search}`; - router.navigateByUrl(url); + !!ngZone ? navigateWithNgZone(router, ngZone, url) : router.navigateByUrl(url); window.addEventListener('hashchange', () => { - router.navigateByUrl(url); + !!ngZone ? navigateWithNgZone(router, ngZone, url) : router.navigateByUrl(url); }); } } diff --git a/libs/mf/src/builders/build/builder.ts b/libs/mf/src/builders/build/builder.ts index eeed5200..5b0a69f6 100644 --- a/libs/mf/src/builders/build/builder.ts +++ b/libs/mf/src/builders/build/builder.ts @@ -18,4 +18,4 @@ export function runBuilder( ); } -export default createBuilder(runBuilder); +export default createBuilder(runBuilder) as any; diff --git a/libs/mf/src/schematics/mf/schematic.ts b/libs/mf/src/schematics/mf/schematic.ts index 76042723..5713aed2 100644 --- a/libs/mf/src/schematics/mf/schematic.ts +++ b/libs/mf/src/schematics/mf/schematic.ts @@ -26,7 +26,6 @@ import { getPackageJsonDependency, NodeDependencyType, } from '@schematics/angular/utility/dependencies'; -import { serve } from 'esbuild'; export function add(options: MfSchematicSchema): Rule { return config(options); diff --git a/package-lock.json b/package-lock.json index b596f721..774baa5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7060,7 +7060,7 @@ }, "node_modules/@types/eslint": { "version": "8.4.10", - "resolved": "http://localhost:4873/@types%2feslint/-/eslint-8.4.10.tgz", + "resolved": "https://registry.npmjs.org/@types%2feslint/-/eslint-8.4.10.tgz", "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", "dev": true, "license": "MIT", @@ -11876,7 +11876,7 @@ }, "node_modules/cypress/node_modules/@types/node": { "version": "12.12.50", - "resolved": "http://localhost:4873/@types%2fnode/-/node-12.12.50.tgz", + "resolved": "https://registry.npmjs.org/@types%2fnode/-/node-12.12.50.tgz", "integrity": "sha512-5ImO01Fb8YsEOYpV+aeyGYztcYcjGsBvN4D7G5r1ef2cuQOpymjWNQi5V0rKHE6PC2ru3HkoUr/Br2/8GUA84w==", "dev": true, "license": "MIT" @@ -30708,7 +30708,7 @@ }, "@types/eslint": { "version": "8.4.10", - "resolved": "http://localhost:4873/@types%2feslint/-/eslint-8.4.10.tgz", + "resolved": "https://registry.npmjs.org/@types%2feslint/-/eslint-8.4.10.tgz", "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", "dev": true, "requires": { @@ -34224,7 +34224,7 @@ "dependencies": { "@types/node": { "version": "12.12.50", - "resolved": "http://localhost:4873/@types%2fnode/-/node-12.12.50.tgz", + "resolved": "https://registry.npmjs.org/@types%2fnode/-/node-12.12.50.tgz", "integrity": "sha512-5ImO01Fb8YsEOYpV+aeyGYztcYcjGsBvN4D7G5r1ef2cuQOpymjWNQi5V0rKHE6PC2ru3HkoUr/Br2/8GUA84w==", "dev": true }