Asial Blog

Recruit! Asialで一緒に働きませんか?

MonacaアプリをECMAScript6で書いてみよう

カテゴリ :
Monaca
タグ :
JavaScript
ECMAScript6

今、JavaScriptの主流はECMAScript5となっています。色々と書きづらい点も多く、そのためにCoffeeScriptやTypeScriptのような代替言語が生み出されています。書き方の他、クラスや定数などの機能が不足している感も否めません。



それを解決してくれるのがECMAScript6になります。いち早く体験するにはBabelが良いのは以前も書きましたが、今回はMonacaアプリでBabelを利用する方法を紹介します。なお、利用に際してはMonaca Localkitを前提としています。また、Node.jsは予めインストールされていることとします。



LocalKitでプロジェクトを作成する



まず最初にMonaca LocalKitを使ってプロジェクトを作成します。今回はHello World Appを使っています。作成するとこのようなファイル構成になっているかと思います。





Gulpなどをインストールする



Babelを使う際にはGulpを使ってECMAScript6から通常のJavaScriptへの変換を自動化するのがお勧めです。そこでGulpなど必要なライブラリをインストールします。まず最初にnpm initを実行しておきます。



  1. npm init

ではライブラリをインストールします。



  1. npm install --save-dev gulp gulp-babel \
  2.                        babel-preset-es2015 gulp-sourcemaps \
  3.                        gulp-concat

インストールしているライブラリを解説します。



  • gulp : Node.js用のタスクランナーです
  • gulp-babel : BabelのGulp用プラグインです
  • babel-preset-es2015 : Babelを使うことを指定します
  • gulp-sourcemaps : ECMAScript6のソースマップを生成しています
  • gulp-concat : 変換されたJavaScriptファイルを連結しています


Gulpファイルを記述する



Babelを使うための設定を行います。今回はGulpの設定もECMAScript6で書きたいと思います。そこでまず package.json に下記の設定を追加します。



  1. "babel": {
  2.    "presets": ["es2015"]
  3. }

この指定があることでGulpがデフォルトでECMAScript6の記法を理解してくれます。Babelを使う場合、ファイル名は gulpfile.babel.js になりますので注意してください。例えば次のような内容になります。



  1. import gulp       from 'gulp'
  2. import sourcemaps from 'gulp-sourcemaps';
  3. import babel      from 'gulp-babel';
  4. import concat     from 'gulp-concat';
  5.  
  6. const file_path ='./www/src/**/*.js';
  7.  
  8. gulp.task('js', () => {
  9.   return gulp.src(file_path)
  10.     .pipe(sourcemaps.init())
  11.     .pipe(babel({
  12.       presets: ['es2015']
  13.     }))
  14.     .pipe(concat('all.js'))
  15.     .pipe(sourcemaps.write('.'))
  16.     .pipe(gulp.dest('www/js'));
  17. });
  18.  
  19. gulp.task('watch', () => {
  20.   gulp.watch(file_path, ['js'])
  21. });
  22.  
  23. gulp.task('build', ['js']);
  24. gulp.task('default', ['build', 'watch']);

importが使えること、functionという記述が省略できるのがECMAScript6らしいところでしょうか。



試してみる



今回の設定の場合、www以下にsrcというフォルダを作成し、そこにJavaScriptを記述していきます。例えば次のようになります。functionの省略は先ほど同じで、クラスやテンプレートも使っています。



  1. var onDeviceReady = () => {
  2.   const hello = new Hello({name: "MOONGIFT"})
  3.   hello.say();
  4. };
  5.  
  6. class Hello {
  7.   constructor(options) {
  8.     this.options = options;
  9.   }
  10.   say() {
  11.     console.log(`Hello World, ${this.options.name}`);
  12.   }
  13. }
  14. var event = typeof cordova === 'undefined' ? 'DOMContentLoaded' : 'deviceready';
  15.  
  16. document.addEventListener(event, onDeviceReady, false);

そしてgulpコマンドを打つとwww/js/all.jsというファイルが生成されます。今後はファイルの追加、変更をウォッチしていますので気にせずプログラミングが続けられます。



後はこの生成されたファイルをHTMLから読むようにします。複数のJavaScriptファイルであっても連結されますので、この1ファイルだけ読み込めばOKです。



  1. <script src="js/all.js"></script>

実際にアプリをプレビューで開くと、コンソールに次のように表示されるはずです。ECMAScript6がJavaScriptに変換され、テンプレートメッセージも使われています。





ソースマップファイルも出力しているので、ECMAScript6側のコードでブレークポイントの挿入が可能です。








Babelを使うことでよりモダンなJavaScriptの書き方できるようになります。これまで感じていた機能不足感、書きづらさも解消されてくるでしょう。ぜひMonacaアプリでも使ってみてください。



Monaca Localkit - ローカル型HTML5ハイブリッドアプリ開発ツール