使用React,Vue和Single-spa构建微前端Micro Frontends

栏目: 编程语言 · 发布时间: 6年前

内容简介:在过去的几周里,围绕微观前端进行了大量讨论(一些是负面的,一些是积极的)。在本教程中,我将分享我所学到的知识,并向您展示如何构建由React和Vue应用程序组成的微前端应用程序。要查看此应用程序的最终代码,请单击

在过去的几周里,围绕微观前端进行了大量讨论(一些是负面的,一些是积极的)。在本教程中,我将分享我所学到的知识,并向您展示如何构建由React和Vue应用程序组成的微前端应用程序。

要查看此应用程序的最终代码,请单击 此处

Single-spa

我们将用于创建项目的 工具Single SPA - 用于前端微服务的javascript框架。

Single SPA使您可以在单页面应用程序中使用多个框架,允许您按功能拆分代码,并使Angular,React,Vue.js等应用程序共存。

您可能已经习惯了Create React APP CLI和Vue CLI的时代。使用这些工具,您可以快速启动整个项目,完成webpack配置,依赖关系和样板文件,随时为您服务。

如果你已经习惯了这种简易设置,那么第一部分可能会有点啰嗦。这是因为我们将从头开始创建所有内容,包括安装我们需要的所有依赖项,以及从头开始创建webpack和babel配置。

入门

您需要做的第一件事是创建一个新文件夹来保存应用程序并切换到目录:

mkdir single-spa-app

cd single-spa-app

接下来,我们将初始化一个新的package.json文件:

npm init -y

现在,这是有趣的部分。我们将安装此项目所需的所有依赖项。我将把它们分成不同的步骤。

1. 安装常规依赖项

npm install react react-dom single-spa single-spa-react single-spa-vue v

2. 安装babel依赖项

npm install @babel/core @babel/plugin-proposal-object-rest-spread @babel/plugin-syntax-dynamic-import @babel/preset-env @babel/preset-react babel-loader --save-dev

3. 安装webpack依赖项

npm install webpack webpack-cli webpack-dev-server clean-webpack-plugin css-loader html-loader style-loader vue-loader vue-template-compiler --save-dev

现在,已经安装了所有依赖项,我们可以创建文件夹结构。

我们的应用程序的主要代码将存在于src目录中。这个src目录将保存每个应用程序的子文件夹。让我们继续在src文件夹中创建react和vue应用程序文件夹:

mkdir src src/vue src/react

现在,我们可以为webpack和babel创建配置。

创建webpack配置

在主应用程序的根目录中,使用以下代码创建一个webpack.config.js文件:

<b>const</b> path = require('path');
<b>const</b> webpack = require('webpack');
<b>const</b> { CleanWebpackPlugin } = require('clean-webpack-plugin');
<b>const</b> VueLoaderPlugin = require('vue-loader/lib/plugin')

module.exports = {
  mode: 'development',
  entry: {
    'single-spa.config': './single-spa.config.js',
  },
  output: {
    publicPath: '/dist/',
    filename: '[name].js',
    path: path.resolve(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      }, {
        test: /\.js$/,
        exclude: [path.resolve(__dirname, 'node_modules')],
        loader: 'babel-loader',
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      }
    ],
  },
  node: {
    fs: 'empty'
  },
  resolve: {
    alias: {
      vue: 'vue/dist/vue.js'
    },
    modules: [path.resolve(__dirname, 'node_modules')],
  },
  plugins: [
    <b>new</b> CleanWebpackPlugin(),
    <b>new</b> VueLoaderPlugin()
  ],
  devtool: 'source-map',
  externals: [],
  devServer: {
    historyApiFallback: <b>true</b>
  }
};

创建babel配置

在主应用程序的根目录中,.babelrc使用以下代码创建一个文件:

{
  <font>"presets"</font><font>: [
    [</font><font>"@babel/preset-env"</font><font>, {
      </font><font>"targets"</font><font>: {
        </font><font>"browsers"</font><font>: [</font><font>"last 2 versions"</font><font>]
      }
    }],
    [</font><font>"@babel/preset-react"</font><font>]
  ],
  </font><font>"plugins"</font><font>: [
    </font><font>"@babel/plugin-syntax-dynamic-import"</font><font>,
    </font><font>"@babel/plugin-proposal-object-rest-spread"</font><font>
  ]
}
</font>

初始化Single-SPA

