用Podium构建Svelte微前端

373 阅读7分钟

微前端是一个应用程序,它是一个更大的架构的一部分,而不是一个独立的应用程序。基本上,这是一个由较小的应用程序(或微前端)组成的复合应用程序,每个微前端可以由独立的、单独的团队拥有、开发和维护。

这种方法通常用于复杂的应用程序,如宜家和Upwork的网站以及Spotify的桌面应用程序,这些应用程序有增长过大的趋势,变得过于混乱和难以维护。

在本教程中,我们将创建两个不同的基本Svelte应用程序,并使用Podium将各个片段编译成一个应用程序,以学习微前端的知识。

对于本教程,请确保你对Svelte和Node.js有基本了解。

创建Svelte应用程序

开始创建Svelte应用程序,我们必须首先创建一个名为svelte-app-one 的新文件夹,并在其中运行以下命令来克隆Svelte的GitHub模板。

npx degit sveltejs/template

要创建第二个应用程序,在另一个名为svelte-app-two 的文件夹中重复同样的过程。

接下来,让我们对这些应用程序做一些小改动。由于这两个应用将被合并,而且每个应用都有自己的body 元素,我们必须通过给它们添加唯一的ID来区分这两个主体元素。

对于第一个应用程序,导航到public/index.html ,在body标签内添加一个div,并给它一个唯一的ID。

<body>
        <div id="svelte-app-one"></div>
</body>

接下来,导航到该文件夹的src/main.js 文件,并确保querySelector 函数以你刚刚添加的ID为目标。

import App from './App.svelte';

const app = new App({
        target: document.querySelector( '#svelte-app-one' )
});

export default app;

public/index.html 中的第二个应用程序重复同样的过程。

<body>
        <div id="svelte-app-two"></div>
</body>

然后再在src/main.js

import App from './App.svelte';

const app = new App({
        target: document.querySelector("#svelte-app-two")
});

export default app;

在Svelte应用程序中显示一个消息

在这两个应用程序中,我们将显示非常简单的消息,并继续将它们与Podium结合在一起。对于应用程序一,导航到App.svelte ,添加一个带有简单信息的标题标签,并给它一些样式。

<script>
</script>

<main>
        <h1>This is the first app!</h1>
</main>

<style>
        main {
                text-align: center;
                padding: 1em;
                max-width: 300px;
                margin: 0 auto;
                padding: 20px 5px;
        }
        h1 {
                color: #000;
                font-size: 5em;
                font-weight: 150;
        }
</style>

接下来,为第二个应用程序做同样的事情。

<script>
</script>

<main>
        <h1>This is the second app!</h1>
</main>

<style>
        main {
                text-align: center;
                padding: 1em;
                max-width: 300px;
                margin: 0 auto;
                padding: 20px 5px;
                background-color: #000;
                color:#fff;
        }
        h1 {
                color: #fff;
                font-size: 5em;
                font-weight: 150;
        }
</style>

为Podium准备Svelte应用程序

为了让Podium将这两个应用程序结合在一起,它需要知道应用程序的HTML、CSS和JavaScript文件的位置。这可以在一个manifest.json 文件和一个叫做podlet的工具的帮助下实现,以生成这个manifest.json 文件。

我们可以用下面的命令将podlet的包安装在svelte-app-one 文件夹中。

npm install express @podium/podlet

接下来,我们将使用podlet工具使两个应用程序的CSS、JavaScript和HTML文件对Podium可用。在svelte-app-one 的根文件夹中,创建一个名为podlet.js 的文件并添加以下代码。

const express = require("express");
const Podlet = require("@podium/podlet");
const fs = require("fs");

const app = express();

const podlet = new Podlet({
  name: "svelte-app-one", 
  version: "0.1.0",
  pathname: "/", 
  manifest: "/manifest.json", 
  development: true, 
});


podlet.css({ value: "http://localhost:3100/css/global.css" });
app.use("/css", express.static("public/css/"));

let buildfiles = fs.readdirSync('public/build');
buildfiles.forEach((element, index) => {
  if(element.indexOf('.css') !== -1 && element.indexOf('.css.map') === -1){
    podlet.css({ value: "http://localhost:3100/build/" + element });
  }else if(element.indexOf('.js') !== -1 && element.indexOf('.js.map') === -1) {
    podlet.js({ value: "http://localhost:3100/build/" + element, defer: true });
  }
});
app.use("/build", express.static("public/build/"));



app.use(podlet.middleware());

app.get(podlet.content(), (req, res) => {
  res.status(200).podiumSend('<div id="svelte-app-one"></div>');
});

app.get(podlet.manifest(), (req, res) => {
  res.status(200).send(podlet);
});

app.listen(3100);

在这里,我们首先导入podlet和文件系统包,并创建一个podlet实例,给它一个名称、版本和服务的路径。我们还指定了它将创建的清单文件。

接下来,我们将应用程序中的 JavaScript 和 CSS 文件添加到 podlet 中(这些文件在public/build 文件夹中),并使用readdirSync 函数来访问public/build 文件夹,使用foreach 语句来循环浏览。

