只是剛好想要研究一下 generator,才發現自己的環境不太ok。因為我的 node 環境只有 v0.10.x,沒有支援 generator。
安裝 v.0.11.x 版的 node.js
安裝的話,我是使用 nvm 來安裝,使用版本是 v.0.11.12,裝完之後,預設就會使用 v0.11.12了。
如果你直接去 node AAA.js 會出現這些 warning:
如果想要讓 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
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))
--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 會連 * 都認不得。
若你要執行一段有用 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
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
參考:
- http://h3manth.com/new/blog/2013/es6-on-nodejs/
- generators in v8
- http://addyosmani.com/blog/tracking-es6-support/
沒有留言:
張貼留言
若你看的文章,時間太久遠的問題就別問了,因為我應該也忘了... XD