首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在esbuild中重新启动express服务器

在esbuild中重新启动express服务器
EN

Stack Overflow用户
提问于 2021-05-08 18:40:02
回答 2查看 201关注 0票数 0

我正在尝试用esbuild创建一个简单的express服务器。这些是我的代码

代码语言:javascript
复制
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

代码语言:javascript
复制
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

如果你要运行这个应用程序,我最初会工作,但当你更改代码时,即使你刷新页面,服务器也不会更新。

我不太清楚我哪里弄错了,有什么可以帮我的吗?

EN

回答 2

Stack Overflow用户

发布于 2021-05-09 12:38:01

问题是node缓存了import("..dist/server.js"),因此它永远不会返回新模块。为了解决这个问题,我们将编写一个函数

代码语言:javascript
复制
const purgeAppRequireCache = (buildPath) => {
  for (let key in require.cache) {
    if (key.startsWith(buildPath)) {
      delete require.cache[key];
    }
  }
};

这将从节点中移除高速缓存。我们也可以以这种方式使用这个函数。它解决了我的问题

代码语言:javascript
复制
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];
    }
  }
};
票数 0
EN

Stack Overflow用户

发布于 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

希望能对您有所帮助:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67446614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档