Web组件化 - 子应用中的路由

前一篇讲述了如何把React组件转换为Web组件,同时也留下了几个问题。其中之一就是组件(子应用)内部的路由如何影响到Shell App(以及反之)。 这里我们动手做个测试,依旧以React为例。

打开上一篇建立的项目,执行
npm install react-router-dom --save
npm install express --save

注:react-router-dom的用法可以参考我之前的文章

修改app.tsx,如下:

import React from 'react';
import ReactDOM from 'react-dom';
import {
  BrowserRouter as Router,
  Route,
  Switch,
  Link
  } from "react-router-dom";

function Home() {
    return (
      <div>
        App Home
      </div>
    );
  }

function About() {
  return (
    <div>
      About Page
    </div>
  );
}

function Account() {
    return (
      <div>
        My Account
      </div>
    );
  }

function App() {
    return (
      <Router>
        <div>
          <ul>
            <li>
              <Link to="/">Home</Link>
            </li>
            <li>
              <Link to="/about">About</Link>
            </li>
            <li>
              <Link to="/account">Account</Link>
            </li>
          </ul>


          <hr />
          <Switch>
            <Route exact path="/">
              <Home />
            </Route>
            <Route path="/about">
              <About />
            </Route>
            <Route path="/account">
              <Account />
            </Route>
          </Switch>
        </div>
      </Router>
      
    )
}

class HelloElement extends HTMLElement {
    connectedCallback() {
      ReactDOM.render(
        <div>
            <App></App>
            {/* <button onClick={() => alert("Clicked")}>
                Click Me!
            </button> */}
        </div>,
        this
      );
    }
  }
  
  const tagName = "hello-component";
  
  if (!window.customElements.get(tagName)) {
    window.customElements.define(tagName, HelloElement);
  }

这里我加入了路由,以及对应的组件。接下来用express作为web server。
在src下新建server.js

const path = require('path');
const express = require('express')
const app = express()
const port = 3000
const fileRoot = path.resolve(__dirname, '../public');

app.use(express.static(path.join(__dirname, '../public')))

app.get('/', (req, res) => {
    res.sendFile('index.html', { root: fileRoot });
})

app.get('/account', (req, res) => {
    res.sendFile('index.html', { root: fileRoot });
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

代码就绪后,运行npm run build, 再运行node ./src/server.js

可以看到sub app的路由正常工作。

posted @ 2021-10-25 12:56  老胡Andy  阅读(142)  评论(0编辑  收藏  举报