运行 React 服务器端渲染在本地和在真正的 NodeJS 服务器 (IBM Bluemix) 上有什么区别
What is the difference to run React server-side rendering locally and on real NodeJS server (IBM Bluemix)
我使用 this workshop git 创建了一个带有服务器端渲染的简单 React 应用程序作为基础,并进行了一些小改动。
因此,当我 运行 在本地 NODE_ENV=server node server.js
时,它工作正常。但是我尝试在 Bluemix Nodejs 服务器上部署此应用程序的尝试失败了。这是一个日志:
这是我的 server.js 代码:
require('babel-register')
const express = require('express')
const React = require('react')
const ReactDOMServer = require('react-dom/server')
const ReactRouter = require('react-router')
const StaticRouter = ReactRouter.StaticRouter
const _ = require('lodash')
const fs = require('fs')
const PORT = 5050
const baseTemplate = fs.readFileSync('./index.html')
const template = _.template(baseTemplate)
const App = require('./js/App').default
const server = express()
server.use('/_public', express.static('./_public'))
server.use((req, res) => {
const context = {}
const body = ReactDOMServer.renderToString(
React.createElement(StaticRouter, {location: req.url,
context: context},
React.createElement(App))
)
res.write(template({body: body}))
res.end()
})
console.log('listening on port', PORT)
server.listen(PORT)
P.S. 很明显它不理解js/App.js中的ES6语法,但在我的本地服务器上它可以工作。
默认情况下 NODE_ENV=production
但根据 Bluemix docs 我在 .profile.d 目录中创建了一个文件
node_env.sh代码:
export NODE_ENV=server;
但是我不确定这个文件是否改变了node_env。
我希望比我更有知识的人可以提供更好的解决方案,但这是我为使您的应用正常运行所做的工作。可能有更好的答案。
假设您不想 运行 在生产模式下...
1) server.js:监听 PORT 环境变量中设置的端口。
server.listen(process.env.PORT || PORT)
2) package.json: 在scripts
中添加start
命令
"start": "babel-node server.js --presets es2015,stage-2"
3) 获取 babel-cli
npm install --save-dev babel-cli
npm install --save-dev babel-preset-es2015 babel-preset-stage-2
4) 创建一个manifest.yml来设置CF属性
applications:
- name: rvennam-node-react
memory: 1G
disk_quota: 2G
env:
NPM_CONFIG_PRODUCTION: false
NODE_ENV: dev
5) 从 package.json 中的 devDependencies 中删除 eslint 依赖项(不匹配)
同样,这是假设您想要 运行 在开发模式下的 Bluemix 上。如果您想在 Bluemix 上进行生产,我想您会想使用 webpack 在本地构建,然后推送并提供您的 dist 目录。
我使用 this workshop git 创建了一个带有服务器端渲染的简单 React 应用程序作为基础,并进行了一些小改动。
因此,当我 运行 在本地 NODE_ENV=server node server.js
时,它工作正常。但是我尝试在 Bluemix Nodejs 服务器上部署此应用程序的尝试失败了。这是一个日志:
require('babel-register')
const express = require('express')
const React = require('react')
const ReactDOMServer = require('react-dom/server')
const ReactRouter = require('react-router')
const StaticRouter = ReactRouter.StaticRouter
const _ = require('lodash')
const fs = require('fs')
const PORT = 5050
const baseTemplate = fs.readFileSync('./index.html')
const template = _.template(baseTemplate)
const App = require('./js/App').default
const server = express()
server.use('/_public', express.static('./_public'))
server.use((req, res) => {
const context = {}
const body = ReactDOMServer.renderToString(
React.createElement(StaticRouter, {location: req.url,
context: context},
React.createElement(App))
)
res.write(template({body: body}))
res.end()
})
console.log('listening on port', PORT)
server.listen(PORT)
P.S. 很明显它不理解js/App.js中的ES6语法,但在我的本地服务器上它可以工作。
默认情况下 NODE_ENV=production
但根据 Bluemix docs 我在 .profile.d 目录中创建了一个文件
node_env.sh代码:
export NODE_ENV=server;
但是我不确定这个文件是否改变了node_env。
我希望比我更有知识的人可以提供更好的解决方案,但这是我为使您的应用正常运行所做的工作。可能有更好的答案。
假设您不想 运行 在生产模式下...
1) server.js:监听 PORT 环境变量中设置的端口。
server.listen(process.env.PORT || PORT)
2) package.json: 在scripts
start
命令
"start": "babel-node server.js --presets es2015,stage-2"
3) 获取 babel-cli
npm install --save-dev babel-cli
npm install --save-dev babel-preset-es2015 babel-preset-stage-2
4) 创建一个manifest.yml来设置CF属性
applications:
- name: rvennam-node-react
memory: 1G
disk_quota: 2G
env:
NPM_CONFIG_PRODUCTION: false
NODE_ENV: dev
5) 从 package.json 中的 devDependencies 中删除 eslint 依赖项(不匹配)
同样,这是假设您想要 运行 在开发模式下的 Bluemix 上。如果您想在 Bluemix 上进行生产,我想您会想使用 webpack 在本地构建,然后推送并提供您的 dist 目录。