使用if 语句,我们指定每一个具有.css 扩展名的文件应该使用podlet.css 函数添加到podlet中。

然后,使用else if 语句,我们指定每个具有.js 扩展名的文件应使用podlet.js 函数添加到 podlet 中。

对于生产来说,本地主机的URL应该被改为文件托管的URL。

接下来,我们可以使用express.static 来创建这些文件的静态链接,以使这些文件公开可用。为了使我们的应用程序中的路由工作,并使podlet正常运行,我们必须使用middleware 函数来装载中间件。

在指定了我们的CSS和JavaScript文件后,我们可以使用podiumSend 函数将podlet指向我们的HTML--我们先前在body标签内添加的div。

现在我们的podlet知道了我们的CSS、JavaScript和HTML文件的位置,我们可以使用manifest 函数为Podium创建一个manifest.json 文件,并指定我们的应用程序应该被提供的端口。

最后,我们将按照完全相同的过程为我们的第二个Svelte应用程序创建一个podlet。

const express = require("express");
const Podlet = require("@podium/podlet");
const fs = require("fs");

const app = express();

const podlet = new Podlet({
  name: "svelte-app-two", 
  version: "0.1.0",
  pathname: "/", 
  manifest: "/manifest.json", 
  development: true, 
});


podlet.css({ value: "http://localhost:3101/css/global.css" });
app.use("/css", express.static("public/css/"));

let buildfiles = fs.readdirSync('public/build');
buildfiles.forEach((element, index) => {
  if(element.indexOf('.css') !== -1 && element.indexOf('.css.map') === -1){
    podlet.css({ value: "http://localhost:3101/build/" + element });
  }else if(element.indexOf('.js') !== -1 && element.indexOf('.js.map') === -1) {
    podlet.js({ value: "http://localhost:3101/build/" + element, defer: true });
  }
});
app.use("/build", express.static("public/build/"));



app.use(podlet.middleware());

app.get(podlet.content(), (req, res) => {
  res.status(200).podiumSend('<div id="svelte-app-two"></div>');
});

app.get(podlet.manifest(), (req, res) => {
  res.status(200).send(podlet);
});

app.listen(3101);

使用Podium合并两个Svelte应用程序

要开始结合两个Svelte应用程序,首先让我们创建一个名为podium-merger 的文件夹,并在其中运行以下命令来创建一个package.json 文件。

npm init

接下来,导航到该文件夹,并创建一个名为layout.js 的文件。在这个文件中,我们将评估之前创建的两个podlet,获得这些podlet中指定的HTML、CSS和JavaScript文件,并将它们合并成一个应用程序。

在Podium中,我们可以按照我们希望的方式安排我们正在组合的应用程序。这种安排被称为布局。

const express = require("express");
const app = express();

const Layout = require("@podium/layout");

const layout = new Layout({
  name: "podiumLayout",
  pathname: "/",
});

const svelteAppOne = layout.client.register({
  name: "svelte-app-one",
  uri: "http://localhost:3100/manifest.json",
});
const svelteAppTwo = layout.client.register({
  name: "svelte-app-two",
  uri: "http://localhost:3101/manifest.json",
});

app.use(layout.middleware());

app.get("/", async (req, res) => {
  const podiumLayout = res.locals.podium;

  const data = await Promise.all([
    svelteAppOne.fetch(podiumLayout),
    svelteAppTwo.fetch(podiumLayout),
  ]);

  podiumLayout.podlets = data;
  podiumLayout.view.title = "Composite App";

  res.podiumSend(`<div>
    ${data[0]}
    ${data[1]}
  </div>
  `);
});


app.listen(3000);

让我们来分解一下代码:首先,我们导入layout 包,并创建一个实例,给它一个名字和一个要提供的路径。

接下来,我们使用client.register 函数将我们的Svelte应用程序注册到布局上。请注意我们是如何将布局指向manifest.json 文件的。这是它找到CSS、HTML和JavaScript文件的方式,它将结合这些文件。

然后,我们从我们的布局包中加载middleware 函数,以确保我们的应用程序中的所有路由正常运行。

接下来,我们指定当我们的应用程序的根URL被访问时,Podium布局应该被返回。然后,我们使用fetch 函数从两个应用程序中获取数据,并将数据保存在一个名为data 的常量中,并通过podiumLayout.podlets = data; 将数据绑定到我们的布局中。

通过使用podiumSend 函数,我们在div标签中指定应用程序的显示安排。请注意,data[0] 是我们第一个应用程序的数据,data[1] 是我们第二个应用程序的数据。

最后,我们指定为我们的应用程序提供服务的端口。

总结

这就是我们最终的应用程序。

Micro Frontend Application

微前端可以帮助你在前端实现微服务对后端所做的事情,也就是让你有机会在大型组织中简化开发过程。

有了微前端,你可以让小团队独立开发特定的功能,从而消除进展的阻力和瓶颈。

The postBuilding Svelte micro frontends with Podiumappeared first onLogRocket Blog.