凌晨三點,當啓動控制檯(console)的時候,手已經按在鍵盤上了。黑色背景上出現了扎眼的提示,渴求接收命令。想折騰下node.js?node,js有一個使人興奮的消息:它能夠在任何地方運行。這一點讓棧有了多種不一樣的嘗試方式。對任何一個經驗豐富的人,使用命令行來運行都充滿了樂趣。我最喜歡的是能夠在命令行的安全網絡中審閱棧。牛逼的是咱們仍然在說javascript,因此大家中的大部分不會有任何問題。那麼,爲何不開始在console裏啓動node呢?javascript
本文中,我會向你介紹Node.js。個人目標是在一些有難度的地方能看下出彩的部分。本文是一篇概述留存在console裏的棧的媒介。若是你想看看適合新手的Node.js指南,不妨看看SitePoint的優質課程Node.js:An Introduction.html
在咱們開始前,先看看讓Node.js鶴立雞羣的」花邊「新聞:java
你可能已經從不少地方知道以上幾點了,可是這些究竟是什麼意思呢?你能夠將Node.js看做是一個爲javascript提供了大量API的引擎。在傳統的同步編程方式中,當你有一個I/O操做時,API在運行下一條指令前會處於等待狀態。I/O操做就是,舉個例子,讀取文件或發出一個網絡請求。Node.js不一樣,它從設計之初就是爲了異步操做。在當下的編程環境,這一點有巨大的優點。你還能想起你最後一次由於一個更快的單核處理器而換電腦是何時嗎?處理器的數量和更快的硬盤更加劇要。node
接下來的文章中,當你看到>這個提示標誌時,意味着須要按enter並輸入下一條指令。此外,在運行本文中的代碼時,你須要開啓CLI,並執行指令node(注:須要先下載並安裝node.js),說着就開始吧!web
首先輸入下列函數:編程
對網絡新手,JavaScript中的callback可能很陌生。這看起來並非一個典型的OOP方法。在JavaScript中,函數(function)是一個對象,對象能夠接受其它對象做爲參數。JavaScript並不在意對象是什麼,因此一個函數能夠接受另外一個是函數的對象。數字參數數量,在回調函數中經過add()由兩個變爲一個。回調系統至關的強大,由於它支持封裝並將現實封裝隱藏。在Node.js中,你會發現有許多APIs將一個回調做爲參數。能夠把回調想象成是一個表明。程序隱藏在裏面,而這個表明就是經受權被派遣代替別人的人。因此回調像是派一我的來完成差事。給一系列參數,就像列出一個購物單,而後他們就本身去完成任務了。api
爲了玩轉add():瀏覽器
多嘗試一些回調的新奇玩法吧。它是Node.js中一些重要API的基礎。安全
經過回調,咱們能夠開始編寫一些異步API了,舉個栗子(其實這個季節彷佛沒有栗子能夠舉):服務器
這個特例中有一個同步操做,可是對於JavaScript中的異步操做,咱們已經萬事俱備了。asyncCallback,能夠在一些線程中被延遲:
我用了setTimeout在當前線程中延遲操做。timeout並無給定時間,因此我使用Math.random()來設一個變化的時間。取名爲doSomething,而後用console.log(‘test’)來顯示被延後的操做。在1~2秒鐘後,就能夠在屏幕上看懂啊彈出的消息了。我舉例的異步回調是不可預測的。Node.js將其放在時間表裏,繼續前面的進程。時間到了後,Node,js恰好運行到這個異步操做的時間,而後調用這個回調。因此你必須腦中明晰各類回調以更好的理解Node.js。
一句話,在JavaScript中,回調並不老是它看起來的樣子。
讓咱們作一些更有趣的事(原諒我沒發現哪裏有趣)。不如試試在Node.js中查找DNS?
這個回調返回err,address,family三個對象,重點是返回值被看成參數傳遞給回調。因此這個傳統的像var result= fn('bing.com')不太同樣。在Node.js中,必須經過回調和異步來得到整體概況。你能夠去看看[DNS Node.js API][2]瞭解更多細節。下圖是我控制檯裏DNS lookup的樣子:
如今繼續,在Node,js中怎麼執行文件寫入寫出呢?想象這個場景:你打開一個文件,讀取文件內容而後寫入新的內容。在現代工藝的電腦上I/O-bound(天,我徹底不知道這怎麼翻譯,知道的私信我,我改)操做很慢。CPU處理速度很快,RAM也很快。可是,硬盤的讀取或寫入速度很慢。所以當程序同步執行I/O-bound操做時,運行的很慢。替代方法是採用異步,好比:
由於操做是異步的,所以你會先看到「writing file...."而後看到文件被保存。回調函數最普通的使用方式十分適合這個API。你能夠看看文檔[file System API][6]這部分。讀取文件又是怎樣作呢?你能經過前例猜猜麼?給你一點小提示,回調參數是err和data.我建議你試試。
答案:
你也能夠傳入一個encoding項來讀取文件中utf-8內容:
Node.js回調函數的異步I/O操做看起來很完美。
那麼在Web服務器上會怎樣呢?任何一個優秀的Exposé(MacOS上的多窗口管理工具?)都必須運行一個Web服務端。假設有一個叫作creatServer的API,這個API有一個參數是request和response的回調。你能夠在文檔中看看HTTP API。你能想到是什麼樣子嗎?你須要Http模塊。去console裏試試吧。
答案:
細想一下web,它是一個帶有請求和響應模塊的客戶端-服務器。Node.js有一個來自客戶端的request對象和一個來自服務器的response對象。所以棧經過簡單的回調原理解決web難題。還記得它是異步的嗎?我但願你能把零散的回憶綜合一下,若是你看了API文檔,咱們如今作的很那個差很少。咱們載入一個模塊,告訴它要作什麼並給它一個參數。回調就會像一個表明那樣工做:執行一個有一系列參數的特殊任務。
固然,若是咱們不能在瀏覽器中看到它,那麼一切都是無心義的。在CLI中添加:
而後將你最愛的瀏覽器指定爲:localhost:8080,我用的是Edge。
假設requset對象有一堆可獲取的信息。爲了從新連上server,先將其關閉(bring it down):
將瀏覽器指定爲:localhost:8081.header提供給你來自瀏覽器的user-agent信息。咱們能夠遍歷header對象:
此次 將瀏覽器指定爲:localhost:8082。一旦完成以後,記得關閉。不然命令行可能會產生奇怪的運行結果。
你已經學會啦,經過命令行來建立web服務器。我但願你喜歡這趟node迷幻之旅。
Node.js很適合現代的解決方案,由於其十分簡單而輕便。它充分利用了現代硬件非模塊設計的優勢。它包含了web固有的客戶端-服務器模塊。最好都用咱們喜歡的JavaScript運行。引發我興趣的是棧的關鍵部分並不前沿。網頁來自早期構建的輕量級易接入模塊。若是有時間,我建議你看看Tim Berners-Lees’ Design Principles.。原則中爲Node.js的least power applies提供了JavaScript選項。