在本地和真实NodeJS服务器上运行React服务器端呈现有什么区别(IBM Bluemix)

时间:2017-03-01 12:53:25

标签: javascript node.js reactjs ibm-cloud cloudfoundry

我创建了一个简单的反应应用程序,使用this工作室git作为基础进行微小的更改。 因此,当我在本地NODE_ENV=server node server.js运行时,它运行正常。但我尝试在Bluemix Nodejs服务器的试用中部署此应用程序失败。这是一个日志: enter image description here 这是我的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 个答案:

答案 0 :(得分:0)

我希望比我更有知识的人可以提供更好的解决方案,但这就是我为使你的应用程序工作所做的。可能有更好的答案。

假设您不想在生产模式下运行......

1)server.js:收听PORT env var。中设置的端口 server.listen(process.env.PORT || PORT)

2)package.json:在start

中添加scripts命令

"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目录。