[TEAP早期試讀]《深入淺出CoffeeScript》CoffeeScript與Node.js
圖靈社群按:
TEAP是什麼?TEAP是Turingbook Early Access Program的簡稱,即早期試讀,它公佈的是圖靈在途新書未經編輯的內容。一本書的翻譯週期約為3到6個月,如果在翻譯過程中,譯者就能與讀者進行溝通和交流,對整本書的翻譯品質是有幫助的。通過TEAP,讀者可以提前閱讀將來才能出版的內容,譯者也能收穫寶貴的反饋意見,改進翻譯,提高質量。
本書原名為CoffeeScript Accelerated JavaScript Development,中文名暫定為《深入淺出CoffeeScript》,本篇內容節選自書中第6章Node.js服務端程式的第一、二小節。
因本人系初次翻譯這種非常正式的技術書籍,難免有不妥之處,若有問題或意見建議,歡迎大家與我交流,我的郵箱:island205@gmail.com,也可以在微博上@我。
第6章 Node.js服務端程式
在伺服器上執行JavaScript一直都是web開發者的夢想。使用基於JavaScript服務端的開發者,無需在客戶端語言和服務端語言之間來回切換,只要通曉web程式世界的通用語言JavaScript——或者它二十一世紀的旁系語言,CoffeeScript——就行了。
現在這個夢想終於成為了現實。在本章中,從介紹模組模式(CommonJS標準的一部分)開始,我們將進行一段簡短的Node.js之旅。然後我們還會搞清楚什麼是“事件架構”及其對伺服器端效能、程式設計思想的影響。最終,我們將為上一章的5x5遊戲新增一個Node的後臺程式,同時使用WebSocket來實現實時多人遊戲的模式。
6.1 什麼是Node.js
不要受名字的影響:Node.js並不是一個JavaScript類庫。相反,它是一個JavaScript直譯器(由Google Chrome瀏覽器的JavaScript引擎V8驅動),它提供了底層作業系統呼叫的介面。通過這種方式,執行於Node.js上的JavaScript可以讀寫檔案,建立程式,甚至可以收發HTTP請求——這是最富吸引力的一點。
與CoffeeScript一樣,Node.js也是一個新專案(可追溯到2009年早些時候),它成長迅速,並催生出了很多激動人心的事物。看看Node.js Knockout 吧——一個受Rails Rumble 啟發的程式設計競賽,看誰能在48小時內開發出最好的Node程式。
已經有許多很棒的用Node和CoffeeScript寫成的專案了。下面是挑選出來的幾個示例專案。看完本書後你可以回過來看看這個列表,閱讀真實的原始碼是把你的能力推向更高層次的一個好方法:
- Docco[Ash11]:著名電腦科學家Donald Knuth提倡“文學化程式設計”的方法論。其涵義是編寫的程式碼和註釋要讓那些第一次碰到這個程式的人,只要閱讀一次原始碼就能理解這個程式。由Jeremy Ashkenas開發的Docco就支援這種方法論,它能生成漂亮的網頁,並在網頁中分列兩邊顯示註釋和程式碼。
- Eco[Ste11]:假設你正在編寫一個基於Node的web程式。你手頭上有了所有HTML框架和大堆程式程式碼,但是你卻不知道如何把它們結合到一起。Eco允許你把CoffeeScript嵌到HTML標籤中,使其成為一個伺服器端的模板語言。
- Zappa[NM11]:從頭開始建立一個web程式從來都沒有如此的簡單過。Zappa構建在Node的流行框架Express之上,你只需通過簡單的描述就能定義伺服器該如何處理任意HTTP請求 。它還能完美地整合Eco!
- Zombie.js[Ark11]:全棧式web程式測試模組領域又來了一個新小夥:Zombie.js。Zombie允許你運用Sizzle強大的能力驗證你web程式的行為,而Sizzle同時也是jQuery的選擇器引擎。它不僅好用,而且還異常的快。
你可以在https://github.com/jashkenas/coffee-script/wiki/In-The-Wild上找到一個非常完整程式列表,它包含了各種各樣基於CoffeeScript的程式。
6.2 使用“exports”和“require”構建模組化程式碼
在前面幾章中,我們曾使用過global
來把變數存放到程式級的名稱空間中。但是global
有其適用的範圍,Node開發者通常更願意讓每個檔案都有自己的名稱空間,以保持程式碼的整潔和模組化。那一個檔案如何與其他檔案共享物件呢?
解決辦法就是使用一個叫做exports
的特殊物件,它是CommonJS模組標準的一部分。一個檔案的exports
物件會在另外一個檔案require
呼叫該檔案時返回。因而,舉例來說,假設我們有兩個檔案:
Nodejs/app.coffee
util = require './util'
console.log util.square(5)
Nodejs/util.coffee
console.log 'Now generating utility functions...'
exports.square = (x) -> x * x
當你執行命令coffee app.coffee
時,require “./util”
執行util.coffee
後返回它的exports
物件,你會得到如下結果:
Now generating utility functions...
25
你可能會問為什麼我們不需要指定副檔名?在Node.js中通常可以省略副檔名.js
。不過只有在執行的程式已載入了coffee-script類庫之後才可以省略.coffee
。當然使用coffee
執行檔案時就已經隱式地載入了這個模組。coffee-script同時也會告訴Node.js如何處理CoffeeScript檔案。因此,假如我們只把app
而沒有把util
編譯為JavaScript,那我們就必須這樣寫:
Nodejs/app.js
require('coffee-script');
var util = require('./util');
console.log(util.square(5));
當遇到一個沒有帶“.”或者“./”字首的類庫時,Node就到它的類庫目錄中尋找匹配的檔案。你可以使用require.paths
來檢視類庫目錄。
根據約定,一個類庫供require
呼叫的名字與供npm安裝的名字是一樣的。比方說,回想下,我們曾使用命令npm install -g coffee-script
來安裝過CoffeeScript。這個命令不但為我們安裝了可執行的coffee二進位制檔案,同時還安裝了coffee-script類庫。在本章的後面我們還會使用npm為我們的專案安裝更多其他的類庫。
相關文章
- [TEAP早期試讀]《深入淺出CoffeeScript》CoffeeScript中的OOPOOP
- [TEAP早期試讀]《深入淺出CoffeeScript》譯者序
- [TEAP早期試讀]《深入淺出CoffeeScript》集合與迭代節選和若干問題
- [TEAP早期試讀]HTML5與JSONHTMLJSON
- [TEAP早期試讀]《敏捷武士》推薦序敏捷
- [TEAP早期試讀]敏捷武士之敏捷簡介敏捷
- CoffeeScript 1.4.0釋出
- [TEAP早期試讀]資料庫和敏捷開發資料庫敏捷
- 精讀《深入淺出Node.js》Node.js
- CoffeeScript 已死,CoffeeScript 萬歲!
- [TEAP早期試讀]《MongoDB in Action》——為什麼選擇MongoDB?MongoDB
- [TEAP早期試讀]《程式設計師的數學》- 前言程式設計師
- 讀《深入淺出Node.js》隨感Node.js
- [TEAP早期試讀]基於WebSocket的聯機作圖例子Web
- [TEAP早期試讀]NoSQL資料庫的基礎知識SQL資料庫
- CoffeeScript與Ruby的比較
- [TEAP早期試讀]《30天寫出你的作業系統》 - 挑戰多工作業系統
- [TEAP早期試讀]Android開發實現後臺下載Android
- [TEAP早期試讀]真正的好處:客戶端批量處理客戶端
- [TEAP早期試讀]Linux: 一個人加上一百萬人的智慧Linux
- coffeescript 1.8.0 documents
- 什麼是CoffeeScript
- [TEAP早期試讀]《Linux/Unix設計思想》之: 大教堂?多怪異Linux
- [TEAP早期試讀]《程式設計師的數學》- 邏輯工具卡諾圖程式設計師
- 深入淺出 Node.js ClusterNode.js
- CoffeeScript入門實踐
- CoffeeScript?TypeScript?還是JavaScriptTypeScriptJavaScript
- CoffeeScript攻略1.1:嵌入JavaScriptJavaScript
- CoffeeScript攻略1.3:for迴圈
- CoffeeScript攻略3.7:拆分字串字串
- CoffeeScript攻略3.9:匹配字串字串
- 淺讀-《深入淺出Nodejs》NodeJS
- 初步瞭解CoffeeScript,第4部分: 在伺服器端使用CoffeeScript伺服器
- CoffeeScript 編碼風格指南
- CoffeeScript攻略3.8:字串插值字串
- CoffeeScript攻略3.1:重複字串字串
- Javascript的鋼鐵戰衣:CoffeeScriptJavaScript
- [TEAP早期試讀]在資料庫中使用PL/SQL實現業務邏輯的優勢資料庫SQL