我正在尝试用esbuild创建一个简单的express服务器。这些是我的代码
import express from "express";
const app = express();
const port = 3000;
const stopServer = {
stop: () => {},
};
export const createServer = async () => {
app.get("/", async (req, res) => {
res.json({
first: "Hello",
});
});
const server = app.listen(port, () => {
console.log(`Listening on port: ${port}`);
});
stopServer.stop = () => {
server.close();
};
};
export const stop = () => {
stopServer.stop();
stopServer.stop = () => {};
};esbuild.config.js
const esbuild = require("esbuild");
const path = require("path");
const restartPlugin = () => {
return {
name: "restart-express",
setup(build) {
build.onEnd(async (res) => {
const { stop, createServer } = await import("../dist/server.js");
stop();
createServer();
});
},
};
};
const run = async () => {
await esbuild.build({
entryPoints: [path.resolve(__dirname, "../src/server.ts")],
outdir: path.resolve(__dirname, "../dist"),
platform: "node",
sourcemap: true,
format: "cjs",
watch: {
onRebuild: async (err, res) => {
if (err) {
console.error(err);
} else {
console.log("There is some change");
}
},
},
plugins: [restartPlugin()],
});
};
run();插件参考:https://github.com/evanw/esbuild/issues/1258#issuecomment-834676530
如果你要运行这个应用程序,我最初会工作,但当你更改代码时,即使你刷新页面,服务器也不会更新。
我不太清楚我哪里弄错了,有什么可以帮我的吗?
发布于 2021-05-09 12:38:01
问题是node缓存了import("..dist/server.js"),因此它永远不会返回新模块。为了解决这个问题,我们将编写一个函数
const purgeAppRequireCache = (buildPath) => {
for (let key in require.cache) {
if (key.startsWith(buildPath)) {
delete require.cache[key];
}
}
};这将从节点中移除高速缓存。我们也可以以这种方式使用这个函数。它解决了我的问题
const esbuild = require("esbuild");
const path = require("path");
const startPlugin = () => {
return {
name: "startPlugin",
setup(build) {
build.onEnd((res) => {
const serverPath = path.resolve(__dirname, "../dist/server.js");
const { stop } = require("../dist/server.js");
stop();
purgeAppRequireCache(serverPath);
purgeAppRequireCache(path.resolve(__dirname, "../src"));
const { listen } = require("../dist/server");
listen();
});
},
};
};
const run = async () => {
await esbuild.build({
entryPoints: [path.resolve(__dirname, "../src/server.tsx")],
outdir: path.resolve(__dirname, "../dist"),
platform: "node",
sourcemap: true,
format: "cjs",
watch: true,
bundle: true,
plugins: [startPlugin()],
});
};
run();
const purgeAppRequireCache = (buildPath) => {
for (let key in require.cache) {
if (key.startsWith(buildPath)) {
delete require.cache[key];
}
}
};发布于 2021-07-18 01:09:48
如果不重新加载运行时,全局的对象和子require(xxx) maby会出现相同的错误。你可以在修改代码时使用kill and fork cluster,它和require(xxx)一样快,有示例代码:https://github.com/ymzuiku/bike/blob/master/lib/index.js
如果您需要查看kill and fork cluster示例,这里有一个相同功能包,也使用esbuild,但它使用fs.watch: esbuild
希望能对您有所帮助:)
https://stackoverflow.com/questions/67446614
复制相似问题