【问题标题】:Loading a webpack-dev-server asset in Node.js (plain V8 environment)在 Node.js 中加载 webpack-dev-server 资产(普通 V8 环境)
【发布时间】:2017-08-31 09:04:42
【问题描述】:

我正在尝试 webpack(在 Rails 的 webpacker 库的上下文中)并希望将生成的包用于服务器渲染 React 组件。

我可以很好地从本地开发服务器获取文件,但是当我将它们加载到我的服务器端 JavaScript 上下文时问题就来了。 (我使用的是 Ruby 的 ExecJS,由 therubyracer 提供支持,这是一个与 V8 的 Ruby 绑定。)

由于捆绑包来自 webpack-dev-server,它包含一堆用于设置热模块重新加载的代码。此代码假定它是从 script 标记加载的,因此它会对页面的 URL 进行一些检查。在纯 V8 上下文中,没有 URL,因此我们会收到很多错误,例如:

TypeError: Cannot read property 'protocol' of undefined

因为它试图读取self.location.protocol。 (self 存在,但self.location 不存在。)

我开始模拟各种 DOM API 以消除错误,但我想知道,有没有 正确的 方法来做到这一点?例如:

  • 我可以从 webpack-dev-server 获取一个捆绑包没有 HMR 代码吗?
  • 我能否以某种方式绕过 HMR 代码(添加大量模拟除外)?

【问题讨论】:

    标签: ruby-on-rails webpack-dev-server server-side-rendering webpacker


    【解决方案1】:

    这是一个非答案,但我找到了解决方法。

    客户端设置是在require 调用期间完成的,所以我使用正则表达式来注释掉require

    client_require = /__webpack_require__\(.*webpack-dev-server\/client\/index\.js.*\n/
    # find the client require and comment it out: 
    dev_server_asset.sub!(client_require, '//\0')
    

    现在,设置代码存在,但它永远不会运行!这很难理解和脆弱,但它有效?。

    【讨论】:

      猜你喜欢
      • 2019-08-06
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2023-02-19
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2018-11-09
      相关资源
      最近更新 更多