6

コンパイラとしてbabelを使用してES2015コードを使用するjavascript CLIアプリを開発しました。(babel-require フック)

アプリはローカルで完全に動作しますが、npm で公開すると動作しなくなります (babel は ES2015 ファイルをコンパイルしていないようです)

設定:

サンプル./bootstrap.js(ES5):

require('babel-register');
require('./src/app.js');

サンプル./src/app.js(ES2015):

import package from 'package';
...

サンプル./bin/myapp:

#!/usr/bin/env node
require('../bootstrap.js');

ローカルで実行すると動作します:

appdir$ ./bin/myapp
I'm running fine!
appdir$

(npm のインストール後に) グローバルに実行すると、次のように壊れます。

$ sudo npm install -g myapp
└── myapp@0.1.0
$ myapp
/usr/local/lib/node_modules/myapp/src/app.js:1
(function (exports, require, module, __filename, __dirname) { import package from 'package';
                                                              ^^^^^^

SyntaxError: Unexpected token import
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:404:25)
    at Module._extensions..js (module.js:432:10)
    at Object.require.extensions.(anonymous function) [as .js] (/usr/local/lib/node_modules/myapp/node_modules/babel-register/lib/node.js:138:7)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:313:12)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)
    at Object.<anonymous> (/usr/local/lib/node_modules/myapp/server.js:9:12)
    at Module._compile (module.js:425:26)   

バージョン:

    ├─┬ babel-register@6.4.3
    │ │ ├─┬ babel-core@6.4.5
    │ │ │ ├─┬ babel-code-frame@6.3.13
    │ │ │ ├─┬ babel-generator@6.4.5
    │ │ │ ├── babel-helpers@6.4.5
    │ │ ├── babel-runtime@5.8.35

私が試したこと:

  • コンパイルが有効になることを期待ignore: falseしてファイルに追加する.babelrc
  • .babelrcファイルの代わりにrequireフック引数でオプションを使用する

運が悪い:/

4

1 に答える 1

12

わかりました、私は問題が何であるかを理解しました。コンパイルの実行を妨げる何かがあると考えて、私は正しい軌道に乗っていました。

TL;DR

babel-registerhook はファイルからオプションを取得しませんが、引数から取得ignoreします。only.babelrc

の修正./bootstrap.js:

require('babel-register')({
  ignore: [],
  only: [/src/],
});
require('./src/app.js');
  • スイッチは、パスが一致するファイルのignore無視を無効にします。これは、すべてのグローバル モジュールの場合です。node_modules
  • このスイッチは、プロジェクトディレクトリonlyのファイルのコンパイルを有効にします。src

さて、興味があれば、問題を解決するために私が取った手順について説明します。

トラブルシューティングのストーリー:

  • node-debugまず、コマンドライン ツールをインストールする必要がありました

    $ sudo npm install -g node-inspector
    
  • 次に、それを使用してアプリを起動します(--debug-brkスイッチは最初の行で実行を停止するように求めます)

    $ node-debug --debug-brk myapp
    
  • によって提供されたローカル URL でブラウザを開くnode-debugと、アプリコードが表示されます。

  • require('./scr/app.js');ステートメントのすぐ上の行にブレークポイントを配置します
  • 「再生」をクリックして、その行までプロセスの実行を続行します
  • ここで、「ステップ オーバー」ボタンと「ステップ イン」ボタンを使用してエラー トレースを登るという面倒な作業が始まります。次のステートメントがエラー トレースの「外側」にある場合 (上記の質問を参照)、「ステップ オーバー」できます。 . 次のステートメントがトレースの機能の 1 つである場合は、「ステップ イン」します。
  • 次に、「スコープ変数」ウォッチを見て、Object.require.extensionメソッド内、ファイル内babel-register/lib/node.jsで、定義したかったにもかかわらず、変数ignoreonly変数がであることに気付きました!undefined
  • 同じファイルのメソッドに足を踏み入れたところ、shouldIgnore私の懸念が確認されました。この関数node_modulesはパス内をチェックし、一致する場合は (ファイルを無視して)!ignore && !only返します。trueこれが最終的に、私の ES2015 ファイルがコンパイルされない原因です。

    babel-register/lib/node.js:120:
    function shouldIgnore(filename) {
      if (!ignore && !only) {  // here `ignore` and `only` were null, despite .babelrc values
        return getRelativePath(filename).split(_path2["default"].sep).indexOf("node_modules") >= 0;
      } else {
        return _babelCore.util.shouldIgnore(filename, ignore || [], only);
      }
    }
    
  • babe-register次に、これらのスイッチを引数で直接指定する必要があると推測しました。

于 2016-01-31T23:20:45.970 に答える