ECMAScript6 on Node.js 環境

只是剛好想要研究一下 generator,才發現自己的環境不太ok。因為我的 node 環境只有 v0.10.x,沒有支援 generator。


如果想要讓 node 的環境支援更多的 ECMAScript6 的 Feature,建議更新到 v0.11.x 的版本,會支援更多,只不過 v0.11.X 的版本是 unstable,如果心臟不夠大顆,不敢亂升級版本,建議用 nvm 跑其他/切換 node 的版本。

版本你可以查看 http://blog.nodejs.org/release/


以我目前的 node 的版本是 0.10.13 來說:
$ node -v
v0.10.13



你可以透過以下指令,看一下 node 的 --v8-options 設定, 用 grep 抓出關鍵字是 harmony (ES6 的代號) 的設定有哪些,以下就是我目前 node 版本 (v.10.13) 支援的 ES6 feature 有哪些:
$ node --v8-options | grep harm
  --harmony_typeof (enable harmony semantics for typeof)
  --harmony_scoping (enable harmony block scoping)
  --harmony_modules (enable harmony modules (implies block scoping))
  --harmony_proxies (enable harmony proxies)
  --harmony_collections (enable harmony collections (sets, maps, and weak maps))
  --harmony (enable all harmony features (except typeof))


恩,結論就是,由於我接下來想要玩 ES6 的 generator,但是我的 node 版本並沒有支援到 ES6 的 generator,( 如果有支援的話,你應該會出現這一行: --harmony_generators (enable harmony generators) )。



安裝 v.0.11.x 版的 node.js
安裝的話,我是使用 nvm 來安裝,使用版本是 v.0.11.12,裝完之後,預設就會使用 v0.11.12了。
$ nvm install v0.11.12
#######################################     96.9%


Now using node v0.11.12


切換完成後,再次查看 v8 option 的 ES6 有哪些:
$ node --v8-options | grep harm
  --harmony_typeof (enable harmony semantics for typeof)
  --harmony_scoping (enable harmony block scoping)
  --harmony_modules (enable harmony modules (implies block scoping))
  --harmony_symbols (enable harmony symbols (a.k.a. private names))
  --harmony_proxies (enable harmony proxies)
  --harmony_collections (enable harmony collections (sets, maps, and weak maps))
  --harmony_observation (enable harmony object observation (implies harmony collections)
  --harmony_generators (enable harmony generators)
  --harmony_iteration (enable harmony iteration (for-of))
  --harmony_numeric_literals (enable harmony numeric literals (0o77, 0b11))
  --harmony_strings (enable harmony string)
  --harmony_arrays (enable harmony arrays)
  --harmony_maths (enable harmony math functions)

  --harmony (enable all harmony features (except typeof))

是不是很開心,已經看到 harmony_generators 的 enable 了。

但是有個問題是,
若你要執行一段有用 generator 的 JavaScript,
不能直接 node 該檔案去執行,
執行後 node 會連 * 都認不得。

比方說我有個 AAA.js,內容如下:
function* foo(x) {
       x=x*2;
       yield x;
}

var a = foo(2);

console.log(a.next());

如果你直接去 node AAA.js 會出現這些 warning:
 $ node AAA.js
AAA.js:3
function* foo(x) {
        ^
SyntaxError: Unexpected token *
    at exports.runInThisContext (vm.js:69:16)
    at Module._compile (module.js:432:25)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:349:32)
    at Function.Module._load (module.js:305:12)
    at Function.Module.runMain (module.js:490:10)
    at startup (node.js:124:16)
    at node.js:803:3

原因是必須要用 es6 的方式執行 (帶 -harmony 參數 ):
$ node --harmony AAA.js

這樣就可以得到你要的結果:
$ node --harmony AAA.js

{ value: 4, done: false }



Q: 有沒有什麼辦法可以不用每次都帶上 --harmony 去執行 ES6 的 javascript?
A: 有,寫到 bashrc 檔 xdd



參考:





留言

這個網誌中的熱門文章

[Android] 筆記 手機上測試自己的 APP

解決fatal: Not a git repository (or any of the parent directories): .git錯誤

[Android 筆記] 設定 ImageView 的圖檔來源