【问题标题】:How to use npm scripts within javascript如何在 javascript 中使用 npm 脚本
【发布时间】:2016-11-12 07:41:07
【问题描述】:

我需要一个完整的指南或很好的参考资料来解决在 javascript 文件中运行模块命令的问题。

说我经常跑步:

$ npm run webpack-dev-server --progress --colors -- files

如何在 javascript 文件中运行它并使用

$ node ./script.js

script.js

var webpackDevServer = require('webpack-dev-server');

// need help here
var result = webpackDevServer.execute({
  progress: true,
  colors: true,
}, files);

【问题讨论】:

    标签: javascript node.js terminal npm


    【解决方案1】:

    接受的答案在 Windows 上不起作用并且不处理退出代码,所以这里有一个功能齐全且更简洁的版本。

    const spawn = require('child_process').spawn
    const path = require('path')
    
    function webpackDevServer() {
        return new Promise((resolve, reject) => {
            let child = spawn(
                path.resolve('./node_modules/.bin/webpack-dev-server'),
                [ '--progress', '--colors' ],
                { shell: true, stdio: 'inherit' }
            )
            
            child.on('error', reject)
            child.on('exit', (code) => code === 0 ? resolve() : reject(code))
        })
    }
    

    path.resolve() 正确格式化脚本的路径,与主机操作系统无关。

    spawn() 的最后一个参数做了两件事。 shell: true 使用 shell,如果需要,它会在 Windows 上附加 .cmdstdio: 'inherit' 通过 stdout 和 stderr,所以你不必自己做。

    此外,退出代码也很重要,尤其是在运行 linter 等时,因此 0 以外的任何内容都会被拒绝,就像在 shell 脚本中一样。

    最后,当命令执行失败时会发生error 事件。不幸的是,在使用 shell 时,错误总是为空(undefined)。

    【讨论】:

      【解决方案2】:

      回答

      我为我的 Webpack 包做了类似的事情。您可以简单地使用child_process.spawn 执行命令行程序并在节点脚本中处理进程。

      这是一个例子:

      var spawn = require('child_process').spawn
      
      // ...
      
      // Notice how your arguments are in an array of strings
      var child = spawn('./node_modules/.bin/webpack-dev-server', [
          '--progress',
          '--colors',
          '<YOUR ENTRY FILE>'
      ]);
      
      child.stdout.on('data', function (data) {
          process.stdout.write(data);
      });
      
      child.stderr.on('data', function (data) {
          process.stdout.write(data);
      });
      
      child.on('exit', function (data) {
          process.stdout.write('I\'m done!');
      });
      

      You can handle all of the events you like. 这是一个相当强大的模块,它允许您查看进程的 PID (child.pid),甚至可以在您选择时终止进程 (child.kill())。


      附录

      一个巧妙的技巧是将所有内容都放入Promise。这是我的script.js 版本的简化示例:

      module.exports = function () {
          return new Promise(function (resolve, reject) {
              var child = spawn('./node_modules/.bin/webpack', [
                  '-d'
              ]);
      
              child.stdout.on('data', function (data) {
                  process.stdout.write(data);
              });
      
              child.on('error', function (data) {
                  reject('Webpack errored!');
              });
      
              child.on('exit', function () {
                  resolve('Webpack completed successfully');
              });
          });
      }
      

      使用此方法,您可以将您的script.js 包含在其他文件中,并使此代码在您的构建系统或其他文件中同步。无限可能!


      编辑 child_process.exec 还允许您执行命令行程序:

      var exec = require('child_process').exec
      
      // ...
      
      var child = exec('webpack-dev-server --progress --colors <YOUR ENTRY FILES>',
        function(err, stdout, stderr) {
          if (err) throw err;
          else console.log(stdout);
      });
      

      【讨论】:

      • 太棒了,有没有我可以在不产生的情况下做到这一点?
      • @user2167582 是的!您可以使用child_process.exec 查看我的编辑。
      【解决方案3】:

      你需要它是 webpack-dev-server 吗?有一个等效的 webpack-dev-middleware 可以在 node/express 中运行:

      'use strict';
      let express = require('express');
      let app = new express();
      
      app.use(express.static(`${__dirname}/public`));
      
      let webpackMiddleware = require('webpack-dev-middleware');
      let webpack = require('webpack');
      let webpackConfig = require('./webpack.config.js');
      app.use(webpackMiddleware(webpack(webpackConfig), {}));
      
      app.listen(3000, () => console.log(`Server running on port 3000...`));
      

      https://github.com/webpack/webpack-dev-middleware

      【讨论】:

      • 我试图解决的问题与 webpack 关系不大,但与在 javascript 文件中运行 npm 模块的方式有关,这样我就可以通过 node ./myscript.js 调用组合宏命令
      猜你喜欢
      • 2019-09-06
      • 2020-01-22
      • 2021-12-24
      • 2015-08-17
      • 2021-11-12
      • 2021-11-10
      • 1970-01-01
      • 2018-07-14
      • 2016-08-18
      相关资源
      最近更新 更多