npm (Node Package Manager). В проекте будет использоваться именно он, но вообще менеджер пакетов JavaScript не один: есть, например, yarn, pnpm и другие.package.json. В этом файле менеджер зависимостей хранит информацию о сторонних пакетах (библиотеках), которые используются вашим приложением. Обычно в репозиторий кода включается только этот файл, а пакеты загружаются после скачивания кода на свой компьютер.package.json, и выполните команду npm install. Эта операция загрузит пакеты из репозитория пакетов npm, но может занять какое-то время. После того как команда выполнится, у вас появится дополнительная папка node_modules — она будет содержать все скачанные пакеты.npm run start — это запустит приложение. В браузере должна автоматически открыться страница http://localhost:3000/. src.npx create-mf-app.npx create-mf-app для микрофронтендов users и tasks, но укажите соответствующие имена приложений и другие порты. Дальше в тексте урока мы будем считать, что для users указан порт 8081, а для tasks — порт 8082.
Вы можете перейти в папки приложений и выполнить там команды npm install и nmp start, чтобы убедиться, что приложения создались корректно и работают.
export default function UsersTestControl() {
return <div>Это тестовый компонент из проекта Users</div>
}
exposes, чтобы он выглядел следующим образом: exposes: {
'./UsersTestControl': './src/components/UsersTestControl.js',
}, UsersTestControl из микрофронтенда users. Левая часть определяет, под каким именем данный компонент будет доступен приложению hosts. Правая часть указывает компилятору webpack, где находится код вашего компонента в проекте users.remotes, чтобы он выглядел следующим образом:remotes: {
'users': 'users@http://localhost:8081/remoteEntry.js',
}, users, используйте в коде это имя.import React from "react"; на import React, { lazy } from "react";. Этот код загрузит компонент lazy, который будет использоваться для отложенной загрузки модуля.import добавьте следующий код:
const UsersTestControl = lazy(() => import('users/UsersTestControl').catch(() => {
return { default: () => <div className='error'>Component is not available!</div> };
})
); UsersTestControl из микрофронтенда users. Если микрофронтенд users не запущен, этот код вернёт заглушку с текстом “Component is not available”.App следующим образом:const App = () => (
<div className="container">
<UsersTestControl></UsersTestControl>
</div>
); UsersTestControl и выведет его на экран../src/components/TasksTestControl.js и добавьте в него одноимённую функцию. А в секцию exposes в проекте tasks добавьте информацию о файле.webpack.config.js проекта host рядом с кодом, относящимся к users.remotes: {
'users': 'users@http://localhost:8081/remoteEntry.js',
'tasks': 'tasks@http://localhost:8082/remoteEntry.js',
}, const TasksTestControl = lazy(() => import('tasks/TasksTestControl').catch(() => {
return { default: () => <div className='error'>Component is not available!</div> };
})
); UsersTestControl.const App = () => (
<div className="container">
<UsersTestControl></UsersTestControl>
<TasksTestControl></TasksTestControl>
</div>
); class Api {
constructor({ address }) {
// стандартная реализация — объект options
this._address = address;
}
}
const api = new Api({
//address: 'http://localhost:3001',
address: 'https://nomoreparties.co',
});
export default api;
this.initialize(); из исходного кода здесь исключён, потому что не является общим кодом: он специфичен для сервиса tasks.login и getProfile. Они специфичные для работы с пользователями.this.initialize();.export function. Замените его на export default function. Это нужно для того, чтобы импорт к host корректно загрузил компоненты.
Для компонента Welcome должно получиться так:
export default function Welcome({ jwt }) {
Аналогично и для других компонентов.
'./UsersTestControl': './src/components/UsersTestControl.js', добавьте экспорт контролов UserLogin и Welcome. exposes: {
'./UsersTestControl': './src/components/UsersTestControl.js',
'./UserLogin': './src/components/UserLogin.js',
'./Welcome': './src/components/Welcome.js',
},
exposes: {
'./TasksTestControl': './src/components/TasksTestControl.js',
'./TaskList': './src/components/TaskList.js',
},
import { useState } from 'react';
import './UserLogin.css';
import api from '../utils/api'
export default function UserLogin() { // Убрали onLogin из параметров
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
// Добавили onLogin в UserLogin и отправляем полученный jwt с помощью события
function onLogin(name, password) {
dispatchEvent(new CustomEvent("jwt-change", {
detail: api.login(name, password)
}) );
}
return (
import React from "react"; на import React, { lazy, Suspense, useState, useEffect } from "react";. Это позволит использовать необходимые компоненты React. const App = () => {
const [jwt, setJwt] = useState('');
const handleJwtChange = event => { // Эта функция получает нотификации о событиях изменения jwt
setJwt(event.detail)
}
useEffect(() => {
addEventListener("jwt-change", handleJwtChange); // Этот код добавляет подписку на нотификации о событиях изменения localStorage
return () => removeEventListener("jwt-change", handleJwtChange) // Этот код удаляет подписку на нотификации о событиях изменения localStorage, когда в ней пропадает необходимость
}, []);
return <div className="container">
<header className='App-header'>
Лабораторная работа по микрофронтендам
</header>
<section className='App-content'>
{jwt ? (
<>
<Suspense>
<Welcome jwt={jwt} />
</Suspense>
<Suspense>
<TaskList jwt={jwt} />
</Suspense>
</>
) : (
<Suspense>
<UserLogin/>
</Suspense>
)}
</section>
</div>
};
UsersTestControl и TasksTestControl и замените его на код импорта компонентов TaskList, UserLogin и Welcome.