Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用Single-spa 创建基于 React 和 Vue 的微型前端

用Single-spa 创建基于 React 和 Vue 的微型前端

作者头像
疯狂的技术宅
发布于 2020-10-22 09:48:44
发布于 2020-10-22 09:48:44
1.8K00
代码可运行
举报
文章被收录于专栏:京程一灯京程一灯
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 每日前端夜话 第411篇
// 正文共:1400 字
// 预计阅读时间:7 分钟

Single SPA

Single SPA 是一个用于前端微服务的 javascript 框架。

它使你可以在单页应用中使用多个框架,这样就可以按功能拆分代码,并 能使 Angular、React、Vue.js 程序一起运行。

你可能已经习惯了 React 和 Vue 的 CLI,通过这些工具可以快速创建项目,并准备好 webpack 的配置、依赖项和样板代码等。

如果你已经习惯了这种操作,那么你可能会觉得本文的前半部分有些繁琐。因为我们要从头创建所有内容,包括安装所需的所有依赖项以及从零创建 webpack 和 babel 配置。

环境与配置

首先在终端下创建一个新目录并进入其中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir single-spa-app

cd single-spa-app

接下来初始化 package.json 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm init -y

然后安装项目所需的所有依赖项。为了让大家清楚的知道都安装了些什么,在这里我把它们分解成单独的步骤。

安装依赖项

安装常规依赖项
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install react react-dom single-spa single-spa-react single-spa-vue vue
安装 babel 依赖项
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
安装 Webpack 依赖项
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 目录中创建 reactvue 程序的目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir src src/vue src/react

下面配置 webpack 和 babel。

环境配置

配置 Webpack

在主程序的根目录中,创建 webpack.config.js 文件并添加一下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const path = require('path');
const webpack = require('webpack');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const 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: [
    new CleanWebpackPlugin(),
    new VueLoaderPlugin()
  ],
  devtool: 'source-map',
  externals: [],
  devServer: {
    historyApiFallback: true
  }
};
配置 babel

在根目录中创建 .babelrc 文件并添加以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "presets": [
    ["@babel/preset-env", {
      "targets": {
        "browsers": ["last 2 versions"]
      }
    }],
    ["@babel/preset-react"]
  ],
  "plugins": [
    "@babel/plugin-syntax-dynamic-import",
    "@babel/plugin-proposal-object-rest-spread"
  ]
}
初始化 Single-spa

这一步骤是对你的应用进行注册,用来告诉 single-spa 找到、装载和卸载程序的时机和方法。

webpack.config.js 文件中,把入口设置为 single-spa.config.js

在项目的根目录中创建这个文件并进行配置。

single-spa.config.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { registerApplication, start } from 'single-spa'

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

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

start();

这个文件用来注册用不同框架为主单页应用开发的每个部分。每调用一次 registerApplication 都会注册一个新的应用,它接受三个参数:

  1. 应用的名称
  2. 要加载的函数(要加载的入口点)
  3. 用来激活的函数(用于告知是否加载应用的逻辑)

接下来需要为每个应用创建代码。

React 应用

src/react 目录中创建以下两个文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
touch main.app.js root.component.js
src/react/main.app.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';
import ReactDOM from 'react-dom';
import singleSpaReact from 'single-spa-react';
import Home from './root.component.js';

function domElementGetter() {
  return document.getElementById("react")
}

const reactLifecycles = singleSpaReact({
  React,
  ReactDOM,
  rootComponent: Home,
  domElementGetter,
})

export const bootstrap = [
  reactLifecycles.bootstrap,
];

export const mount = [
  reactLifecycles.mount,
];

export const unmount = [
  reactLifecycles.unmount,
];
src/react/root.component.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from "react"

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

export default App

Vue 应用

src/vue 目录中创建以下两个文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
touch vue.app.js main.vue
src/vue/vue.app.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Vue from 'vue';
import singleSpaVue from 'single-spa-vue';
import Hello from './main.vue'

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

export const bootstrap = [
  vueLifecycles.bootstrap,
];

export const mount = [
  vueLifecycles.mount,
];

