轉載自:http://www.w3ctech.com/topic/37前端
原 文: https://www.nczonline.net/blog/2013/10/07/node-js-and-the-new-web-front-end/node
在軟件開發領域,前端工程師曾經是一個比較糾結的職業。在Web技術真正發展起來以前的至關長一段時間裏,因爲技術門檻很低,前端工程師行業一直是魚龍混雜的狀態。其中不少號稱是Web開發者的人實際上並無什麼專業的前端技能,有些工做就是被當作簡單的力氣活由美術設計師順便作作而已。當時不少人甚至並不認爲有朝一日會有這麼一羣人用HTML、CSS和JavaScript這三門技術謀生 --- 他們想,這怎麼可能呢 --- 這些技術看起來都是如此簡單,隨隨便便混在一塊兒用就哦了,把作這些活當作一種正兒八經的職業簡直是笑話。程序員
隨着技術發展,JavaScript這門語言在悄然改變人們對前端工做的見解,讓一些人從美工頁面仔轉變爲真正的前端工程師。JavaScript,這門不少工程師曾經把它當作玩具而不屑一顧的腳本語言居然演變成了推進互聯網發展的核心驅動力。伴隨着愈來愈多的瀏覽器的出現使得用HTML和CSS兼容各類瀏覽器變得愈來愈難,因而能實現兼容各類瀏覽器的頁面成爲了前端工程師的金字招牌,前端職業開始變得煊赫一時。web
即便Ajax這種技術風靡全球以後,前端工程師的主要工做也都是侷限於瀏覽器窗口以內的。HTML、CSS和JavaScript是前端工程師必需要掌握的三種核心技術,前端同後端的惟一交集僅僅是前端須要確保後端的數據可以以正確合適的格式輸出到瀏覽器上。在某種意義上來講,Web開發有兩個UI層,一個是在瀏覽器裏面咱們最終看到的,另外一個在server端,負責生成和拼接頁面。由於傳統前端基本上沒有辦法自主決定server端如何處理數據拼接生成頁面,由於數據如何組織,每每是會受到後端工程師所選擇的技術框架的影響的,然後端不理解前端的一些需求因此他們選擇的時候也就不多會從前端方便的角度進行考慮。後端
在上面這張圖的結構裏,瀏覽器裏的UI層是徹底歸前端工程師管的。服務器端的UI層則是先後端都關心的部分,剩下的部分則是服務端的底層,諸如數據處理、緩存、權限控制和其餘核心模塊,這些是歸後端管的。咱們仍是回過頭來看咱們所關心的server端UI層吧,這一層所作的事情一般是拼頁面模板以及處理具體的業務交互邏輯。瀏覽器
因此,傳統的先後端分工是由前端負責瀏覽器,而其餘瀏覽器以外的東東通通歸由後端負責。先後端的交集server的UI層也是由後端來主導的。這是目前最主流的一種先後端分工方式緩存
Node.js一發布,馬上在前端工程師中引發了軒然大波,前端工程師們幾乎馬上對這一項技術表露出了至關大的熱情和期待。上一次一種技術能被整個前端界如此關注那仍是在幾年以前,那時候Ajax這個概念剛剛被提出來。讓JavaScript跑在server端,這個想法簡直太棒了。這下咱們不用再去學那些什麼PHP啦、Ruby啦、Java啦、Scala啦或者其餘什麼對前端來講奇怪的語言,也能夠輕鬆地將咱們的領域擴展到server端,多麼美好的前景!安全
我歷來不是一個PHP的愛好者,可是我在Yahoo工做的時候,我不得不使用PHP。爲了這份工做,我得忍受花費許多額外的時間去修復因爲PHP的傻逼特性致使的坑。對於一直使用Java做爲服務端語言的我來講,對PHP實在是很難適應。我相信,也一直堅持認爲一種靜態類型的語言更加適合用來構建你的業務邏輯的核心部分。所以,雖然我很喜歡JavaScript,但我也不會用它來作全部的事情,好比我絕對不會只用JavaScript來實現一個完整的購物車系統。服務器
對於我來講,Node.js不是一個解決一切問題的銀彈,我不會用它來取代server端全部別的語言模塊。事實上,Node.js能夠作到其餘後端語言所能作到的幾乎全部的事情,可是我不會這麼作。我所認爲的比較合適的作法是用Node.js來解決server端UI層的問題,這樣我就能夠將這一層從後端的其餘部分剝離開來。前端工程師
如今愈來愈多的公司傾向於採用面向服務(service-oriented)的架構,由後端提供給前端RESTful的接口,這麼作是爲了更好的作先後端的依賴分離。若是全部的關鍵業務邏輯都封裝成REST調用,就意味着在上層只須要考慮如何用這些REST接口構建具體的應用。那些後端程序員們根本不操心具體數據是如何從一個頁面傳遞到另外一個頁面的,他們也不用管用戶數據更新是經過Ajax異步獲取的仍是經過刷新頁面,固然他們更不關心的是你究竟在用jQuery仍是YUI --- 這與他們根本毫無關係嘛。後端程序員真正應該關心的難道不該該是數據如何存儲、如何容錯以及如何保證安全性嗎?
如今咱們看看Node.js帶來的好處吧,當後端程序員提供了REST服務以後,如今咱們前端程序員可使用Node.js來處理server端的UI層啦,咱們能夠將經過REST調用拿到的數據爲所欲爲地進行處理,無論是渲染模板仍是直接提供給Ajax,如今咱們僅僅用JavaScript一種語言就能夠輕鬆實現這些。至於後端程序員,他們只須要保證數據的正確性,不管他們使用任何一種語言來封裝REST調用,都不會對前端形成影響,這樣先後端的職責不就被更好地劃分了嗎?這樣分工以後前端的領域就從瀏覽器小框框裏面擴展到了server的UI層,而這一層原本對於後端來講是一件他們作起來不輕鬆的零碎活兒。
前端工程師接手以前一直由後端負責的這部分工做不那麼容易被後端工程師們理解和接受。尤爲是如今還有不少後端工程師認爲JavaScript是一種極簡單的「玩具語言」,他們將會想如此重要的服務端工做怎麼能交給這羣看起來不靠譜的人用如此「不嚴肅」的語言來玩?在個人經驗裏,這種觀念上的衝突是先後端工程師們在是否引入Node.js這一問題上的最大分歧。Server端UI層是先後端的中間地帶,而以前一般後端程序員對於這個地帶比較有主導權,因此一旦你進入這個原本屬於後端主導的領域,爭議天然是不可避免的。
實際上放棄傳統的角色立場,將server的UI層分給前端,在大型Web架構下是頗有意義的。不這麼作的話,有時候前端想要從後端要到正確的數據,還不得不關心後端到底是用什麼語言實現的。過去的分工中,那些本來屬於核心業務底層考慮的東西會被暴露給server的UI層,而這些問題每每會不當心影響到前端。前端原本不須要關注這些問題,由於先後端所關心的方面根本徹底不同嘛。若是你理解單一職能、責任分離和模塊化,你就會理解我所說的,甚至會以爲之前不把server的UI層分給前端實在是很笨。
只惋惜,以前Node.js這樣的東東不存在,因此當時沒有前端合適的技術讓前端工程師們本身搞定server的UI層。因此後端的同窗們用PHP的人就順手把UI用PHP的模板實現了,一樣的用Java的後端同窗也天然而然地用JSP搞定這個問題。這不是前端的同窗不肯意去作server的UI,而是由於在以前,沒有一種咱們熟悉的技術讓咱們可以搞定這些事情,可是如今不同了,咱們有Node.js了。
我喜歡Node.js,我喜歡由這項技術給前端界帶來的更大的發展潛力。我並不認爲整個後端徹底用Node.js來實現會是一個很好的方案,儘管Node.js徹底能夠作到這一切。我認爲目前Node.js最大的價值是能讓前端徹底把控整個UI層,不管是瀏覽器的仍是Server端的,作到這一點,咱們工做的效率能獲得很大的提高。咱們前端更擅長於決定數據以何種方式呈現能帶給用戶更好的體驗,然後端則更加了解如何處理數據。在這種新的分工方式下,後端只須要提供合適的數據操做接口,前端本身就能構建漂亮的、有效率的、可用性高的接口,從而實現用戶所喜歡的交互。
使用Node.js來搞定server的UI層也將後端工程師從他們不擅長的領域解放了出來。因而咱們獲得了一個Web開發的靈丹妙藥:先後端之間只須要經過數據來交互,這種模型使得兩方相互獨立,各自都可以快速迭代開發,而只要保證數據接口不變,先後端彼此之間就不會形成任何影響。
果斷嘗試一下吧,這個方案也許正適合你的團隊。
博客地址:http://wangyh.net