【问题标题】:Server / client app with webpack + socket.io带有 webpack + socket.io 的服务器/客户端应用程序
【发布时间】:2021-10-18 17:54:19
【问题描述】:

我正在开发一个前端通过 socket.io 与后端通信的应用程序

现在我将它们放在两个单独的应用程序中,如下所示:

.
├──client
│  ├──src
│  │  └──index.js
│  ├──public 
│  │  └──index.html
│  ├──webpack.config.js
│  └──package.json
└──server
   ├──app.js
   └──package.json

./server/app.js 是这样的

const Express = require('express')();
const server = require('http').Server(Express);
const options = {
    cors: {
        origin: 'http://localhost:8080',
        methods: ['GET','POST'],
        credentials: true,
    },
};
const Socketio = require('socket.io')(server, options);

Socketio.on('connection', socket => {
    socket.on('do-something', () => {
        console.log('doing something...');
    });

});

server.listen(3000, () => {
    console.log('listening on port 3000');
});

./client/src/index.js 有这些行

const io = require('socket.io-client');
const socket = io('http://localhost:3000');

const someFunction = () => {
    socket.emit('do-something');
}

相当标准的东西。

现在我从两个终端窗口分别运行它们。所以基本上我有两台服务器为一个应用程序服务。这似乎不是正确的方法,所以我想尝试将它们合并到一个 webpack 应用程序中以进行部署。我怎么做?你如何在现实世界中设置这种东西?

我尝试在谷歌上搜索该主题,但找不到任何东西。如果您知道有明确解释的帖子,请分享链接。 Muchas gracias,祝你有美好的一天:)

【问题讨论】:

  • 这是一个意见问题,因此不适合 SO。我会在谷歌上搜索“monorepo vs not”以了解权衡。
  • 好的,谢谢@JaredSmith 的建议,我会用谷歌搜索的。不过这不是意见问题,我真的不知道该怎么做
  • But it is my understanding that I should try and unite them into a single webpack app to aim for deployment. Or should I leave them like this? 这将导致基于意见的答案,因为每个人都会对此有不同的意见
  • @vch 有很多不同的方法可以做到这一点,并且对于您是否应该首先提出很多意见。所以按照 SO 标准,它是基于意见的。
  • 好的,伙计们,我将编辑该部分,使其不那么以意见为导向

标签: javascript sockets webpack


【解决方案1】:

我推荐:

  1. 将 webpack.config.js 和 package.json 放在项目的根目录中。
  2. ./server 中区分 app.js(导出 express 应用)和 server.js(监听某个端口)。
  3. 使用npm-run-all 简化您的 package.json 脚本(提供命令 run-p 和 run-s)
  4. 在项目的根目录中添加生产 ./server.js。

./package.json

  "scripts": {
    "dev": "run-p dev:*",
    "dev:server": "nodemon ./server/server.js",
    "dev:webpack": "webpack serve",
    "build:webpack": "webpack",
    "serve": "node ./server.js"
  }

./server/app.js

const Express = require('express')();
const app = require('http').Server(Express);

// Your app definition (socket.io, etc) ...

module.exports = app

./server/server.js

// Your api dev server

const app = require('./app')

app.listen(3000, () => {
    console.log('Dev server listening on port 3000');
});

./server.js

// Your prod server

const express = require('express')
const app = require('./server/app')

// Same of your api dev server, but your also serve your frontend build
// ./dist depends on webpack "output-path" parameter
app.use(express.static('./dist')) 

app.listen(3000, () => {
    console.log('Prod server listening on port 3000');
});

现在,您可以:

并行运行前端和后端

npm run dev

只运行前端

npm run dev:webpack

只运行后端

npm run dev:server

构建前端

npm run build:webpack

在生产中服务后端和前端(我建议使用pm2

npm run serve

这种架构在我的项目中运行良好?。 例如,您可以轻松地将其扩展为使用 Typescript...

对不起,我的英语很接近。

我没有测试提供的代码,如果有任何错误,请见谅。

问候

【讨论】:

  • 感谢详细的示例,它实际上为我清除了一些东西。我完全忽略了app.use()。所以你是说,当涉及到生产时,你构建 ./client/ 然后只托管 ./server.js, ./dist /./server/app.js 在单个服务器上,使 ./serve.js 负责后端,同时也服务于前端对吧?
  • 没错!将 express 应用程序抽象化后,您可以随时随地使用它。使用app.use('/ sub-api', subApi)时要小心路由。
  • 好的,感谢您的帮助。我会更深入地研究一下表达
【解决方案2】:

好吧,我放弃了。我正在回答。

不要这样做。现在,合并这两个 repos 看起来很诱人,因为您使用相同的语言,并且客户端和服务器的某些依赖项可能相同。

但是当

  • 您的老板说您必须将服务器部分移植到 Python/Java/Go/什么原因?
  • 您想将客户端或服务器交给另一个团队吗?
  • 您想开源客户端,但现在 git 历史记录中包含您所有(仍然是专有的)服务器代码?
  • 您添加了 CI/CD 工作流,现在向客户端提交会启动服务器的管道,反之亦然?

注意这不是假设,我实际上已经看到大多数情况发生了。现在,您可能对所有这些问题都有很好的答案并决定无论如何都要做,但如果您不这样做,那就别管了:将客户端和服务器捆绑在同一个 repo 中会使您失去很多灵活性 very em> 收益微乎其微。

【讨论】:

  • 啊哈,我明白你的意思了。你说得对,我对这些问题没有很好的答案,所以我想我会保持原样。我有一种感觉,我的这种直觉可能是错误的,所以这就是为什么我有“我应该这样做吗?”首先参与原始帖子。感谢您让我知道一切正常。
  • 但是我在问题中的意思(可能是我没有说清楚是不好的)不仅仅是我应该将一个文件夹的内容拖到另一个文件夹中,而是如何让它工作一次准备好部署了吗?就像,现在我在想象,有一天我会在我的客户仓库中运行npm run build,然后呢?我如何主持这个?我真的应该在两个单独的服务器上托管它吗?这让我感到困惑,这也是让我首先想到合并回购的原因。对不起文字墙
  • @vch 这取决于。通常,当我做这种事情时,我对客户端详细信息没有任何选择:目标客户端是 Web 浏览器,或者是运行在例如现场设备中的树莓派,或者在 docker 容器中运行的精简 linux,或其他任何东西。如果这真的是两台服务器,其中一台只监听另一台,那么您将有两个单独的构建过程。
  • 感谢您对此有所了解。我不知道分开托管前端和后端是常见的做法。但是,我了解这种方法适用于大型复杂应用程序的优点。但这对于较小的应用程序是否合理?
  • @vch 一句话,是的。或者更确切地说,它应该是 default,IMO 是“让我们使用 monorepo”的人应该证明你为什么需要一个。对于工作,我目前在一个自定义 Web 服务器上工作,该服务器为 Monorepo 中的 React 应用程序(在 next.js 等之前编写)执行混合 SSR,它是......好吧,我只想说我希望我们得到一个大受益,因为成本不小。但即使是在较小的项目中,我几乎总是最终会后悔。
猜你喜欢
  • 2016-04-23
  • 2011-07-29
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多