如何在javascript中使用npm脚本

时间:2016-07-10 04:39:46

标签: javascript node.js terminal npm

我需要一个完整的指南或一个很好的参考资料来解决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);

3 个答案:

答案 0 :(得分:12)

答案

我为我的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.这是一个相当强大的模块,可让您查看过程&#39; 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);
});

答案 1 :(得分:0)

你需要它是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

答案 2 :(得分:0)

接受的答案在 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 上附加 .cmd,如有必要,stdio: 'inherit' 会通过 stdout 和 stderr,因此您不必自己动手。

此外,退出代码也很重要,尤其是在运行 linter 和诸如此类的东西时,所以除了 0 之外的任何东西都会被拒绝,就像在 shell 脚本中一样。

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