קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
קודקודייל
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
  • קודקודייל
  • מי אתם קודקודייל?
  • קורסים בחינם
  • צרו קשר
  • בניית אתרים
    • וורדפרס
  • נגישות אתרים
  • כל הקטגוריות
    • אנגולר
    • HTML
    • CSS
    • Javascript
    • Typescript
    • NodeJs
    • בלוקציין
ראשי ♦ אנגולר ♦ Angular Microfrontend Module Federation Tutorial – Part 2

Angular Microfrontend Module Federation Tutorial – Part 2

עידן יצחקי 10 ביוני 2022 אין תגובות

בחלק הראשון ראינו איך להתקין ובחלק הזה נראה איך לבצע משיכה של מודול לתוך הפרויקט הראשי (SHELL)

נתחיל עם MFE1

בתוך ספרית APP ניצור ספריה PAGES ובתוכה נריץ את הפקודה הבאה:

ng g m main

הפקודה הזו תיצור ספריה נוספת בשם MAIN ובתוכה מודול באותו השם.

נכנס לספריה ונריץ את הפקודות הבאות:

ng g c lazy-header
ng g c lazy-content
ng g c lazy-footer

שימו לב ששלושת הרכיבים נרשמים במודול main.

נעבור לקובץ HTML של הרכיב lazy-content ונשנה אותו שיראה כך:

<app-lazy-header></app-lazy-header>
<p>lazy-content works!</p>
<app-lazy-footer></app-lazy-footer>

כל מה שהוספנו זה את רכיב lazy-header ו-lazy-footer.

בספרית main ניצור קובץ נוסף שיבצע ראוטינג לרכיב lazy-content והוא יראה כך:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { LazyContentComponent } from './lazy-content/lazy-content.component';

