【发布时间】:2016-05-28 23:43:12
【问题描述】:
我的服务器端是rails,我正在尝试使用react 和relay 进行同构渲染。我发现的唯一方法是使用 npm 模块 isomorphic-relay。显然它正在使用 node-fetch ,而 node-fetch 又使用了“http”库。是否可以使用 webpack(或其他工具)创建包含所有代码的单个包,然后使用 execjs(以 Node 作为引擎)运行它?当我使用 Node 作为目标时,webpack 将 'http' 作为外部要求,假设 Node 会加载它,所以 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 导致了“自我”问题,而 fetch-npm-node.js 会尝试要求所有这些节点库,如 url、http 等,因此不适用于 execjs .
我想我需要一些方法来使用节点作为目标,但是以某种方式让 webpack 在包本身中包含所有这些节点库(http 等),以便 execjs 可以执行它。
【问题讨论】:
-
您是否尝试过使用browserify?
-
@bolav 问题是这是服务器端代码,而不是浏览器代码。当我使用 browserify 时,我收到一条错误消息,提示“未定义自我”。当我深入研究捆绑包时,我看到 isomorphic-relay 需要 isomorphic-fetch,而当针对浏览器时,这反过来又需要错误版本的 fetch。当我使用 webpack 时,它确实包含服务器库 node-fetch,但随后我遇到了上面的问题......
-
如果你包含一些代码,你可以在其中演示问题,也许它更容易帮助你。
-
@bolav 不确定要包含哪些代码。除非我使用 node 本身(而不是通过 execjs 使用 node),否则即使只需要 isomorphic-relay(或 isomorphic-fetch)的单行也不起作用。
-
如果您将您尝试过的内容和结果包含在完整的可重用代码中,这将更有用,也更容易帮助您。现在我需要找出一个测试用例,运行它,看看错误是什么,然后猜测这是否与您遇到的问题相同。即使您认为重现此问题很容易,但如果您包含信息也会有所帮助。
标签: ruby-on-rails node.js reactjs webpack isomorphic-javascript