これまで長らく、v0.10系だったところを、ember-cli が v4系に対応したので、これ幸いとバージョンアップしてみた。
変更してみて良かった・気になったのはざっくり以下の点。
-
class
つかえる -
let
,const
つかえる - アロー関数もつかえる
-
require
するときのパスの指定がやや厳密になった
class つかえる
個人的にはコンストラクタと getter がうれしい。自前のモジュールはclassに書き換えてみた。
'use strict';
class Hoge {
constructor(fuga) {
this._fuga = fuga;
}
get fuga() {
return this._fuga;
}
}
module.exports = Hoge;
let, const つかえる
ブロックスコープになるのがうれしい。
ただ最初、勝手に const
を定数だと思い込んでいてはまった。
実際には定数ではなく、読み取り専用(再代入の禁止)が正解なのでオブジェクトのプロパティは変更できる。
'use strict';
const x = 1;
x = 2; // これはできない
const o = { x: 1 };
o = { x: 2 }; // これはできない
o.x = 2; // これはできる!
o.y = 10; // これもできる!
以上を踏まえて、var, let, const の使い分けは、まだどうするのがベストか考えてないものの、
現時点では、以下のルールでお試し中。
-
require
するとき:const
- 定数的扱い:
const
- それ以外:
let
-
var
は使わない
'use strict';
const hoge = require('hoge');
const FUGA_VALUE = '定数';
let piyo = 'その他';
アロー関数
var self=this;
とか .bind(this)
がいらなくなっただけで満足。
requireのパス
プロジェクト内で require('package.json');
して、package.json内の値を参照していたのだが、その部分がコケてた。
調べてみるとrequire するときのパス指定の仕様が変わっていたせいだった。
具体的にパスを指定してファイルを読むときは、/
or ./
or ../
でパスをはじめる必要がある。package.json をよみこむなら、
'use strict';
const packageJson = require('./package.json');
としないといけない。
既存プロジェクトの利用するnodeのバージョンを変更するときは要注意。だが、一度直してしまえば、より厳密な指摘が出来ることになるので、よい気がする。
require.resolve
ちなみに、これを調べる中で知ったのが、 require.resolve()
。
require.resolve('hoge')
とすると、 解決後のフルパスが取得できるので、参照がうまくいかない場合はこれで調べてみると早い。
おわり
ビルドのためだけに node.js を使っているような場合は、そんなに気にせずバージョンアップ可能だと思うので、余裕のあるときにためしてみるとメリットが見つかる…かもしれない。個人的にはメリットが多めだった。
その他の、v0.10系からv4系への変更については[yosuke_furukawa さんの記事]
(http://yosuke-furukawa.hatenablog.com/entry/2015/09/18/104452)がくわしいので、こちらをどうぞ。
また、node.js における、ES6対応状況もあわせて。