1

私のアプリケーションは同形の JavaScript で構築されており、Gulpタスクを使用して新しいインスタンスで Node.js サーバーを実行し、ファイルの変更をリッスンしてサーバーを再起動し、ブラウザーをリロードします ( Browsersyncを使用)。

Babelを使用して、ECMAScript 6 でサーバー側のコードとクライアント側のコードを記述したいと考えています。Babel ポリフィルを避けてnode_modules/.bin/babel-core.cmd server.js代わりにコマンドを使用したいのですがchild_process.fork()、実行可能ファイルのみを許可します。

let child = cp.fork('server.js', [], {
  execPath: path.normalize('node_modules/.bin/babel-node.cmd'),
  env: _.assign({NODE_ENV: 'development'}, process.env)
});

このスクリプトは機能せず、意図したとおり、次のエラーがスローされます。

child_process.js:588
  p.open(fd);
    ^
Error: EINVAL, invalid argument
    at Error (native)
    at Object.exports._forkChild (child_process.js:588:5)
    at Function.startup.processChannel (node.js:704:10)
    at startup (node.js:59:15)
    at node.js:814:3

child_process.fork()このケースに使いたい。child_process.spawn()実際、2 つの Node.js プロセス間に直接通信がないため、ここでは機能しません。そして、私はイベントからアクションを実行するのを聞いています:

// server.js

server.listen(port, function() {
  if (process.send) {
    process.send('online');
  } else {
    ...
  }
});

// gulpfile.babel.js

child.on('message', (message) => {
  if (message.match(/^online$/)) {
    if (browserSyncServer) {
      browserSyncServer.reload();
    }

    if (!started) {
      started = true;

      gulp.watch(config.serverScripts, () => {
        plugins.util.log('Restarting development server.');

        server.kill('SIGTERM');
        server = startup();
      });

      cb();
    }
  }
});

これに関する回避策はありますか?または、サーバー側のコードで直接 Babel ポリフィルを使用する必要がありますか?

4

2 に答える 2

3

オプションを使用して、ノード プロセスを生成するために使用するコマンドを変更できexecPathます。

たとえば、babel-nodeの代わりに を使用してノード サーバーを生成する場合は、次のようにnode入力します。

process.fork('/path/to/server.js', { execPath: "babel-node" }, function(error, stdout, stderr) {
  console.log('stdout: ' + stdout);
  console.log('stderr: ' + stderr);

  if (error !== null) {
    console.log('exec error: ' + error);
  }
});
于 2015-08-13T22:57:23.110 に答える
0

私はこの問題を抱えていました。この問題で私はモカで開き、問題を解決できました。

実行babel-node node_modules/mocha/bin/_mocha test.jsすると、デフォルトでコンパイラが子プロセスに適用され、execPath.

PS:mochaを withで実行したら、orbabel-nodeを渡す必要はありません。--require--compilers

于 2016-10-06T12:37:30.573 に答える