安装必要工具
确保你已经安装了以下工具:
- Webpack: 用于打包前端代码。
- Babel: 用于转换 JSX 和 ES6+代码。
- React Router: 用于配置客户端路由。
- Express: 用于配置服务器端 API。
配置Webpack
在项目根目录下创建 webpack.config.js:
module.exports = {
entry: './src/index.js',
exit: false,
module: {
rules: [
{
test: /\.js$|\.jsx$/,
use: 'babel-loader',
exclude: /node_modules/,
},
{
test: /\.html$|\.shtml$/,
use: 'html-loader',
},
{
test: /\.css$/,
use: 'css-loader',
exclude: /node_modules/,
},
{
test: /\.woff$/,
use: 'woff-loader',
},
{
test: /\.woff2$/,
use: 'woff2-loader',
},
{
test: /\.png$/, use: 'url-loader',
},
{
test: /\.gif$/, use: 'url-loader',
},
{
test: /\.svg$/, use: 'svg-url-loader',
},
],
},
resolve: {
extensions: ['.js', '.jsx', '.json', '.html', '.css', '.png', '.gif', '.svg'],
modules: [
'src',
'node_modules',
],
},
output: {
filename: 'dist/[name].js',
chunkFilename: 'dist/[name].chunk.js',
},
devServer: {
content: 'src',
port: 300,
hot: true,
historyApiFallback: true,
open: true,
},
}
配置Babel
创建 babel.config.js:
module.exports = {
presets: [
'@babel/preset-react',
'@babel/preset-typescript',
'@babel/preset-jsx',
],
plugins: [],
}
配置路由
在 src/App.js 创建路由:
import React from 'react';
import { BrowserRouter as Router, Route, Switch, Redirect } from 'react-router-dom';
import Home from './pages/Home';
import Contact from './pages/Contact';
function App() {
return (
<Router>
<Switch>
<Route exact path="/" render={() => <Home />} />
<Route exact path="/contact" render={() => <Contact />} />
<Redirect from="/not-found" to="/" />
</Switch>
</Router>
);
}
export default App;
配置API
在服务器端使用 Express:
创建 server.js:
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// API路由
app.get('/api/users', (req, res) => {
res.json([
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Smith' },
]);
});
// 静态资源
app.use(express.static('public'));
app.listen(3001, () => {
console.log('Server is running on http://localhost:3001');
});
配置环境变量
创建 .env 文件:
PORT=3001 DB_URL=your数据库连接字符串
安装依赖
运行以下命令:
npm install webpack babel-express react-router-dom
启动服务器
在项目根目录运行:
node server.js
启动前端服务器
在 package.json 中添加启动脚本:
{
"scripts": {
"start": "webpack serve",
"server": "node server.js",
"dev": "webpack serve --mode development",
"build": "webpack --mode production"
}
}
部署
使用 CI/CD 工具(如 Jenkins 或 GitHub Actions)自动化构建和部署。
错误处理
在 Express 中添加错误处理中间件:
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: 'Internal server error' });
});
优化和调试
使用 source-map 加速调试,配置 webpack:
module.exports = {
...,
devServer: {
...,
sourceMap: true,
hot: true,
module: {
loaders: [{
test: /\.js$/,
loader: 'source-map-loader',
enforce: true,
}],
},
},
}
使用 Redux 或 Context API
在 React 组件中使用 Redux:
创建 src/redux/store.js:
import { createStore, applyMiddleware } from 'redux';
import { compose } from 'redux-devtools';
import thunkMiddleware from 'redux-thunk';
const store = createStore(
reducers,
compose(applyMiddleware(thunkMiddleware))
);
export store;
在组件中使用:
function Home() {
const [state, dispatch] = useStore();
return (
<div>
<h1>用户数量: {state.users.length}</h1>
</div>
);
}
或者使用 Context API:
const UserContext = React.createContext(null);
function Home() {
const [users, setUsers] = React.useState(usersState);
return (
<div>
<UserContext.Provider value={users}>
<ChildComponent />
</UserContext.Provider>
</div>
);
}
进一步优化
使用 React.memo 和 React.memoize 提升组件性能,优化 webpack 配置,使用 Brotli 压缩。
通过以上步骤,你可以成功设置好 SSR 的订阅配置,实现前后端的有效分离和通信。
