使用Webpack打包Node.js库后,生成的代码能否与execjs兼容?

3
我的服务器端是rails,我想要使用react和relay进行同构渲染。我发现唯一的方法是使用npm模块isomorphic-relay。显然,它使用了node-fetch,而node-fetch又使用了'http'库。是否可以使用webpack(或其他工具)创建一个包含所有代码的单个bundle,然后使用execjs(以Node为引擎)运行它呢?当我将Node作为目标时,webpack将'http'作为外部require来处理,假设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引起了“self”问题,而fetch-npm-node.js会尝试要求所有那些node库,如url,http等,因此无法与execjs一起使用。我猜我需要一种方式将node作为目标,但是以某种方式使webpack将所有这些node库(http等)包含在捆绑包中,以便execjs可以执行它。

你尝试过使用 browserify 吗? - bolav
@bolav,问题在于这是服务器端代码,而不是浏览器代码。当我使用browserify时,会出现一个错误,说“self”未定义。当我深入到bundle中时,我发现isomorphic-relay需要isomorphic-fetch,而isomorphic-fetch在针对浏览器时需要错误版本的fetch。当我使用webpack时,它确实包含了服务器库node-fetch,但然后我遇到了上述问题... - shaimo
如果您包含一些代码来演示问题,也许更容易帮助您。 - bolav
@bolav 不确定要包含哪些代码。即使只是一个需要isomorphic-relay(或isomorphic-fetch)的单行代码,除非我使用Node本身(而不是通过execjs使用Node),否则它都无法工作。 - shaimo
如果您能提供完整可重用的代码,并说明您尝试过什么以及结果如何,那对我来说会更有帮助和更容易提供帮助。现在我需要想出一个测试用例,运行它,查看错误是什么,然后猜测是否与您遇到的问题相同。即使您认为这个问题很容易复制,包含信息也会有所帮助。 - bolav
@bolav 抱歉,我会将问题的细节添加上去。 - shaimo
1个回答

0
不,这是不可能的。node-fetch是由nodejs标准库(如httpurlzlib等)制作的,而execjs无法访问任何nodejs模块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接