io.js可以說是徹底從NodeJS里分離出來的一條分支,其事情始末可以查看這篇報道,此處便也不贅言。既然是分支,io.js便也基本兼容NodeJS的各種API,連執行指令也依舊兼容Node的 node XXX (新指令是 iojs XXX )。不過io.js采納了最新版本的V8引擎,並也將會時刻跟進V8的更新,也因此我們可以輕松地在io.js上搶先使用那些JavaScript ECMA-262規范上的新特性。
io.js的首個版本是在13號,也就是昨天發布的,它基於3.31.71.4版本的V8引擎,良好地支持着許多NodeJS將在0.12.x才會開始支持的ES6特性。
io.js的官網是iojs.org ,從上面那行醒目的“Bringing ES6 to the Node Community!”,我們便能知道io.js相比NodeJS,會趨向於添加更多好用的新特性,並以此作為自己的主打和口號。
為何使用io.js
io.js跟NodeJS一樣,屬於事件驅動I/O的服務端平台,以Event loop機制來無阻塞地、並發處理I/O,關於當初NodeJS的作者為何選用此機制來開發Node項目,可查閱我翻譯的這篇《Hands-on Node.js》—— Why? 。總而言之,io.js/NodeJS很適合用於開發I/O密集型應用,我們參照下下方的這張流程圖:
圖中的event loop中我們假設有A、B、C三個等待執行的命令隊列,其中A和B都會在其執行的過程中觸發I/O操作(圖中右側紅色圓角矩形框,具體I/O操作可舉例為“讀取數據庫數據”)。以A觸發自身的I/O操作為例,常規的動態語言可能都會停住整個隊列,等待I/O回饋后,才結束中斷、繼續運行下去。如果遇到I/O很耗時的情況,進程就會白白等待而浪費不少時間。為了解決此問題,NodeJS采用了event loop機制,將所有I/O操作都扔到線程池去處理,從而不再阻塞命令隊列的進一步執行操作。因此從上圖可以看到,即使A觸發了自身的I/O,也不會阻塞隊列的下一個命令B的執行。
線程池的理解:通常情況下,Web 服務器會將每個傳入的 HTTP 連接與一個線程或一個進程相關聯。使用線程模型配置服務器時,通常需要配置一個線程池(設置處理傳入連接的最大線程數),如果錯誤地配置了該值,並且該值過低,那么您將遭遇線程匱乏問題;另一方面,配置過高的線程數可能導致內存不足異常。
安裝
io.js的安裝非常簡單,直接從官網首頁下載對應安裝包進行安裝即可(由於要修改系統變量,故安裝過程得讓360等殺毒軟件放行),安裝完畢便能直接在cmd命令行界面,或者從io.js程序下的“io.js command prompt”命令界面直接進行調試,比如我們可以這樣查看io.js所使用的V8引擎版本:
iojs -p process.versions.v8
執行結果:
第一個程序
我們隨便在一個地方,比如D盤根目錄下新建一個 test.js 文件,里面簡單地寫上這么兩句話就行:
var s = "hello world"; console.log(s);
然后我們從命令行上運行這個腳本(注意當前目錄路徑要轉到d盤):
iojs test.js
執行如下,輸出了"hello world":
我們可以試着寫點帶io.js API的復雜一點的程序,既然兼容NodeJS,那我們就直接拿NodeJS官網首頁的示例來試試。我們把test.js改為:
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/');
該段代碼創建了一個服務端http服務,監聽了本地的1337端口,並在命令行輸出 “Server running at http://127.0.0.1:1337/” 語句。如果有客戶端訪問http://127.0.0.1:1337/ ,則會向客戶端輸出http頭部信息以及顯示一行 “Hello World” 。
我們照樣用
iojs test.js
來執行腳本:
可以看到該io.js已進入服務端執行狀態(監聽着本地的1337端口)。這時我們可以打開瀏覽器訪問 http://127.0.0.1:1337/ ,可以看到上述輸出的信息:
第一個網頁
像我剛接觸NodeJS的時候,會蠻在意一個問題,就是如果我要制作一個站點頁面的話,總不該要我把一段段標簽都以res.write()的形式輸出到客戶端吧。答案是我們可以這么做,但肯定不會喜歡這么做。
NodeJS提供了不少實用的API,比如文件系統接口,我們可以寫一個簡單的 index.html 頁面,並把它放在D盤根目錄上:
<!doctype html> <html> <head> <meta charset="utf-8"> <title>io.js</title> </head> <body> 這是你的首個站點頁面 </body> </html>
然后把我們的 test.js 更改為:
var http = require('http'), fs = require('fs'); fs.readFile('./index.html', function(err,html){ if (err) { throw err; } http.createServer(function(req,res) { res.writeHeader(200,{"Content-Type": "text/html"}); res.end(html); }).listen(1337); });
接着繼續執行指令
iojs test.js
然后在瀏覽器訪問 http://127.0.0.1:1337/ 便能成功查閱該頁面:
當然上述的方法只是一個粗糙的示例(也未使用文件流),實際上在很多項目上我們還使用了各種實用的開發框架(如Express、Koa...),使用它們來加載頁面視圖,會是一種蠻有趣的事情,不過這是以后要介紹的東西了。
如果對於上面示例的代碼,你並不能完全看懂或掌握,倒是沒關系,本章僅僅是開篇,讓你知道下io.js是怎么一回事(實際上它也沒那么神秘或復雜),如果你是一名前端開發者,那么相信你會很快掌握io.js,因為它基本都由javascript來書寫的(當然你得掌握下commonJS的寫法)。
本章就到這里,下章我們將介紹下io.js上支持的那些有趣的ES6特性。共勉~