首页 > 解决方案 > 运行测试套件后如何退出 webpack-dev-server 执行

问题描述

我创建了一个构建应用程序的 webpack 配置文件,使用 webpack-dev-server 运行开发服务器并运行测试套件,如下所示。

devServer: {
  contentBase: path.join(__dirname, "dist"),
  port: 3000,
  watchOptions: {
    open: false
  },
  historyApiFallback: {
    index: "/"
  }
},

plugins: [
  new WebpackShellPlugin({
    onBuildEnd: [`./node_modules/.bin/cucumber-js ${testScope}`]
  })
]

启动整个事情的命令如下

webpack-dev-server --config webpack.test.js

一切都很好,但是……现在呢?它永远不会停止!当测试套件正常时,我需要一些方法以成功状态退出。否则,将导致无限部署(我使用 bitbucket 管道部署应用程序)。

有人知道在运行特定插件后退出 devServer 执行的方法吗?

标签: javascriptwebpackfrontendweb-deploymentwebpack-dev-server

解决方案


我通过创建一个 webpack 插件解决了我自己的问题并将其添加到我的配置文件中。插件代码如下。它运行我传递给它的命令并退出进程,如果命令成功则触发错误,或者如果一切正常则成功。

const spawn = require("child_process").spawn;

module.exports = class RunScriptAndExit {
  constructor(command) {
    this.command = command;
  }

  apply(compiler) {
    compiler.plugin("after-emit", (compilation, callback) => {
      const { command, args } = this.serializeScript(this.command);
      const proc = spawn(command, args, { stdio: "inherit" });
      proc.on("close", this.exit);

      callback();
    });
  }

  serializeScript(script) {
    if (typeof script === "string") {
      const [command, ...args] = script.split(" ");
      return { command, args };
    }
    const { command, args } = script;
    return { command, args };
  }

  exit(error, stdout, stderr) {
    if (error) {
      process.exit(1);
    } else {
      process.exit(0);
    }
  }
};

我将它添加到我的插件列表中,如下所示:

plugins: [
  new RunScriptAndExit(`./node_modules/.bin/cucumber-js ${testScope}`)
]

推荐阅读