Skip to content

Commit 4285fd5

Browse files
committed
init without hydration
0 parents  commit 4285fd5

File tree

8 files changed

+5615
-0
lines changed

8 files changed

+5615
-0
lines changed

.babelrc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"presets": ["@babel/preset-env", "@babel/preset-react"]
3+
}
4+

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

package-lock.json

Lines changed: 5503 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"name": "react-ssr-example",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"start": "babel-node server.js",
8+
"test": "echo \"Error: no test specified\" && exit 1"
9+
},
10+
"keywords": [],
11+
"author": "",
12+
"license": "ISC",
13+
"dependencies": {
14+
"@babel/core": "^7.25.2",
15+
"@babel/preset-env": "^7.25.3",
16+
"@babel/preset-react": "^7.24.7",
17+
"babel-loader": "^9.1.3",
18+
"express": "^4.19.2",
19+
"react": "^18.3.1",
20+
"react-dom": "^18.3.1",
21+
"webpack": "^5.93.0",
22+
"webpack-cli": "^5.1.4",
23+
"webpack-dev-middleware": "^7.3.0",
24+
"webpack-hot-middleware": "^2.26.1",
25+
"webpack-node-externals": "^3.0.0"
26+
},
27+
"devDependencies": {
28+
"@babel/node": "^7.25.0"
29+
}
30+
}

server.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// server.js
2+
const express = require('express');
3+
const React = require('react');
4+
const ReactDOMServer = require('react-dom/server');
5+
const App = require('./src/App').default;
6+
7+
const app = express();
8+
9+
app.get('*', (req, res) => {
10+
const appHtml = ReactDOMServer.renderToString(React.createElement(App));
11+
const html = `
12+
<!DOCTYPE html>
13+
<html lang="en">
14+
<head>
15+
<meta charset="UTF-8">
16+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
17+
<title>React SSR</title>
18+
</head>
19+
<body>
20+
<div id="root">${appHtml}</div>
21+
<script src="/bundle.js"></script>
22+
</body>
23+
</html>
24+
`;
25+
res.send(html);
26+
});
27+
28+
app.listen(3000, () => {
29+
console.log('Server is running on http://localhost:3000');
30+
});
31+

src/App.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// src/App.js
2+
import React from 'react';
3+
4+
function App() {
5+
return (
6+
<div>
7+
<h1>Hello, SSR!</h1>
8+
<p>This is a simple server-side rendered React application.</p>
9+
</div>
10+
);
11+
}
12+
13+
export default App;
14+

src/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// src/index.js
2+
import React from 'react';
3+
import { hydrateRoot } from 'react-dom/client';
4+
import App from './App';
5+
6+
// 使用 hydrateRoot 方法补水
7+
hydrateRoot(document.getElementById('root'), <App />);

webpack.config.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// webpack.config.js
2+
const path = require('path');
3+
4+
module.exports = {
5+
entry: './src/index.js',
6+
output: {
7+
path: path.resolve(__dirname, 'dist'),
8+
filename: 'bundle.js'
9+
},
10+
module: {
11+
rules: [
12+
{
13+
test: /\.js$/,
14+
exclude: /node_modules/,
15+
use: {
16+
loader: 'babel-loader',
17+
options: {
18+
presets: ['@babel/preset-env', '@babel/preset-react']
19+
}
20+
}
21+
}
22+
]
23+
},
24+
mode: 'development'
25+
};

0 commit comments

Comments
 (0)