[denoland/deno]重构:#4861 用 ServerResponse 类替换 Response 接口

2024-07-17 521 views
5

此拉取请求以最少的 API 更改实现了 #4861 中的更改。但是,它引入了重大更改,因为类型Response被替换为名为 的类ServerResponse。除此之外,公共 API 是相同的。

在继续之前,我建议将函数移到类getCookies的方法中。我们可以直接复制它,但我认为我们可能需要考虑通过类ServerResponse公开 API,因为我想不出在其他上下文中使用它的情况。ServerResponse

编辑:还有一个建议。有一个名为StatusHTTP 状态的枚举,该枚举被索引name=> code,然后是一个 MapSTATUS_TEXT被索引Status[name]=> text

常规对象属性查找比 Map 快得多,枚举占用的内存是普通对象的两倍,并且枚举不在任何公共 API 可访问的地方使用。我认为我们可以只使用一个普通对象 indexed code=> text。它将减少大约 100 行代码,从而加快查找速度,并将该特定任务(检索每个 HTTP 代码的文本)的内存使用量减少至少三分之二。从宏观上看,这并不多,但确实有一定作用。

回答

1

当使用模拟请求进行测试时,将getCookies()其分开很有用。

我个人也喜欢使用 HTTP 状态的枚举,这样我就可以通过名称而不是代码来处理它们。

3

是的,我同意你关于使用名称所用错误代码的观点。但它们在整个代码库中只在一个地方使用,并且它的枚举功能未被使用(它用于获取文本代码)。

如果需要,我们可以随时将其更改为枚举。只需一次查找和替换即可:

查找(正则表达式):/(\d{3}):(\w+)替换:$2 = $1

但是如果你决定回去,我认为最好有一个枚举而不是一个枚举和一个映射。编辑:我认为映射更好。我们应该让 JS 引擎对此进行索引,而不是使用枚举。它还可以编译成更少的代码,从而减少解析时间(我知道这在这种情况下意义不大,但它仍然很重要)。

2

我恢复了与状态枚举/映射相关的更改。

4

我在我的网络服务器框架中使用它。代码在std外部的使用要比内部的使用多得多。

这可能是真的,也可能不是真的,但我认为我们可以从代码中查找状态的名称,这很好。

6

@sholladay 是的,你说得对,它很有用。但对于同一件事,同时使用映射和枚举感觉是多余的。也许我们可以用以下方法代替它:

enum Status {
    "Not Found" = 400
    /** rest of the things */
}

并删除地图?

2

@sholladay 我有一个关于 的问题ServerResponse.trailers。我认为把这个放在 中是一个错误ServerResponse

在 FetchAPI 中,Response由于数据是传入的,所以它有尾部,因此它会返回一个使用标头解析的 Promise,因为您可以在响应完成到达之前开始读取响应。但是在服务器中,您会构建响应,因此将其放在请求中更有意义。

我们不应该把它从中删除吗ServerResponse

7

我认为,如果将尾部添加到请求对象导致它们在 HTTP 响应中发送,那将会非常令人困惑。

1

我想你没理解我的意思。

在 fetch(客户端)中,响应来自外部资源,因此我们必须等待完整的请求下载才能获取任何尾随标头。

但在服务器上则相反。在服务器中,请求传入的,因此将其放在那里是有意义的(如果规范允许在请求中发送尾部)。

因此从服务器方面来看,在响应中添加尾部是没有意义的,因为我们是构建它的人。

3

不是的。预告片是从服务器发送到客户端的。

1

HeadersInit感谢您澄清这一点。那么我们应该用该类型替换拖车的螺旋桨吗?

7

我认为这可能是一个不错的改变。我想 Deno 只需要Headers在使用前将预告片强制转换为实例即可。这对用户来说肯定会更方便。

2

HeadersInit还接受 Headers 对象。因此,这是一个更好的 API。该 API 将类似于 DOM 请求/响应。

6

这可能是一个愚蠢的问题。但我应该解决合并冲突吗?

3

是的,请将最新内容合并master到您的分支中。

4

我尝试仅测试 std,但我一直收到一个错误,我不确定这是否与我的更改有关:

error: couldn't read deno_typescript/typescript/lib/lib.esnext.promise.d.ts: No such file or directory (os error 2)
   --> deno_typescript/lib.rs:249:12
    |
249 |       Some(include_str!(concat!("typescript/lib/", $e)))
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
308 |     "lib.esnext.promise.d.ts" => inc!("lib.esnext.promise.d.ts"),
    |                                  ------------------------------- in this macro invocation

error: couldn't read deno_typescript/typescript/lib/lib.esnext.string.d.ts: No such file or directory (os error 2)
   --> deno_typescript/lib.rs:249:12
    |
249 |       Some(include_str!(concat!("typescript/lib/", $e)))
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
309 |     "lib.esnext.string.d.ts" => inc!("lib.esnext.string.d.ts"),
    |                                 ------------------------------ in this macro invocation

希望这里的测试能够通过。

2

@samuelgozi 感谢补丁,但这个补丁已经过时且有争议。关闭而不合并。

如果您仍想参与其中,我们很乐意进行讨论。请在 discord 上联系我。