自托管 Deno 库的正确方法是什么?

What's the correct way to self-host a Deno library?

我设置了一个 apache2 服务器并将我的库定位在 http://example.com/lib/deno/test@1.0.0/,然后创建了一个从 http://example.com/lib/deno/test/ 到前者的 301 重定向。在 VS Code(使用 deno 插件)中,我注意到当我导入类似 https://deno.land/std/http/server.ts 的内容时,我收到一条警告消息:

Implicitly using latest version (0.140.0) for https://deno.land/std/http/server.ts deno(deno-warn)

在 url 之后重定向到 https://deno.land/std@1.140.0/http/server.ts

但是,当我导入自己的 http://example.com/lib/deno/test/mod.ts 时,我没有收到类似的消息。此警告是否以某种方式硬编码为仅适用于 deno.land 还是我没有正确托管东西?

Deno 提供了 Language Server Protocol 的实现。要与其在模块发现、自动完成等方面的所有功能紧密集成,您将需要实施 模块注册表,在此处进行了描述:

https://deno.land/manual@v1.22.0/language_server/imports

以下是所需的基础知识,但您需要了解 API 端点、架构等的详细信息才能成功实施。

Registry support for import completions

In order to support having a registry be discoverable by the Deno language server, the registry needs to provide a few things:

  • A schema definition file. This file needs to be located at /.well-known/deno-import-intellisense.json. This file provides the configuration needed to allow the Deno language server query the registry and construct import specifiers.

  • A series of API endpoints that provide the values to be provided to the user to complete an import specifier.

“隐式使用最新版本”消息实际上是由 deno.land 服务器作为 HTTP 响应 header 传输的。要从您自己的服务器提供类似的警告消息,您需要向 HTTP 302 重定向响应添加类似的响应 header。您可以提供要显示的任何消息。

来自 deno.land 的响应 header 可以这样查看:

> curl -XGET -I https://deno.land/std/http/server.ts
HTTP/2 302 
location: /std@0.140.0/http/server.ts
x-deno-warning: Implicitly using latest version (0.140.0) for https://deno.land/std/http/server.ts

如何将此 header 附加到重定向将取决于您的网络服务器。

作为参考,你可以在Github上查看相关的deno.land/x源码:https://github.com/denoland/dotland/blob/cd43f5f4a8d2dcb8982f96c0265dde8c8d69a304/routes/x/module.tsx#L638-L645