React+Express服务端渲染(SSR)按钮点击函数无法触发问题求助
问题根因
- 缺少客户端JS执行逻辑:服务端仅返回了SSR生成的静态HTML字符串,返回的HTML中未引入客户端React打包产物,
ReactDOM.hydrate逻辑从未执行,导致事件绑定、生命周期函数都不会触发。 - 静态资源配置错误:
server/server.js中静态资源目录指向了源码目录./src,源码为ES6+语法,浏览器无法直接解析运行。 - 执行流程缺失:直接启动服务端前未打包客户端代码,没有生成浏览器可执行的JS产物。
- 文件名大小写不匹配:源码文件为
src/app.js,服务端代码中引用为import App from "../src/App",大小写不一致在类Unix系统下会直接报错。
修复步骤
修改
public/index.html,在</body>标签前添加客户端打包产物的引入,react-scripts默认的public/index.html已经预留了打包后JS的注入位置,你只需要保证服务端替换HTML内容时,只替换<div id="root"></div>部分,保留原有script注入逻辑即可,build后会自动插入对应script标签。修改
server/server.js静态资源配置:
将app.use(express.static('./src'));修改为:
app.use(express.static('./build'));
- 调整执行流程:修改
package.json中的ssr脚本,增加打包前置逻辑:
"ssr": "npm run build && node server/index.js"
- 修正文件名大小写问题:将
src/app.js重命名为src/App.js,和引用路径保持一致。
验证操作
修改完成后执行npm run ssr,访问localhost:8080即可正常触发点击事件和生命周期函数。
内容的提问来源于stack exchange,提问作者NineO。
相关产品推荐
相关产品推荐

