【问题标题】:Webpack somehow bypasses Express routing completelyWebpack 以某种方式完全绕过 Express 路由
【发布时间】:2017-01-26 03:18:12
【问题描述】:

我从这个优秀的教程开始:https://www.fullstackreact.com/articles/using-create-react-app-with-a-server/ 并尝试通过添加新页面来扩展它以通过新路线提供服务。然而,经过几个小时的闲逛,我意识到 create-react-app 正在以某种方式发挥作用(如mentioned in their docs here):

`create-react-app` configures a Webpack development server to run on `localhost:3000`. 

This development server will bundle all static assets located under `client/src/`. 

All requests to `localhost:3000` will serve `client/index.html` which will include Webpack's `bundle.js`.

关键引用是“对localhost:3000 的所有请求都将服务于client/index.html”。我不知道这是怎么发生的。所以即使我和routes/index.js 混在一起:

   app.route('/')
        .get(function (req, res) {
            res.sendFile(bipath.join(__dirname, '../public', 'THISCANBEANYRANDOMFILENAME.html'))
        });

没关系,因为 webpack 无论如何都会以某种方式将localhost:3000 指向 index.html。它在哪里以及如何做到这一点?底线我正在尝试修改我的路由以提供新的 html 文件并且遇到各种文件路径问题(是的,即使我使用 require('path')sendFile(...,{root: __dirname})。)

那么这里到底发生了什么,你能给我一些提示来帮助我吗?

编辑:这可能来自 babel 和 webpack - 我不太清楚 babel 从哪里开始以及 webpack 从哪里开始。

【问题讨论】:

  • 如果您需要更多信息,这里是 github 上的文件:github.com/sw-yx/fcc-nightlife
  • Babel 所做的只是转译。我不明白为什么你认为点击根端点并没有点击路径——这就是我们正在谈论的index.html,不是吗?
  • 是的。我可以向自己证明,点击根端点并没有点击路径,因为我故意编辑了 sendFile 以发送一个不存在的文件 - 上面屏幕截图中的“indextest.html”,当我在浏览器中点击它时,它仍然提供 INDEX.HTML .所以很明显它被 webpack 开发服务器在某个地方截获了。什么是黑魔法是我什至在任何地方都看不到任何 webpack 开发服务器配置(我已经发布了 github)所以我不知道它是如何进行这些拦截的。
  • 你在重新编译吗? (嗯,重新编译和捆绑,通过观看,还是...?)
  • @DaveNewton 是的,每次都重新编译。它是一个真实的东西。该 create-react-app 引用提供的关于拦截的证据,以及 Jon 的 cmets 下面的证据表明存在这种拦截的东西。我不知道这个黑魔法是怎么发生的!

标签: node.js express webpack


【解决方案1】:

我没有玩过 create-react-app,但看起来你可以创建自己的服务器文件并运行它,而不是使用默认的 npm start。

这看起来是一个很好的例子。

https://medium.com/@patriciolpezjuri/using-create-react-app-with-react-router-express-js-8fa658bf892d#.6y4rrl61q

或者,如果您希望将路由用作 api,您可以将它们代理到不同的端口,如您链接的教程中所示。

【讨论】:

  • 是的,API 运行良好。本教程向您展示了如何对 API 服务器和客户端服务器进行双重引导。所以它是我遇到问题的客户端服务器:html服务基本上是黑魔法,因为它不尊重路由/index.js,我不知道为什么!
  • 当您运行 npm start 时,默认的 create-react-app 运行脚本将启动一个拦截所有请求的 webpack 开发服务器。您可以通过不运行默认运行脚本而是编写自己的 server.js 来处理启动非 api 服务器来解决此问题。不确定 create-react-app 中是否有更清洁的解决方案
  • 感谢您迄今为止的回答@Jon。我想我可能需要编写自己的运行脚本。我不明白的是,我的 node_modules 文件夹中似乎没有任何 webpack 模块。我也找不到拦截这些请求所需的webpack.config.js 文件。在我的 package.json (github.com/sw-yx/fcc-nightlife/blob/master/package.json) 中,本教程使用 babel-node 来启动服务器和客户端,我也不知道 babel-node 是从哪里来的。这么多谜团。
  • 看起来它们默认运行的脚本位于 node_modules/react-scripts 文件夹中。你可以看看那里,看看当你运行 npm start 时会发生什么
猜你喜欢
  • 2020-01-04
  • 2016-05-10
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2016-02-08
  • 2017-03-05
  • 1970-01-01
相关资源
最近更新 更多