前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5-5 webapck-dev-server 解决单页应用路由问题

5-5 webapck-dev-server 解决单页应用路由问题

作者头像
love丁酥酥
发布2020-05-09 17:40:25
8530
发布2020-05-09 17:40:25
举报
文章被收录于专栏:coding for love

1. 简介

对于单页应用 spa,大家应该都不陌生了。本节主要介绍 webpack-dev-server 如何解决 spa 遇到的路由问题。

2. 准备一个 spa

我们首先准备一个 spa:

代码语言:javascript
复制
// src/home.js
import React, { Component } from 'react';

class Home extends Component {
  render() {
    return <div>home</div>
  }
}

export default Home;
代码语言:javascript
复制
// src/list.js
import React, { Component } from 'react';

class List extends Component {
  render() {
    return <div>List</div>
  }
}

export default List;

下载路由模块,npm i react-router-dom -S:

代码语言:javascript
复制
// src/index.js
import React, { Component, Fragment } from 'react';
import ReactDom from 'react-dom';
import { BrowserRouter, Route } from 'react-router-dom';
import Home from './home.jsx';
import List from "./list.jsx";

class App extends Component {
  render() {
    return(
      <BrowserRouter>
        <Fragment>
          <Route path='/' component={Home}></Route>
          <Route path='/list' component={List}></Route>
        </Fragment>
      </BrowserRouter>
    )
  }
}

ReactDom.render(<App />, document.getElementById('root'));

3. 路由匹配

npm run dev-server 后,如下:

image.png

可以看到,根路径匹配到了 home,我们修改一下访问路径:http://localhost:3000/list

image.png

可以看到,服务器解析的时候,认为用户是要请求服务器下的 list 路径,但是这里并没有任何资源。对于 spa 来讲,我们期望的应该是请求始终指向 index.html, 而后面的路径是用来匹配路由的参数。 我们只需要如下配置即可:

代码语言:javascript
复制
module.exports = {
  //...
  devServer: {
    historyApiFallback: true
  }
};

这个配置的意思是,当使用 HTML5 History API 时,任意的 404 响应都可能需要被替代为 index.html。如下:

image.png

我们访问 http://localhost:3000/list 时因为 404 ,所以访问被定向到 index.html,并且 list 作为路由进行匹配。

这里之所以还展示了 home,是因为我们的源代码写法存在一点问题,我们修改一下:

代码语言:javascript
复制
        <Fragment>
          <Route path='/' exact component={Home}></Route>
          <Route path='/list' component={List}></Route>
        </Fragment>

image.png

okay,正常了。

4. connect-history-api-fallback

对于 historyApiFallback 的更多配置。我们可以查看 connect-history-api-fallback 比如 rewrites,我们可以指定特定的路由匹配的路径,如下,我们生成一个 404 页面:

代码语言:javascript
复制
<!--src/404.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>esmodule-oop</title>
</head>
<body>
    <div>404</div>
</body>
</html>

修改 webpack.common.js:

代码语言:javascript
复制
    plugins: [
        new HtmlWebpackPlugin({
            template: "./src/index.html",
            filename:`index.html`
        }),
        new HtmlWebpackPlugin({
            template: "./src/404.html",
            filename:`404.html`,
            chunks: []
        }),
        new CleanWebpackPlugin()
    ]

修改 webpack.dev.config.js,

代码语言:javascript
复制
        historyApiFallback: {
            rewrites: [
                { from: /\/notFound/, to: '/404.html'}
            ]
        },

然后我们运行 npm run dev-server,打开页面:

参考

https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback https://www.webpackjs.com/configuration/dev-server/#devserver-historyapifallback https://github.com/bripkens/connect-history-api-fallback

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 简介
  • 2. 准备一个 spa
  • 3. 路由匹配
  • 4. connect-history-api-fallback
  • 参考
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档