const routes: Routes = [
  { path: '', component: LazyContentComponent }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class MainRoutingModule { }

נעדכן את main.module

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { LazyHeaderComponent } from './lazy-header/lazy-header.component';
import { LazyContentComponent } from './lazy-content/lazy-content.component';
import { LazyFooterComponent } from './lazy-footer/lazy-footer.component';
import { MainRoutingModule } from './main-routing.module';



@NgModule({
  declarations: [
    LazyHeaderComponent,
    LazyContentComponent,
    LazyFooterComponent
  ],
  imports: [
    CommonModule,
    MainRoutingModule
  ]
})
export class MainModule { }

ולבסוף נעדכן גם את הראוט הראשי

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  {
    path: 'lazy', loadChildren: () => import('./pages/main/main.module').then(m => {
      return m.MainModule;
    })
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

אחרי ששמרנו את כל הקבצים נריץ את הפרויקט (אם הוא לא רץ כבר) – ng s.

נגלוש ב-URL לכתובת הזו : localhost:3000/lazy ונראה שאכן הגיעו שלושת הרכיבים שלנו.

lazy-header works!

lazy-content works!

lazy-footer works!

כל מה שנשאר לנו זה לחשוף את המודול שלנו:

const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
const mf = require("@angular-architects/module-federation/webpack");
const path = require("path");
const share = mf.share;

const sharedMappings = new mf.SharedMappings();
sharedMappings.register(
  path.join(__dirname, 'tsconfig.json'),
  [/* mapped paths to share */]);

module.exports = {
  output: {
    uniqueName: "mfe1",
    publicPath: "auto"
  },
  optimization: {
    runtimeChunk: false
  },
  resolve: {
    alias: {
      ...sharedMappings.getAliases(),
    }
  },
  experiments: {
    outputModule: true
  },
  plugins: [
    new ModuleFederationPlugin({
      library: { type: "module" },

      // For remotes (please adjust)
      name: "mfe1",
      filename: "mfe1.js",
      exposes: {
        './MainModule':path.resolve(__dirname, 'src/app/pages/main/main.module.ts')
      },



      shared: share({
        "@angular/core": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
        "@angular/common": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
        "@angular/common/http": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
        "@angular/router": { singleton: true, strictVersion: true, requiredVersion: 'auto' },

        ...sharedMappings.getDescriptors()
      })

    }),
    sharedMappings.getPlugin()
  ],
};

חשוב מאוד!! כל שינוי שאתם עושים בקובץ הנ"ל יש לעצור את השרת (CTRL+C) ולהפעיל מחדש (ng s).

סיימנו בצד של MFE1 ועכשיו נטפל ב-SHELL

SHELL

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './pages/home/home.component';

const routes: Routes = [
  {
    path: 'lazy', loadChildren: () => import('mfe1/MainModule').then(m => {
      return m.MainModule;
    })
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

שימו לב שכאשר ננסה לצרוך את mfe1/MainModule תעלה לנו שגיאה ש-TS לא מכיר את המודול הזה, ולכן כדי להגיד ל-TS שיש דבר כזה ניצור קובץ בתוך ספרית APP בשם MFE.d.ts .

זה קובץ הצהרה שהתפקיד שלו בסה"כ להרגיע את ה-TS 😉.

declare module 'mfe1/MainModule';

הדבר האחרון שנשאר לנו לעדכן הוא בפרויקט SHELL את הקובץ הבא:

const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
const mf = require("@angular-architects/module-federation/webpack");
const path = require("path");
const share = mf.share;

const sharedMappings = new mf.SharedMappings();
sharedMappings.register(
  path.join(__dirname, 'tsconfig.json'),
  [/* mapped paths to share */]);

module.exports = {
  output: {
    uniqueName: "shell",
    publicPath: "auto"
  },
  optimization: {
    runtimeChunk: false
  },
  resolve: {
    alias: {
      ...sharedMappings.getAliases(),
    }
  },
  experiments: {
    outputModule: true
  },
  plugins: [
    new ModuleFederationPlugin({
      library: { type: "module" },

      // For hosts (please adjust)
      remotes: {
          "mfe1": "http://localhost:3000/mfe1.js",

      },

      shared: share({
        "@angular/core": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
        "@angular/common": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
        "@angular/common/http": { singleton: true, strictVersion: true, requiredVersion: 'auto' },
        "@angular/router": { singleton: true, strictVersion: true, requiredVersion: 'auto' },

        ...sharedMappings.getDescriptors()
      })

    }),
    sharedMappings.getPlugin()
  ],
};

שורה 33: זו השורה שתמשוך את הסקריפט שחושף את הרכיבים ב-MFE1.

לא לשכוח לעצור את הקומפיילר ולהפעיל אותו מחדש.

אם נגלוש ל: http://localhost:5000/lazy נקבל דף עם שלושת הרכיבים שלנו.

lazy-header works!

lazy-content works!

lazy-footer works!

רק שעכשיו אנחנו נמצאים בכלל ב-SHELL ולא ב-MFE1….. מדהים 🧙‍♂️.

בחלק הבא נראה איך לקחת רכיבים ב-MFE ולהכניס אותם לדף שנמצא ב-SHELL ללא ראוטינג 😁

פוסטים קשורים:

angular micro-frontendAngular Microfrontend Module Federation Tutorial – Part 1 אפשרויותAngular nested routes תמונת אווירה של מנוף בונה דףangular lazy loading modules routing תמונת אווירה של מנעול דיגיטליהגדרות אבטחה על ראוטינג של אנגולר (Guards)
angular אנגולר לימודי אנגולר מדריך אנגולר

אודות המחבר

עידן יצחקי להציג את כל הפוסטים של עידן יצחקי


« פוסט קודם
פוסט הבא »

השארת תגובה

ביטול

חיפוש באתר
בחירת העורכים
29 בדצמבר 2023 עידן יצחקי

שדה טקסט עשיר עם תמונות

אתם הולכים להיות מופתעים עד כמה HTML יכול להיות חכם ולבצע משהו כל כך מורכב, שאם אנחנו היינו רוצים ליצור

1 באוקטובר 2021 עידן יצחקי

איך למשוך דינמית favicon של אתרים אחרים ב-JS

בפוסט זה נראה איך אפשר על פי לינקים בדף למשוך את ה-favicon מהדומיין שלהם באופן דינמי, בדיקה של תקינות התמונה

פופולרי
Javascript functions – היכרות עם סוגי פונקציות
Javascript
21 בדצמבר 2024 אין תגובות
Nested routing in angular standalone component
Typescript
15 בנובמבר 2024 תגובה אחת
בחרו לפי תגיות
angular blockchain css ethers express front-end fullstack GQL html javascript next js nextjs nodejs react hooks reactjs solidity webgl אנגולר בלוקציין וורדפרס לימודי אנגולר לימודי וורדפרס לימוד ריאקט מדריך front-end מדריך GQL מדריך אנגולר מדריך וורדפרס מדריך חינם react מדריך ריאקט מפתח בלוק מפתח בלוקציין מתכנת front-end מתכנת בלוקציין מתכנת פרונט סולידיטי קורס front end קורס fullstack קורס nextjs קורס אנגולר קורס בלוקציין קורס בלוקציין בחינם קורס סולידיטי קורס ריאקט קורס תכנות קורס תכנות בחינם
סינון על פי קטגוריות
CSS fullstack HTML IIS Javascript nodeJs SEO Typescript אנגולר בלוקציין בניית אתרים וורדפרס חיפוש עבודה כלים נוספים כללי נגישות קורסים ריאקט תלת מימד תקלות ופתרונות
צור קשר
כל הזכויות שמורות לקודקודייל
ליצירת קשר: @ קודקודייל
גלילה לראש העמוד