AWS
内部原理
Plugin

Open-next 使用 esbuild 来构建项目。鉴于我们的目标是支持多个版本的 Next 和多个运行时,我们开发了一个插件,以便在构建时使用 esbuild 插件覆盖部分代码。

⚠️

目前,该插件是内部的,未向用户开放。我们未来可能会开放它,但目前仅供内部使用。

如何使用

你需要创建一个 ts 文件,在其中覆盖代码。在此文件中,你可以使用以下语法:

//#import
// 这里面的所有内容将被放置在文件顶部
const test = "test";
//#endImport
 
//#override import
// 这里面的所有内容将替换具有给定 id 的覆盖内容:import
// 要获取 id,你需要查看想要覆盖的文件
import { requestHandler } from "./util.js";
//#endOverride
 
//#override fnId
// 这里面的所有内容将替换具有给定 id 的覆盖内容:fnId
export const fnId = (req: IncomingMessage, res: ServerResponse) => {
  requestHandler(req, res);
};
//#endOverride

然后你这样使用插件:

import openNextPlugin from "./plugin.js";
 
openNextPlugin({
  name: "name of the plugin",
  target: /plugins\/serverHandler\.js/g, // 用于匹配要覆盖文件的正则表达式
  replacements: ["./serverHandler.replacement.js"], // 包含覆盖内容的文件路径
}),
 

已知问题

不要在 #override 和 #imports 中包含 types,因为 esbuild 在构建时会移除前面的注释(即它会移除 //#override id)。

相反,请将 import type 放在外面,如下所示:

import type { PluginHandler } from "../next-types.js";
import type { IncomingMessage } from "../request.js";
import type { ServerResponse } from "../response.js";

//#override imports
import { requestHandler } from "./util.js";
//#endOverride

反正类型在最终输出中也会被移除。