Node.js を使用した Play および Scala アプリケーションの JavaScript 最適化の実行
最終更新日 2024年05月30日(木)
Table of Contents
多くの sbt プラグインは、JavaScript エンジンを必要とする操作を実行します。たとえば、sbt-rjs プラグインは RequireJs 最適化を実行し、sbt-uglify プラグインは UglifyJS 最適化を実行します。デフォルトでは、これらのプラグインは JVM の内部で JavaScript を実行する Trireme を使用します。Trireme エンジンは、小さな操作には十分である可能性がありますが、多数のファイルを操作するとパフォーマンスが低下する場合があります。
これらのプラグインのパフォーマンスを向上させるには、ネイティブな Node.js エンジンの使用が必要になることがあります。JavaScript の手順中にビルドプロセスがいつまでもハングアップすることに気付いた場合は、エンジンを変更する必要がある可能性があります。この記事では、Node.js をインストールするようにプロジェクトを設定し、それを使用して Play または Scala プロジェクトの JavaScript 最適化を実行する方法について学習します。
複数の buildpack の使用
Heroku で Scala と共に Node.js を使用するには、Scala buildpack と Node.js buildpack の両方を使用するようにプロジェクトを設定する必要があります。これは heroku buildpacks
コマンドで行います。
まず、次を実行して、Node.js buildpack と Scala buildpack をアプリケーションに追加します。
$ heroku buildpacks:clear
$ heroku buildpacks:add heroku/nodejs
$ heroku buildpacks:add heroku/scala
続いて、次のコマンドを実行して実行順序を確認します。
$ heroku buildpacks
=== nameless-brushlands-4859 Buildpack
1. heroku/nodejs
2. heroku/scala
これにより、Heroku は確実に最初に Node.js buildpack を、2 番目に Scala buildpack を実行するようになります。
Node.js buildpack を実行するには、プロジェクトに package.json
ファイルが存在することも必要です。このファイルでは、インストールする Node.js のバージョンを定義できます。プロジェクトのルートに package.json
ファイルを作成し、その中に次のコードを記述します。
{ "engines": { "node": "4.0.0" } }
また、これを空 ({}
のみ) のままにして、常に最新バージョンを選択することもできます。
その後、次のコマンドを実行して、このファイルを Git リポジトリに追加します。
$ git add package.json
$ git commit -m "Added package.json"
最後に、SBT_OPTS を次のように設定して、Node.js エンジンを使用するように sbt を設定します。
$ heroku config:set SBT_OPTS="-Dsbt.jse.engineType=Node"
これでデプロイできます。次のコマンドを実行してください。
$ git push heroku master
[master 6d8842c] redeploy
Counting objects: 1, done.
Writing objects: 100% (1/1), 184 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Fetching custom git buildpack... done
remote: -----> Node.js app detected
remote:
remote: -----> Reading application state
remote: package.json...
remote: build directory...
remote: cache directory...
remote: environment variables...
remote:
remote: Node engine: unspecified
remote: Npm engine: unspecified
remote: Start mechanism: Procfile
remote: node_modules source: package.json
remote: node_modules cached: false
...
remote: -----> Fetching custom git buildpack... done
remote: -----> Play 2.x - Scala app detected
remote: -----> Installing OpenJDK 1.8... done
remote: -----> Priming Ivy cache (Scala-2.11, Play-2.3)... done
remote: -----> Running: sbt update
...
remote: [info] Done packaging.
remote: [success] Total time: 4 s, completed Jan 29, 2015 2:51:10 PM
remote: -----> Dropping ivy cache from the slug
remote: -----> Dropping sbt boot dir from the slug
remote: -----> Dropping compilation artifacts from the slug
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing... done, 98.8MB
remote: -----> Launching... done, v6
remote: https://play-node-test-1234567890ab.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/play-node-test.git
99109c2..6d8842c master -> master
デプロイプロセスが実行されると、Heroku によって Node.js がインストールされます (これにより、無視できるいくつかの警告が生成されますが、これらは最小限の package.json
ファイルが原因です)。実行された sbt プロセスは Node.js エンジンを使用します。
sbt JavaScript エンジンの設定についての詳細は、sbt-js-engine のドキュメントを参照してください。Heroku での Scala の使用についての詳細は、Scala サポートのための DevCenter ドキュメントを参照してください。