single-spa: laluan tanpa microfrontend tambahan

Patricia Arquette
Lepaskan: 2024-09-27 18:36:03
asal
411 orang telah melayarinya

single-spa:  route without an additional microfrontend

Dalam artikel ini, kami akan meneroka cara untuk memudahkan seni bina microfrontend spa tunggal anda dengan mengalih keluar microfrontend halaman ralat khusus

Mempunyai projek berdasarkan seni bina microfrontends mempunyai faedahnya, tetapi juga beberapa cabaran.

Salah satu cabaran ialah pertumbuhan bilangan mikrofrontend yang tidak dapat dielakkan. Pertumbuhan ini bermakna bahawa akan ada lebih banyak mikrofrontend untuk dikekalkan, dikemas kini dan dikeluarkan. Mengurangkan bilangan microfrontends memastikan pengalaman pembangunan yang lebih lancar.

Untuk mengurangkan bilangan microfrontend, kami boleh memindahkan beberapa fungsi sedia ada kepada microfrontend yang sedia ada. Kita perlu melakukan ini dengan berhati-hati, kerana ia akan menyebabkan kita melanggar prinsip tanggungjawab tunggal.

Alangkah baiknya mengalih keluar microfrontend yang mempunyai tujuan tunggal untuk memaparkan halaman ralat?

Mengalih keluar 404 microfrontend dalam spa tunggal

Dalam single-spa, untuk menambah halaman 404 yang ditulis dalam React, anda perlu mempunyai microfrontend aplikasi berasingan yang memaparkan ralat 404.

Biasanya ini dilakukan dalam definisi susun atur:

<route default>
    <application name="error-microfrontend"></application>
</route>
Salin selepas log masuk

Menyingkirkan ralat-microfrontend boleh menjadi rumit.

A) Refactoring React to HTML ?

Laluan spa tunggal ditakrifkan dalam HTML, yang bermaksud bahawa jika anda ingin memaparkan komponen tindak balas, adalah sukar untuk memasukkan semua logik (terutamanya jika anda menggunakan logik tersuai dalam komponen anda). Jadi ini bukan pilihan yang berdaya maju.

B) Melepasi CustomProps ?

Anda juga boleh cuba menggantikannya dengan microfrontend sedia ada dengan menghantar CustomProps kepadanya:

// top-level layout engine API
const singleSpaRoutes = constructRoutes(template, {
    props: {
        errorPage: true
    },
    loaders: {},
});

...

// single-spa-template
<route path="/test">
    <application name="global-microfrontend"></application>
</route>

<route default>
    <application name="global-microfrontend" customProps="errorPage"></application>
</route>
Salin selepas log masuk

Atas sebab tertentu, ini tidak berfungsi. CustomProps tidak boleh diakses dalam global-micrfrontend.

Saya telah mencuba pelbagai cara untuk melakukan perkara yang sama ini, malah menukar loadRootComponent untuk global-microfrontend:

const lifecycles = singleSpaReact({
    React,
    ReactDOM,
    loadRootComponent: (props) => {
        console.log(props);

        return Promise.resolve(() => <Root />);
    },
});
Salin selepas log masuk

Yang juga tidak berfungsi, yang ganjil, kerana jika saya melihat pulangan untuk constructApplications:

// usage
const applications = constructApplications({
    loadApp: ({ name }) => globalThis.System.import(name),
    routes,
});

// result
...
name: 'global-microfrontend',
app: f(),
customProps: f(e, n),
activeWhen: [
    0: f $(),
    1: f(n)

]
Salin selepas log masuk

Nampaknya single-spa sedar bahawa global-microfrontend akan dipasang pada 2 laluan, dan salah satunya dengan prop tersuai.

Saya menganggap bahawa cara ini tidak berfungsi kerana cara spa tunggal menggabungkan prop.

C) Cara meretas ?

Memandangkan tiada apa-apa yang berjaya dan saya benar-benar mahu menyingkirkan ralat mikrofrontend, saya datang dengan penyelesaian:

// single-spa-template
<route default>
    <div id="PAGE_NOT_FOUND"></div>
</route>
Salin selepas log masuk

Dalam microfrontend global, yang dimuatkan di peringkat teratas aplikasi:

import React, { useEffect, useState } from "react";

const ErrorContent = () => (
    <div>
        <h1>404 not found</h1>
        <h3>Please try visiting another page</h3>
    </div>
);

const ErrorPage = () => {
    const [visible, setVisible] = useState<boolean>(false);

    const checkForPageNotFound = () => {
        const el = document.getElementById("PAGE_NOT_FOUND");

        setVisible(!!el);
    };

    useEffect(() => {
        window.addEventListener("single-spa:routing-event", checkForPageNotFound);

        checkForPageNotFound();

        return () => window.removeEventListener("single-spa:routing-event", checkForPageNotFound);
    }, []);

    return visible ? <ErrorContent /> : null;
};

export default ErrorPage;
Salin selepas log masuk

Ini berfungsi dengan mendengar acara single-spa:routing-event, dan setiap kali ia dicetuskan, kami menyemak sama ada div yang telah kami tambahkan dalam definisi reka letak wujud. Memandangkan div dipaparkan hanya dalam laluan lalai, ini bermakna kami boleh memaparkan kandungan halaman 404 dengan yakin.

Walaupun ini mungkin bukan penyelesaian yang paling elegan, ia membolehkan kami merangkum logik 404 dalam mikrofrontend sedia ada & untuk menyingkirkan mikrofrontend lain yang memerlukan penyelenggaraan.

Jika anda menemui penyelesaian kreatif lain untuk memudahkan seni bina berdasarkan microfrontends, saya ingin mendengar tentang pengalaman anda!

Atas ialah kandungan terperinci single-spa: laluan tanpa microfrontend tambahan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan