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


87

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

ES6をノードで実行するために必要な他のオプションではbabel-node server なく 、本番node server 環境でこれを実行できますか?

これが私がビルドのために実行していて開発を開始するコマンドです

// 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"

回答:


114

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


サーバーサイドコードの場合babel-cliを使用して通常のビルドを実行します

http://babeljs.io/docs/setup/#babel_registerによると、本番環境での使用を目的としたものbabel-registerはありません—単純なケースでは、requireフックが主に推奨されます。

Babel6 +用

Babel 6の時点では、デフォルトでは変換は含まれていません。それでは、babel-cliとをインストールすることから始めましょうbabel-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によって変換されます。ポリフィルはまた、自動的に必要です。

ソースファイルをES6に保持しながら、次を使用して実行することができます。 node server.js


あなたのコメントによると、あなたは少し問題を抱えているようです。上記の黄色で強調表示されている部分に特に注意してください。最初のファイルは、ノード自体によって実行されるES5のみにすることができます。その後のすべての要件は、バベルによって変換されます...

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

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

9
実際require("babel/register");、server.jsを入れてこれを試したところ、実行するnode server.jsとエラーが発生しました。 Unexpected reserved word: import ... そのため、機能していないようです
svnm 2015年

1
@steveniseki私のアップデートは、物事を立ち上げて実行する方法を示す必要があります。
ありがとうございます

素晴らしい、ありがとうございました。実際にそうなると思い、server.jsをすべてES5で作成しようとしましたが、うまくいかなかったようです。とにかく、このソリューションは実際にはアプリをapp.jsにプッシュする方がはるかに優れています。 、そしてそれは完璧に機能しました。ありがとう
svnm 2015年

node server.js :)でこのように機能するサンプルプロジェクトは、この例を見たい人がいればここにあります。これは、実際のサイトで使用する、react router、babel、altを使用した例です。
svnm 2015年

4
その間、require( "babel-register");に変更されました。...とにかく私は..「予期しないトークンのインポート」を取得
smotru

54

このトピックに関するブログ投稿を書いばかりです

BabeljsCLIのドキュメントは次のように警告しています。

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"
},

詳細については、ブログ投稿をご覧ください。


3
Node 4.0はES6をサポートしているので、コードをコンパイルするためにbabelを使用する必要がありますか?
lvarayut 2015年

8
@LVarayutはい、機能によっては、サーバー側でbabelが必要です。Node v4.0.0は、すべてのES6機能(特にインポート/エクスポート構文を介したモジュール)をサポートしているわけではありません。トピックの詳細については、nodejs.org / en / docs / es6を参照するか、node --v8-options |と入力してください。ターミナルで「進行中」のgrepを使用して、まだ実装されていないES6機能のリストを取得します。
jbmusso 2015年

@jbmussoすばらしい説明をありがとう:)
lvarayut 2015年

14
BabelはES6だけでなく、ESNextにも対応しています。したがって、TC39仕様に落ち着くとすぐに、ES7および最新の機能が継続的に追加されます。
cuadraman 2015年

15

本番環境で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日にモジュールのサポートをリリースしました。数か月以内にノードでモジュールのサポートがフラグの下に表示され、Babelmootを使用する理由が明らかになることを願っています。


8

@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またはそのヘルパーモジュールをグローバルにインストールする必要はありません!かなり気の利いた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.