注册应用程序是我们如何告诉single-spa何时以及如何引导,装载和卸载应用程序。

在webpack.config.js文件中,我们将入口点设置为single-spa.config.js。

让我们继续在项目的根目录中创建该文件并进行配置。

spa.config.js:

<b>import</b> { registerApplication, start } from 'single-spa'

registerApplication(
  'vue', 
  () => <b>import</b>('./src/vue/vue.app.js'),
  () => location.pathname === <font>"/react"</font><font> ? false : <b>true</b>
);

registerApplication(
  'react',
  () => <b>import</b>('./src/react/main.app.js'),
  () => location.pathname === </font><font>"/vue"</font><font>  ? false : <b>true</b>
);

start();
</font>

您可以在此文件中注册将成为主要单页应用程序一部分的所有应用程序。每次调用registerApplication注册一个新的应用程序并采取三个参数:

  1. 应用名称
  2. 加载功能(要加载的入口点)
  3. 活动功能(判断是否加载应用程序的逻辑)

接下来,我们需要为每个应用程序创建代码。

React应用

在src / react中,创建以下两个文件:

touch main.app.js root.component.js

src/react/main.app.js:

<b>import</b> React from 'react';
<b>import</b> ReactDOM from 'react-dom';
<b>import</b> singleSpaReact from 'single-spa-react';
<b>import</b> Home from './root.component.js';

function domElementGetter() {
  <b>return</b> document.getElementById(<font>"react"</font><font>)
}

<b>const</b> reactLifecycles = singleSpaReact({
  React,
  ReactDOM,
  rootComponent: Home,
  domElementGetter,
})

export <b>const</b> bootstrap = [
  reactLifecycles.bootstrap,
];

export <b>const</b> mount = [
  reactLifecycles.mount,
];

export <b>const</b> unmount = [
  reactLifecycles.unmount,
];
</font>

src/react/root.component.js

<b>import</b> React from <font>"react"</font><font>

<b>const</b> App = () => <h1>Hello from React</h1>

export <b>default</b> App
</font>

Vue应用

在src/vue创建下面两个文件:

touch vue.app.js main.vue

src/vue/vue.app.js:

<b>import</b> Vue from 'vue';
<b>import</b> singleSpaVue from 'single-spa-vue';
<b>import</b> Hello from './main.vue'

<b>const</b> vueLifecycles = singleSpaVue({
  Vue,
  appOptions: {
    el: '#vue',
    render: r => r(Hello)
  } 
});

export <b>const</b> bootstrap = [
  vueLifecycles.bootstrap,
];

export <b>const</b> mount = [
  vueLifecycles.mount,
];

export <b>const</b> unmount = [
  vueLifecycles.unmount,
];

src/vue/main.vue:

<template>
  <div>
      <h1>Hello from Vue</h1>
  </div>
</template>

接下来,在应用程序的根目录中创建index.html文件:

touch index.html

内容:

<html>
  <body>
    <div id=<font>"react"</font><font>></div>
    <div id=</font><font>"vue"</font><font>></div>
    <script src=</font><font>"/dist/single-spa.config.js"</font><font>></script>
  </body>
</html>
</font>

使用脚本更新Package.json

要运行应用程序,我们在package.json中添加启动脚本和构建脚本:

<font>"scripts"</font><font>: {
  </font><font>"start"</font><font>: </font><font>"webpack-dev-server --open"</font><font>,
  </font><font>"build"</font><font>: </font><font>"webpack --config webpack.config.js -p"</font><font>
}
</font>

运行应用程序

要运行该应用程序,请运行该start脚本:

npm start

要查看此应用程序的最终代码,请单击 此处

结论

总的来说,除了所有初始样板设置之外,设置这个项目是相当轻松的。

我认为将来如果能够处理大部分样板和初始项目设置的CLI会很好。

如果您需要这种类型的体系结构,那么 Single-spa 绝对是目前最成熟的方式,并且非常适合使用。


以上所述就是小编给大家介绍的《使用React,Vue和Single-spa构建微前端Micro Frontends》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Responsive Web Design

Responsive Web Design

Ethan Marcotte / Happy Cog / 2011-6 / USD 18.00

From mobile browsers to netbooks and tablets, users are visiting your sites from an increasing array of devices and browsers. Are your designs ready? Learn how to think beyond the desktop and craft be......一起来看看 《Responsive Web Design》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具