Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request] 代理配置里,能否提供一个是否进行压缩的配置项 #12144

Closed
WangKB opened this issue Feb 26, 2024 · 3 comments

Comments

@WangKB
Copy link
Contributor

WangKB commented Feb 26, 2024

Background

Hello,首先感谢umijs团队对开源界的付出和努力。
我最近在做一个类似chatgpt的网页聊天应用,需要使用HTTP的SSE特性实现文本流式输出的功能。但是在使用umijs提供的代理功能对服务端的sse接口进行代理之后,接口会被阻塞,直到所有的event的都处理结束,才一次性返回到页面端。

即,正常的情况下,sse请求应该是如下的情况:

事件 时间
发起请求 00:00:00
事件1 00:00:01
事件2 00:00:03
事件3 00:00:05
结束 00:00:05

实际在使用了代理后,sse变成了如下情况:

事件 时间
发起请求 00:00:00
事件1 00:00:05
事件2 00:00:05
事件3 00:00:05
结束 00:00:05

这样用户实际上还是要等到所有事件处理完后才能得到响应,失去了sse的意义。

我搜索了其他issue,也有其他人遇到了同样的问题:
#11958
#11453
但是好像没有人给出直接问题原因所在。

Proposal

根据我的研究,问题出在umi代码中,bundler-webpack/src/server/server.ts的48行:
server.ts
即:
app.use(require('@umijs/bundler-webpack/compiled/compression')());
这里为代理服务器的express实例引入了压缩中间件,并且没有提供配置来避免引入这个中间件。而强制压缩,会导致sse的事件不会如预期的流式输出,而是等到所有所有事件都到达,并且完成压缩后才传递到页面。
目前我有两个解决方案,
一个是自己自定义一个插件来修改express的app实例,如下

api.onBeforeMiddleware(({app}) => {
  console.log(app._router.stack);
  const compressionMiddleware = app._router.stack.findIndex((layer: any) => {
    return layer.name === 'compression';
  });
  app._router.stack.splice(compressionMiddleware, 1);
});

另一个方案是,手动删除这一行来保证我的sse请求正常执行。
但我觉得这个两个方法的侵入性都太强了,尤其第二个。所以希望umijs官方能否提供一个类似webpack里devServer的compress配置项,来把这个压缩的逻辑交给用户来决定。

@consistent-k
Copy link
Contributor

表示有同样的需求

@fz6m
Copy link
Member

fz6m commented Feb 29, 2024

是的,欢迎 PR 提供一个 devServer.compress 的选项用来关闭 compress 插件,或者做一个环境变量判断 if (process.env.UMI_DEV_SERVER_COMPRESS !== 'none') 来关闭 compress 插件。

综合 issue 来看,有这个需求的场景仅限于开发时的 sse 传输不达预期,而生产构建后和 dev server 无关,所以只是很少数人的需求。

@WangKB
Copy link
Contributor Author

WangKB commented Mar 1, 2024

是的,欢迎 PR 提供一个 devServer.compress 的选项用来关闭 compress 插件,或者做一个环境变量判断 if (process.env.UMI_DEV_SERVER_COMPRESS !== 'none') 来关闭 compress 插件。

综合 issue 来看,有这个需求的场景仅限于开发时的 sse 传输不达预期,而生产构建后和 dev server 无关,所以只是很少数人的需求。

感谢回复。
已提交pr,因为看到你们官网的QA说umi4不再提供devServer的配置,所以我这里采用了环境变量的方式。
同时在examples/dev-server-no-compress里创建了一个验证子项目

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants