我的服务器端是rails,我想要使用react和relay进行同构渲染。我发现唯一的方法是使用npm模块isomorphic-relay。显然,它使用了node-fetch,而node-fetch又使用了'http'库。是否可以使用webpack(或其他工具)创建一个包含所有代码的单个bundle,然后使用execjs(以Node为引擎)运行它呢?当我将Node作为目标时,webpack将'http'作为外部require来处理,假设Node会加载它,所以execjs无法运行它...
细节: 我的源文件只有一行。
生成的捆绑包包含各种如下的要求:
如果我按照以下方式更改webpack配置:
生成的代码可以在execjs中运行,但是我遇到了以下错误:
并且:
似乎fetch-npm-browserify.js引起了“self”问题,而fetch-npm-node.js会尝试要求所有那些node库,如url,http等,因此无法与execjs一起使用。我猜我需要一种方式将node作为目标,但是以某种方式使webpack将所有这些node库(http等)包含在捆绑包中,以便execjs可以执行它。
细节: 我的源文件只有一行。
require('isomorphic-fetch');
使用webpack配置:
target: 'node',
output: {
path: path.join(__dirname, '..', 'public', 'webpack'),
publicPath: '/webpack/',
filename: 'server-bundle.js',
libraryTarget: 'commonjs2'
},
生成的捆绑包包含各种如下的要求:
/* 3 */
/***/ function(module, exports) {
module.exports = require("url");
/***/ },
/* 4 */
/***/ function(module, exports) {
module.exports = require("http");
/***/ },
/* 5 */
/***/ function(module, exports) {
module.exports = require("https");
/***/ },
它在Node环境下可以正常工作(显然什么也不做),但当execjs尝试执行它时(使用node作为引擎),会出现错误:
Encountered error: "TypeError: require is not a function"
如果我按照以下方式更改webpack配置:
// target: 'node',
output: {
path: path.join(__dirname, '..', 'public', 'webpack'),
publicPath: '/webpack/',
filename: 'server-bundle.js',
// libraryTarget: 'commonjs2'
},
生成的代码可以在execjs中运行,但是我遇到了以下错误:
Encountered error: "ReferenceError: self is not defined"
在花费大量时间研究后,我认为问题出在它包含了错误版本的'fetch',假定它是面向浏览器而不是后端。在isomorphic-fetch的package.json中存在以下内容:
"browser": "fetch-npm-browserify.js",
并且:
"main": "fetch-npm-node.js",
似乎fetch-npm-browserify.js引起了“self”问题,而fetch-npm-node.js会尝试要求所有那些node库,如url,http等,因此无法与execjs一起使用。我猜我需要一种方式将node作为目标,但是以某种方式使webpack将所有这些node库(http等)包含在捆绑包中,以便execjs可以执行它。