koa-static与react-create-app搭配的路径
概述
前端路由与后端路由的结合一直是一个难题。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搭配的路径的更多相关文章
- react create app ,nginx服务器配置
server{ listen 80; server_name www.domain.com domain.com; location ~* \.js$ { root /home/hard/Projec ...
- 利用 Create React Native App 快速创建 React Native 应用
本文介绍的 Create-React-Native-App 是非常 Awesome 的工具,而其背后的 Expo 整个平台也让笔者感觉非常的不错.笔者目前公司是采用 APICloud 进行移动应用开发 ...
- React Native APP结构探索
APP结构探索 我在Github上找到了一个有登陆界面,能从网上获取新闻信息的开源APP,想来研究一下APP的结构. 附上原网址:我的第一个React Native App 具体来讲,就是研究一个复杂 ...
- React Native App设置&Android版发布
React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...
- React Native & app demos
React Native & app demos https://github.com/ReactNativeNews/React-Native-Apps https://github.com ...
- 10 个打造 React.js App 的最佳 UI 框架
10 个打造 React.js App 的最佳 UI 框架 在本文中,我们将分享一些助你打造 React.js App 最佳的 UI 框架.它们具备你所需要的基本 React 组件,以及易用的 API ...
- 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 ...
- React & Desktop App
React & Desktop App https://proton-native.js.org/#/ https://github.com/kusti8/proton-native
- [译] Facebook:我们是如何构建第一个跨平台的 React Native APP
英文原文(需FQ):https://code.facebook.com/posts/1189117404435352/ 早些时候,我们介绍过iOS版的React Native. React Nativ ...
随机推荐
- Linux命令:readonly
readonly [-aAf] [name[=value] ...] or readonly -p -A 表示后面的name变量都是关联数组 -a 表示后面的name变量都是index数组 -f 表示 ...
- 微信小程序---分包加载(subpackages)及报错
某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载. 分包很简单,具体步骤如下: 在app.json中,创建subPackages,root表示分包A的 ...
- datatables插件提示Cannot reinitialise DataTable的解决办法
这个错误是由于重新设置数据源,又没有将原来的数据清空导致的. 网上有很多解决方案,试了都不管用. 最后找到一种方法,将原来的table销毁,再初始化. 方法是在datatable初始化的时候加入属性 ...
- Linux 网络配置文件解析
Linux 网络配置文件解析 网络配置文件路径/etc/sysconfig/network-scripts/ifcfg-* *代表网卡名 vim /etc/sysconfig/network- ...
- 199. Binary Tree Right Side View 从右侧看的节点数
[抄题]: Given a binary tree, imagine yourself standing on the right side of it, return the values of t ...
- mysql数据库指定ip远程访问 指定用户 指定数据库
.登录 mysql -u root -p 之后输入密码进行登陆 .权限设置及说明 .1添加远程ip访问权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168 ...
- Sonar+maven+jenkins集成,Java代码走查
Sonar服务在Sonar安装与使用篇已经介绍过,此文章不再说了 Jenkins的安装与配置方法参考http://www.cnblogs.com/chenchen-tester/p/6408815.h ...
- latex相关概念
关于Latex,收到网友的鼓励,决定好好整理下相关的信息. 在初次使用相关的程序时,遇到很多迷惑的概念,下面这篇帖子汇总得很详细. 关于latex各种概念与理解 帖子中提到了三个概念,引擎,宏集(即下 ...
- 20172306《Java程序设计与数据结构》第一周总结
20172306<Java程序设计>第一周学习总结 教材学习内容总结 本周主要学习<Android和Java>书中的第二十三章和第二十六章. 第二十三章:Android简介 A ...
- netty2 案例:数据通信
在实际的项目中应该如何使用netty去通信呢? 一般来说,会有以下三种情况, 1长连接 也就是服务器和客户端的通道一直不关闭,如果服务器性能非常好,并且在客户端数量不是很多的情况下,可以选择使用这种方 ...