web-dev-qa-db-ja.com

本番環境でbabel-nodeを使用しても大丈夫ですか

ES6構文をサポートするために、babel-nodeおよびbrowserifyとbabelifyトランスフォームを使用してサイトを開発しています。

私はただこれを実稼働で実行できますか? babel-node server のではなく node server ノードでES6を実行するには、他にどのようなオプションが必要ですか?

ビルドのために実行し、開発を開始するコマンドは次のとおりです

// npm run build
browserify -t [babelify] client.js > public/js/bundle.js",

// npm start
babel-node server.js"

ここに私の開発依存関係があります

"babel": "^4.0.1",
"babelify": "^5.0.3",
"browserify": "^8.0.3"
81
svnm

クライアント側のコードについては、あなたは正しいことをしています。 babelifyそれをクライアントに出荷します。


サーバーサイドコードでは、 babel-cli を使用して通常のビルドを行うだけです

http://babeljs.io/docs/setup/#babel_register によると、babel-register本番用ではありません— requireフックは、単純な場合に主に推奨されます。

バベル6+

Babel 6では、デフォルトで変換は含まれていません。それでは、babel-clibabel-preset-es2015をインストールすることから始めましょう。

$ npm install --save-dev babel-cli babel-preset-es2015

変換を.babelrcファイルに追加します—これは上記でダウンロードしたperstモジュールです。 プリセットの完全なリスト を見て、最適なものを確認してください。

{
  "presets": ["es2015"]
}

buildスクリプトをpackage.jsonに追加します。以下のsrcは入力ファイルで、buildは変換された出力ファイルです

"scripts": {
  "build": "babel src -d build"
}

それからビルドしてください!

$ npm run build

次に、コードを実行します。この時点で、buildディレクトリ内のファイルを実行する必要があります。

$ npm start

babel <= 5の場合は、requireフックを使用します。

require("babel/register");

拡張子。es6。esを持つノードに必要な後続のすべてのファイル、。jsxおよび。jsはBabelによって変換されます。 polyfill も自動的に必要です。

ES6でソースファイルを保持できますが、node server.jsを使用してそれらを実行できます。


あなたのコメントによると、あなたは少し問題を抱えているようです。上記の黄色のハイライト部分に特に注意してください。最初のファイルは、ノード自体で実行されるES5のみです。すべての後続のrequireはBabelによって変換されます...

典型的なセットアップは次のようになります

server.js

// only ES5 is allowed in this file
require("babel/register");

// other babel configuration, if necessary

// load your app
var app = require("./app.js");

app.js

// this file will be loaded through babel
// you can now use ES6 here and in every other include

起動してください!

$ node server.js
109
user633183

このトピックに関するブログ投稿

Babeljs CLI documentation は以下を警告します:

本番用ではないbabel-node

本番環境でbabel-nodeを使用しないでください。キャッシュはメモリに格納されるため、メモリの使用量が多く、不必要に重いです。また、アプリ全体をオンザフライでコンパイルする必要があるため、起動時のパフォーマンスが常に低下します。

これは、アプリケーションをbabel-nodeではなくnodeで実行するようにnpmスクリプトを設定する方法の例です。

"scripts": {
  "clean": "rm -rf build && mkdir build",
  "build-css": "node-sass scss/app.scss public/css/app.css",
  "build-server": "babel -d ./build ./server -s",
  "build": "npm run clean && npm run build-css && npm run build-server",
  "lint": "eslint source/ --quiet",
  "start": "node ./build/index.js",
  "debug": "node --debug ./build/index.js",
  "test": "for i in $(ls tests/); do babel-node \"./tests/${i}\" | faucet ; done",
  "validate": "npm run lint; npm run test && npm outdated --depth 0"
},

ブログ投稿 で詳細を見つけることができます

53
cuadraman

本番環境でbabel-nodeを使用する場合の長所と短所を比較検討することが重要です。

  • babel-nodeは、市販のハードウェアで、起動コストに0.5秒から1秒を追加します。しかし、アプリが長時間実行されるサーバーである場合、その起動コストはそれほど重要ではありません。
  • 余分なメモリ消費を測定してみてください。たとえば、私のアプリ(時系列データの読み取りと処理)の場合、わずか20MBでした。状況に応じて、これは重要な場合と重要でない場合があります。

一方、

  • babel-nodeを直接使用すると、開発が簡単になります。「ビルド」スクリプトは必要なく、src/libおよびdistディレクトリを個別に作成する必要もありません。
  • ローカルファイルからimportする場合、src/myutilsからインポートするか、lib/myutilsからインポートしますか? babel-nodeを使用すると、その問題が解消されます。

モジュールのサポートにのみBabelを使用します。 V8は2017年1月10日に モジュールのサポート をリリースしました。数か月以内にNodeのフラグの下にモジュールサポートが表示され、Babel mootを使用する理由がわかります。 。

13
Dan Dascalescu

@cuadramanの答えは@naomikよりも正確です。

簡単に質問に答えるには、いいえ、babel-nodeを明示的に呼び出すべきではありません。 babel-nodeは、babel-cliによって消費されるプライベートライブラリです。

公式チュートリアルには、ブラウザ側ではなくノードで起動して実行するために必要なものがすべて含まれています: https://github.com/babel/example-node-server 。それを読んで!さまざまな方法を使用した非常に多くの誤解を招くブログチュートリアルを見つけたので、この記事が最もわかりやすいと感じました。

ボーナス:多くの人が思うこととは逆に、すべてのトランスパイルマジックをローカルにインストールできます(npm install --save-dev babel-cli nodemon babel-preset-es2015 babel-preset-stage-2を使用)。 Babelまたはそのヘルパーモジュールをグローバルにインストールする必要はありません!かなり気の利いた。

7
williamle8300