概述

前端路由与后端路由的结合一直是一个难题。koa-static这个中间件能够把静态资源“搬到”后端路由上面去,react-create-app在不解构的情况下只会把资源打包到build文件夹,怎么协调koa-static,react-create-app和react-router-dom?我摸索出了一个解决方案,记录下来,供以后开发时参考,相信对其他人也有用。

源码可以参考我的github

文件结构

我们的koa服务器的地址为:http://localhost:3000/,文件结构如下:

├── controllers                  #后端
├── models #后端
├── routes #后端路由
├── node_modules
├── static #前端react文件夹
│ ├── build #react-create-app打包默认地址(需要先打包)
│ ├── node_modules
│ ├── public
│ ├── src
│ └── package.json等配置

├──app.js #后端启动文件
└──package.json等配置

前端路由

前端路由是由react-router-dom控制的,我们需要创造一个中间路径,我命名为react-blog,代码如下:

<Router>
<Switch>
<Route path='/react-blog' component={Layout} />
<Redirect from='/' to='/react-blog'/>
</Switch>
</Router>

我们的目的是要把'/'路径映射到'/react-blog'路径,这样react的静态资源路由就不会影响到全局路由

koa-static

koa-static这个中间件起一个映射的作用,它把被映射的文件夹全部映射到http://localhost:3000/下面,我们关于koa-static这个中间件的代码如下:

//app.js
//koaStatic
app.use(koaStatic(
path.join(__dirname, './static')
));

这样就可以把static文件夹下的资源全部映射到http://localhost:3000/下面,我们在浏览器中输入如下地址则可访问相应的文件。

//访问前端react文件夹下的package.json文件
http://localhost:3000/package.json //访问前端react打包后的index文件
http://localhost:3000/build/index.html

这个时候我们能通过http://localhost:3000/build/index.html访问我们的react静态资源,访问的时候路由会自动交给前端路由,并且跳转到http://localhost:3000/react-blog这个地址。

但是当我们在另一个浏览器标签里面输入http://localhost:3000/react-blog这个地址的时候,会返回404,原因是我们的后端路由并没有react-blog这个选项,所以我们需要继续配置后端路由。

koa-router

我们用koa-router另外开一个后端路由,来处理http://localhost:3000/react-blog这个路径,代码如下:

//blog.js
const Router = require('koa-router');
let routerBlog = new Router();
routerBlog.get('*', async (ctx) => {
ctx.redirect('/build/index.html');
})
module.exports = routerBlog; //router.js
const routerBlog = require('./blog');
let router = new Router();
router.use('/react-blog', routerBlog.routes(), routerBlog.allowedMethods());
module.exports = router;

上面的代码把路径http://localhost:3000/react-blog下的所有路径全部导向http://localhost:3000/build/index.html,这样它会自动跳转到react静态资源,并且把路由交给前端路由。

其它

上面就基本实现了前端路由和后端路由相结合。

但是还美中不足的是,所有指向前端静态资源的url都会跳转到前端静态资源的主页。这就造成了一个bug,就是我收藏了前端静态资源其中的一个页面,当我下次想打开这个页面的时候只会跳到主页,并不会跳到这个页面。

这个bug留待后续优化了,思路是用正则截取后面的路径,然后通过传参传给前端路由,再由前端路由处理。

koa-static与react-create-app搭配的路径的更多相关文章

  1. react create app ,nginx服务器配置

    server{ listen 80; server_name www.domain.com domain.com; location ~* \.js$ { root /home/hard/Projec ...

  2. 利用 Create React Native App 快速创建 React Native 应用

    本文介绍的 Create-React-Native-App 是非常 Awesome 的工具,而其背后的 Expo 整个平台也让笔者感觉非常的不错.笔者目前公司是采用 APICloud 进行移动应用开发 ...

  3. React Native APP结构探索

    APP结构探索 我在Github上找到了一个有登陆界面,能从网上获取新闻信息的开源APP,想来研究一下APP的结构. 附上原网址:我的第一个React Native App 具体来讲,就是研究一个复杂 ...

  4. React Native App设置&Android版发布

    React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...

  5. React Native & app demos

    React Native & app demos https://github.com/ReactNativeNews/React-Native-Apps https://github.com ...

  6. 10 个打造 React.js App 的最佳 UI 框架

    10 个打造 React.js App 的最佳 UI 框架 在本文中,我们将分享一些助你打造 React.js App 最佳的 UI 框架.它们具备你所需要的基本 React 组件,以及易用的 API ...

  7. how to solve error when start Hyper-V quick create app error

    After checked the requirements on Hyper-v by run "systeminfo.exe" in cmd window, then I en ...

  8. React & Desktop App

    React & Desktop App https://proton-native.js.org/#/ https://github.com/kusti8/proton-native

  9. [译] Facebook:我们是如何构建第一个跨平台的 React Native APP

    英文原文(需FQ):https://code.facebook.com/posts/1189117404435352/ 早些时候,我们介绍过iOS版的React Native. React Nativ ...

随机推荐

  1. Linux命令:readonly

    readonly [-aAf] [name[=value] ...] or readonly -p -A 表示后面的name变量都是关联数组 -a 表示后面的name变量都是index数组 -f 表示 ...

  2. 微信小程序---分包加载(subpackages)及报错

    某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载. 分包很简单,具体步骤如下: 在app.json中,创建subPackages,root表示分包A的 ...

  3. datatables插件提示Cannot reinitialise DataTable的解决办法

    这个错误是由于重新设置数据源,又没有将原来的数据清空导致的. 网上有很多解决方案,试了都不管用. 最后找到一种方法,将原来的table销毁,再初始化. 方法是在datatable初始化的时候加入属性 ...

  4. Linux 网络配置文件解析

    Linux 网络配置文件解析 网络配置文件路径/etc/sysconfig/network-scripts/ifcfg-*     *代表网卡名 vim /etc/sysconfig/network- ...

  5. 199. Binary Tree Right Side View 从右侧看的节点数

    [抄题]: Given a binary tree, imagine yourself standing on the right side of it, return the values of t ...

  6. mysql数据库指定ip远程访问 指定用户 指定数据库

    .登录 mysql -u root -p 之后输入密码进行登陆 .权限设置及说明 .1添加远程ip访问权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168 ...

  7. Sonar+maven+jenkins集成,Java代码走查

    Sonar服务在Sonar安装与使用篇已经介绍过,此文章不再说了 Jenkins的安装与配置方法参考http://www.cnblogs.com/chenchen-tester/p/6408815.h ...

  8. latex相关概念

    关于Latex,收到网友的鼓励,决定好好整理下相关的信息. 在初次使用相关的程序时,遇到很多迷惑的概念,下面这篇帖子汇总得很详细. 关于latex各种概念与理解 帖子中提到了三个概念,引擎,宏集(即下 ...

  9. 20172306《Java程序设计与数据结构》第一周总结

    20172306<Java程序设计>第一周学习总结 教材学习内容总结 本周主要学习<Android和Java>书中的第二十三章和第二十六章. 第二十三章:Android简介 A ...

  10. netty2 案例:数据通信

    在实际的项目中应该如何使用netty去通信呢? 一般来说,会有以下三种情况, 1长连接 也就是服务器和客户端的通道一直不关闭,如果服务器性能非常好,并且在客户端数量不是很多的情况下,可以选择使用这种方 ...