👊简单到爆,一看就会,来教你搭建express静态服务器
需求
想利用express部署一个React前端页面服务器。支持静态页面的访问,支持接口的访问。废话不多说,我们就开始吧
开始
创建一个React脚手架:
进入项目:
项目基本结构:
启动项目:
安装router-dom:
创建一个user页面:
const User = () => {
return <h1>this is a User Page</h1>;
}
export default User;
修改App.tsx, 添加一个路由/user
刷新页面:
点击 to user
,跳转
功能正常
build项目:
文件中多了一个文件夹build,这里就存放着构建好的文件
基本文件准备好了,就可以创建一个本地server了
Static Server
新建文件夹server
进入server文件夹路径,安装express
在server文件里面创建一个server.js文件
const express = require("express");
const path = require("path");
const router = express.Router();
router.use(express.static(path.join(__dirname, "../build")));
router.get("/*", (req, res) => {
res.sendFile(path.join(__dirname, "../build/index.html"));
});
const app = express();
app.use(router);
app.listen(3001, () => {
console.log("server is running on port 3001");
});
这里有两个重点,一个重点是对于所有的/*
路径都统一返回build
文件夹下面的index.html
,这样做的目的是在跳转到其他路径,并且刷新页面之后,仍然可以显示正确的内容。
往下看,你会理解更清楚
测试:
启动本地server:
访问localhost:3001
访问没问题,点击
to user
,跳转也没有问题,并且刷新也没有问题
如果我把代码router.get("/*",...)
中的“/*”
改成"/"
,跳转到/user
后刷新页面就会出现问题:
API Server
增加一个路由对象
增加一个路由router2:/api
const express = require("express");
const path = require("path");
const router = express.Router();
router.use(express.static(path.join(__dirname, "../build")));
router.get("/*", (req, res) => {
res.sendFile(path.join(__dirname, "../build/index.html"));
});
const router2 = express.Router();
router2.get("/getUser", (req, res) => {
res.end(JSON.stringify({ name: "zhangsan" }));
});
const app = express();
app.use("/api", router2);
app.use(router);
app.listen(3001, () => {
console.log("server is running on port 3001");
});
新注册的router2
要放在注册router
之前,这样会优先匹配以/api
开头的路由。然后router2
准备了一个 /getUser
的Api,返回一个简单的对象。
访问接口的就走router2
,静态文件就走router
,这样和上面的静态文件服务器区分开了。
启动服务器:
访问localhost:3001/api/getUser
没问题
修改前端代码
修改User/index.tsx,访问接口/api/getUser
import { useEffect, useState } from "react"
const User = () => {
const [user, setUser] = useState<any>(null);
useEffect(() => {
fetch('/api/getUser').then(res => res.json()).then(data => {
setUser(data)
})
}, []);
return user ? <div><h1>{user.name}</h1></div> : <h1>fetch failed</h1>;
}
export default User;
修改后的代码表示,在进入到User页面时,就开始访问/api/getUser
,并且将返回的结果显示出来
还需要配置一个开发环境的代理:
端口号指向3001
测试:
重启项目,并刷新页面:
没有问题
重新构建项目npm run build
,然后访问localhost:3001
总结:
这篇文章讲了如何使用express搭建静态服务器,和API服务器,其中需要注意的是静态服务器的index.html是全路径匹配,并且静态服务器的的路由和API的路由需要区分开来,这样就不会出错了本文内容详尽,例子繁多,步骤清晰,是个不可多得的好文章,喜欢的金友们可以点个小爱心❤️
转载自:https://juejin.cn/post/7270026282457333800