export const unmount = [
  vueLifecycles.unmount,
];
src/vue/main.vue
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
      <h1>Hello from Vue</h1>
  </div>
</template>

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
touch index.html
index.html
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
  <body>
    <div id="react"></div>
    <div id="vue"></div>
    <script src="/dist/single-spa.config.js"></script>
  </body>
</html>

用脚本更新 Package.json

在 package.json 中添加启动脚本和构建脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"scripts": {
  "start": "webpack-dev-server --open",
  "build": "webpack --config webpack.config.js -p"
}

运行程序

通过运行 start 执行程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm start

现在可以通过以下URL访问了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 渲染基于所有框架的程序
http://localhost:8080/

# 只渲染 react
http://localhost:8080/react

# 之渲染 vue
http://localhost:8080/vue

总结

除了开始时的配置外,其他工作都很轻松。如果以后 Single-spa 能够添加处理样板文件和初始项目设置的 CLI 会更好。

如果你需要微前端这种类型的体系结构,那么 Single-spa 无疑是现在最成熟的方法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端先锋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊微前端的原理和实践
本文对微前端的概念和场景进行科普,介绍一些主流的微前端的实现库及其用法,并讲解部分这些库的原理和实践知识。
2020labs小助手
2020/07/27
2.2K0
【微前端】single-spa 到底是个什么鬼
说起微前端框架,很多人第一反应就是 single-spa[1]。但是再问深入一点:它是干嘛的,它有什么用,可能就回答不出来了。
写代码的海怪
2022/03/30
1.1K0
【微前端】single-spa 到底是个什么鬼
【微前端】10分钟学会乾坤大挪移
今天刚刚学习了一个微前端框架——乾坤,正着热乎劲,写一篇入门博客。这篇文章不会讨论太多的原理和实现,只是一个入门写 Hello World 的教程。
童欧巴
2021/08/20
1.3K0
【微前端】10分钟学会乾坤大挪移
single-spa 基础概念
single-spa CLI 命令行工具 安装 npm install --global create-single-spa # or yarn global add create-single-spa 例子 create-single-spa --moduleType root-config --framework vue root 这里创建了一个 使用vue作为基础的根配置 args --dir 执行路径 --moduleType 应用类型 root-config 根配置 app-par
copy_left
2020/09/27
1.1K0
2022年了你必须要学会搭建微前端项目及部署方式
一、微前端简介 微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。各个前端应用可以独立运行、独立开发、独立部署。 微前端的好处 应用自治。只需要遵循统一的接口规范或者框架,以便于系统集成到一起,相互之间是不存在依赖关系的。 单一职责。每个前端应用可以只关注于自己所需要完成的功能。 技术栈无关。你可以使用 Angular 的同时,又可以使用 React 和 Vue。 微前端的缺点 应用的拆分基础依赖于基础设施的构建
前端进阶之旅
2022/01/06
2.4K0
2022年了你必须要学会搭建微前端项目及部署方式
微前端从singleSpa到qiankun
微前端解决什么问题?近几年前端的工程化知识开发愈演愈烈,后端解耦,前端聚合,兴起微前端的技术主要是因为SPA项目工程,得到了长足的发展,所有的微前端都是为了解决工程与工程之间的粘合问题即是 从所有收集的部分组成并返回一个无缝的HTML页面
用户10106350
2022/10/28
1.2K0
微前端从singleSpa到qiankun
使用Single-spa集成Vue2、Vue3、React
Single-spa 是一个将多个单页面应用聚合为一个整体应用的 JavaScript 微前端框架。使用 single-spa 进行前端架构设计可以带来很多好处,例如:
前端小书童
2023/09/02
6760
使用Single-spa集成Vue2、Vue3、React
一个经常被忽略的 single-spa 微前端实践
大家好,我是海怪。了解过微前端的同学应该对 single-spa 这个框架都不陌生,但是我翻看了中文整个社区,发现太少文章是讲 single-spa Demo 实践的。
写代码的海怪
2022/03/30
1.3K0
一个经常被忽略的 single-spa 微前端实践
微前端框架 之 single-spa 从入门到精通
https://juejin.im/post/6862661545592111111
coder_koala
2020/09/08
3.3K0
微前端框架 之 single-spa 从入门到精通
微前端方案 qiankun 只是更完善的 single-spa
一个前端应用能够单独跑,也能被作为一个模块集成到另一个应用里,这种架构方式就叫做微前端。
神说要有光zxg
2022/11/11
1.1K0
微前端方案 qiankun 只是更完善的 single-spa
微前端架构实战
之前比较多的处理方式是npm包形式抽离和引用,比如多个应用项目之间,可能有某业务逻辑模块或者其他是可复用的,便抽离出来以npm包的形式进行管理和使用。但这样却带来了以下几个问题:
西岭老湿
2021/04/25
4K0
微前端架构实战
微前端——single-Spa
2018年,single-spa诞生了,single-spa是一个小于5kb(gzip)npm包,用于协调微前端的挂载和卸载。只做两件事: 提供生命周期,并负责调度子应用的生命周期。挟持 url 变化,url 变化时匹配对应子应用,并执行生命周期流程。
maureen
2022/10/06
3.8K0
抛开vue-cli,一步步搭建vue+webpack环境
敲代码没有高亮简直蛋疼,简单带过下 sublime打开 —→ 点击Preferences下的Package Control —→ 输入install package回车 过一会儿 —→ 再输入vue syntax highlight回车,安装完毕 —→ 点击sublime选择vue component,即高亮
杨肆月
2019/08/15
5890
抛开vue-cli,一步步搭建vue+webpack环境
webpack构建自定义react应用
首先我们要确定,react并不是在webpack中像插件一样安装就可以直接使用,我们需要支持jsx以及一些es6的一些比较新的语法,在creat-react-app这个脚手架中已经帮我们高度封装了react项目的一些配置,甚至你是看不到很多的配置,比如@babel/preset-react转换jsx等。所以我们需要知道一个react项目需要哪些插件的前提条件,本文主要参考从头开始打造工具链[1]
Maic
2022/07/28
5400
webpack构建自定义react应用
react 同构初步(1)
单页面应用(SPA)在传统的实现)上,面临着首页白屏加载时间过长,seo难以优化的难题。解决这个问题的思路之一就是ssr(服务端渲染)。
一粒小麦
2019/12/19
1.6K2
从0开始Vue.js 和 Webpack 4 [2]
原因:当配置index.html时,指定了javascript的具体路径,为了使热模块重新加载工作,需要允许注入此路径,这样就可以实时更新html了。
bit20041436
2018/09/05
1.1K0
用 webpack 4.0 撸单页/多页脚手架 (jquery, react, vue, typescript)
首先来简单介绍一下webpack:现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部构建一个会映射项目所需的每个模块 的依赖图(dependency graph),并生成一个或多个 bundle。webpack4.0出现之后,我们可以不用再引入一个配置文件来打包项目,并且它仍然有着很高的可配置性,可以很好满足我们的需求。 在开始正文之前,首先先来看看我们要实现的成果:
徐小夕
2019/08/08
2.4K0
用 webpack 4.0 撸单页/多页脚手架 (jquery, react, vue, typescript)
从0到1 Webpack搭建Vue3开发、生产环境
起步 创建项目目录 mkdir webpack-vue3-demo 初始化 package.json npm init -y 参考文档 安装 webpack webpack-cli webpack-dev-server webpack-merge npm install webpack webpack-cli webpack-dev-server webpack-merge --save-dev 创建配置文件 mkdir build cd build touch webpack.b
peng_tianyu
2022/12/15
1.1K0
从0到1 Webpack搭建Vue3开发、生产环境
【Vue_05】前端工程化
一、ES6的模块化 1. ES6模块化规范 每个 js 文件都是一个独立的模块 导入模块成员使用 import 关键字 暴露模块成员使用 export 关键字 2. 基本语法 发使用 ex
用户8250147
2021/02/04
5540
【Vue_05】前端工程化
2021年从零开发前端项目指南
之前翻译过一篇 前端工程化发展历史 的文章,Webpack、Babel 、Eslint 现在基本上就是前端项目的标配了。
windliang
2022/09/23
2.9K0
2021年从零开发前端项目指南
相关推荐
聊聊微前端的原理和实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验