编写适配器
如果您偏好的环境还没有适配器,您可以自己构建适配器。我们建议查看类似平台的适配器源码并将其作为起点进行复制。
适配器包实现以下 API,用于创建一个 Adapter
:
/** @param {AdapterSpecificOptions} options */
export default function (options: any
options) {
/** @type {import('@sveltejs/kit').Adapter} */
const const adapter: Adapter
adapter = {
Adapter.name: string
The name of the adapter, using for logging. Will typically correspond to the package name.
name: 'adapter-package-name',
async Adapter.adapt(builder: Builder): MaybePromise<void>
This function is called after SvelteKit has built your app.
adapt(builder: Builder
builder) {
// 适配器实现
},
async Adapter.emulate?(): MaybePromise<Emulator>
Creates an Emulator
, which allows the adapter to influence the environment
during dev, build and prerendering
emulate() {
return {
async Emulator.platform?(details: {
config: any;
prerender: PrerenderOption;
}): MaybePromise<App.Platform>
A function that is called with the current route config
and prerender
option
and returns an App.Platform
object
platform({ config: any
config, prerender: PrerenderOption
prerender }) {
// 返回的对象在开发、构建和预览时成为 `event.platform`
// 其形状与 `App.Platform` 一致
}
}
},
Adapter.supports?: {
read?: (details: {
config: any;
route: {
id: string;
};
}) => boolean;
} | undefined
Checks called during dev and build to determine whether specific features will work in production with this adapter
supports: {
read?: ((details: {
config: any;
route: {
id: string;
};
}) => boolean) | undefined
Test support for read
from $app/server
read: ({ config: any
config, route: {
id: string;
}
route }) => {
// 如果具有给定 `config` 的路由在生产环境中可以使用来自
// `$app/server` 的 `read`,则返回 `true`,否则返回 `false`
// 或抛出描述如何配置部署的描述性错误
}
}
};
return const adapter: Adapter
adapter;
}
其中,name
和 adapt
是必需的。emulate
和 supports
是可选的。
在 adapt
方法中,适配器应该执行以下几个任务:
- 清理构建目录
- 使用
builder.writeClient
、builder.writeServer
和builder.writePrerendered
写入 SvelteKit 输出 - 输出以下代码:
- 从
${builder.getServerDirectory()}/index.js
导入Server
- 使用通过
builder.generateManifest({ relativePath })
生成的清单实例化应用 - 监听来自平台的请求,必要时将其转换为标准 Request,调用
server.respond(request, { getClientAddress })
函数生成 Response 并响应 - 通过传递给
server.respond
的platform
选项向 SvelteKit 暴露任何平台特定信息 - 如果必要,全局填充
fetch
以在目标平台上工作。SvelteKit 为可以使用undici
的平台提供了@sveltejs/kit/node/polyfills
辅助工具
- 从
- 如果必要,打包输出以避免需要在目标平台上安装依赖
- 将用户的静态文件和生成的 JS/CSS 放在目标平台的正确位置
在可能的情况下,我们建议将适配器输出放在 build/
目录下,将任何中间输出放在 .svelte-kit/[adapter-name]
目录下。