我的工作主要是寫flash和flex,雖然偶而也會碰到一點php,不過都是很淺的。
當然JavaScript也是會寫到的。
現在網路上入門的資源已經不少了,不過我覺得好像有一塊空白的地方,大家都說,寫JavaScript的也可以在Server上寫東西了,不過雖然語法可以用JavaScript來寫,但是做前端的知識,畢竟就是前端的,像flash的話,就是熟怎麼控制movie clip,怎麼控制event、timeline,怎麼把影音的資源整合之類的,和後端的關係最多就是用ajax存取資料這樣。JavaScript其實也差不多,不外乎就是dom存取或是事件控制。但是這些東西,和後端伺服器的所需的知識和技術大不相同。
所以,我第一個疑問是,雖然語言相通,但是前端真的能跨到後端去開發嗎?第二個疑問是,如果可以,有哪些方面的知識是需要補充的?
zanhsieh提到:
1. 資源共享競爭 - NIO / 事件好是好,實際上有可能有用戶一點資源都碰不到
zanhsieh提到:
長遠說,您找些有修過操作系統的書或者朋友問問。
首先,Node.JS 是以 Google V8 engine 為核心編譯引擎,所以開發人員所寫的程式都以 JavaScript 為主,JavaScript 對於前端開發人員或者是 web developer 來說或多或少都有一定的熟悉度。
不過在Node.JS 的程式編寫當中,要有一個清楚的概念,就是所編寫的程式邏輯沒有包含DOM, Browser 物件,大多會著墨於事件控制,這也是 Node.JS 採取 JavaScript 的優勢,利用事件控制,讓每個執行流程免於阻塞的狀況,只有當事件觸發時才會被執行,在概念上與其他的線性執行會不大相同。
Node.JS 學習的開始,建議從基本環境建置,還有JavaScript 程式邏輯方面著手,因為 Node.JS 的架構是基於 CommonJS 標準,剛開始接觸的時候需要花些時間將概念釐清,將Web 前端概念抽離,最簡單的方式可以從範例程式碼當中瞭解不同模組(module)的引用(require),模組建立,還有事件呼叫、觸發等。
雖然說 Node.JS 已經沒有了 DOM 或者 Browser 端的物件,不過回到根本,開發者對於 JavaScript 的基本概念還是要建立,例如,Object, array, prototype, function...有了以上的概念之後相信你在 Node.JS 開發道路上會更為順遂。
參考資料,
http://nodejs.org/
http://book.nodejs.tw/bibliography.html
http://www.commonjs.org/
對於Javascript這個程式語言,你必須有一個認知:在最初的設計中,他就是一個依賴於host環境的語言。Javascript核心有提供少數核心物件可以讓你使用(Object、Array、Math、Date ...etc.),至於host提供的環境,會透過global提供給使用者,所以在進入Javascript的執行環境中時,已經有一些預先定義好的global變數可以取用。在網頁環境中,這個global就是windows物件,在node.js時他就叫global。在不同環境中使用Javascript來開發,都需要知道host環境有提供什麼東西,這些會透過哪些global變數來取用等等。
不論在哪個Javascript環境中,都可以用這樣的方式來檢查到底host環境提供哪些global變數可供使用:
<pre class="c" name="code">
(function(o){for(var i in o) console.log(i)})(this);
//在一些host環境,例如SpiderMonkey的Shell,需要把console.log換成print,來把訊息輸出。
(這個方法有一個限制,就是global中一些物件可能會被設定成不可列舉的(DontEnum),這樣就沒辦法用這個方式看到,不過閱讀文件應該都可以知道有哪些功能可以使用。)
對於撰寫node.js來說,至少還需要知道的是:require()函數,node.js有許多功能是需要用這個函數來加入到你的使用環境中,這樣global中只要保留最少的物件就可以使用了。
node.js提供的功能,有許多都是非同步的,你必須提供一個callback函數給他,然後他會在執行完時呼叫並提供執行結果。這個使用方式應該不陌生,在瀏覽器環境中,各種事件都是用這個方式來執行。但是在node.js中,有時候會有複雜而交錯的callback,你可能需要用一些方式來組織他(不一定需要,只要你可以handle...另外,其實在複雜的網頁app,也有可能需要這樣的組織跟流程控制)。
其他就靠自己熟悉了,基本上他還是Javascript。另外V8應該可以完整支援ECMA-262 Edition 5了,所以一些好用的功能在node.js應該都可以使用。(像是:Array.prototype.map())
前端跟後端做的事情是互補的。
不同於前端,後端做的事情最基本大多與資料庫存取及訊息處理交換比較有關。
前端的開發以使用者介面為主,後端的程式則是以處理前端的要求為主。
換句話說,前端的程式主要是跟使用者互動,而後端的程式則是面對瀏覽器或應用程式互動。
同一件事情,兩者的處理邏輯不太相同。
例如:使用者登入系統。對前端來說,需要提供表單讓使用者輸入資訊,進行必要的資料檢查後,把資料送到後端進行驗證。最後再把驗證結果及相關訊息呈現在畫面上。
對後端而言,要做的事則是會收到使用者的登入要求(Request),把帳號及密碼資訊與資料庫中的資料進行驗證,再把驗證結果及相關資訊(例如:帳戶被鎖定而無法登入)傳回瀏覽器。
所以從前端要切入後端開發我覺得先有幾個重點:
1、了解 HTTP 基礎架構
HTTP 的基礎架構主要是了解後端處理要求的基本邏輯。
包括像:Request Method、Response Code、Session、Cookie 等了解一下。
這部份我手邊沒有入門參考資料,如果有人有比較簡單的參考資料歡迎補充。
2、資料庫
以往資料庫開發以 MySQL 或 MSSQL 關連式資料庫為主,技術門檻較高。
但 NoSQL 的資料庫日益流行,也有許多大型網站採用,例如:MongoDB。
由於是直接使用 JSON 格式存取資料,對於 JavaScript 開發者而言非常容易上手。
3、Web Framework
後端的處理可以直接套用現有的架構,會加速開發的速度。
建議可以從 Express.js (http://expressjs.com) 開始接觸,網路上相關的資訊比較多。
這部份另外還包含 Template 技術,比較流行的像是 EJS 或 Jade,主要用來產生動態網頁,算是基本功能。
最後補充一點,由於後端的環境不像前端是以瀏覽器為主,環境相對單純,但其功能也受到一些限制。後端的環境,基本上是可以讓你完全自由發揮的,網路上有數千個套件可以運用。初學者可以先選一些基本的來熟悉,等到覺得跟他比較熟之後,再去試試不同的套件。
不曉得 Node.js 可以幹麻, JavaScript的穩定性沒有後端程式來的高,
JSP, ASP, PHP 或其他 Client 都可以輕易達到相同功能, 酷炫功能不一定實用!
請舉例說明Javascript的穩定性問題。
另外,node.js是後端開發的環境,跟酷炫好像沒關係?
酷炫應該是指它是新技術吧...不過每個技術應該都有新生的時候,像Rails剛出來的時候大家也說很酷很炫但像是玩具,經過這些年來,Rails也已經證明了自己的價值,而且一直站在Web技術和實戰的前端。
不過Node.js是在JavaScript的event looping特性上,建立出none blocking的特性,這讓它可以處理大量的request,也讓它有特殊的應用情境。所以說它和JSP, ASP, PHP都一樣,也不盡然對。這是我對Node.js的一點粗淺認識,提出來讓大家參考。
JavaScript的穩定性沒有後端程式來的高?
Node.JS 是在寫後端語言,並不是寫前端,不會有跨瀏覽器問題,穩定度和完整性是已經被調整過,目前運作起來已經是個很棒的服務端產品。
JSP, ASP, PHP... 當然都可以達到相同功能,不過 Node.JS 擁有 non-blocking 的特性,可以提高 concurrency,同時Node.JS 也提供許多基本的底層 API ,讓開發者可以做 web 以外的事情,以上所提的這些都不是酷炫功能,都是屬於實用主義。
程式語言特性不同,用A 比較B 本來就有公平性問題,每一種現存的語言對於開發者都是美好的事物,只有體驗過得人才能瞭解其中的奧妙,每種語言也都有自己的酷炫功能點,只差在使用情境上的問題,有機會歡迎來 Node.JS 聚會參與討論。
我想穩定性的問題跟Javascript沒有直接關係...如果要說跟「酷炫」有關,可能比較適合
畢竟node.js還沒到1.0版,雖然有一些功力深厚的開發者參與,又有google(V8)跟微軟的奧援(IOCP支援/開發者/azure整合),但是介面與功能還隨著版本而有變化。我想這是他比較不穩的地方。
我想,「減少訓練成本」應該列入「企業為什麼會採用 node.js」的原因之一。像我公司,開發人員 99% 都會 JavaScript,但要求他們懂甚麼 PHP ASP.net JSP Python Ruby Erlang 是得投入學習成本的。
關於穩定性的問題,其實我剛開始寫的時候也會常常當掉,後來發現其實是自己 code 沒寫好的關係。
寫一陣子後就不會了,所以應該算是剛開始不習慣。
如果擔心,就加個 forever 之類的工具。
但是我自己實際上當掉的情形還是沒有很常見。
JS 寫了十幾年了, 功力雖然比不上 fillano 大, 不過該 catch Exception 一個也沒少, 不過還是對JS有點無奈 (不過JS還比VB要來的嚴謹), 仍然無法100%相信JS回傳的結果, 除了程式寫錯的狀況, 非常非常罕見的狀況下會發生出搥的狀況 (應該是瀏覽器發瘋了), 我只是發表我的看法, 就像 Ruby 很多人吹捧, 我還是看不出來價值在那, 搞死自己而已. Too much JavaScript not a good thing!
同意 aliceyeh 的看法,
不過,前端歸前端,後端規後端,Node.js 怎麼看都是一門後端語言,有一個穩定的JIT, V8 後面幫忙撐著,Node.js 發展到現在錯誤發生率越來越低,效能越來越好,容錯性也提高許多,距離一個可發展的語言,其實是個選擇。
但是前端 JavaScript 又是另外一回事...
Javascript真的是好上手但是很難精通的東西,我也花了幾年看spec寫測試驗證程式來搞懂他,然後問題才慢慢變少。就如同Crockford在the good part上提到:「JavaScript is Lisp in C's clothing」...他是一個具備相當豐富functional programming特性的語言,弄清楚這些東西,才真正了解這個語言。這些東西,不管在client size或是在server side都一樣重要的。
有一些會被認為「奇怪」的特性,其實在規格裡面也都制定的很清楚,只是如果用其他語言的「直覺」來想像的話,可能就會有錯誤的觀念。