天天看點

《寫給PHP開發者的Node.js學習指南》一1.3 Eclipse PDT

本節書摘來自異步社群《寫給php開發者的node.js學習指南》一書中的第1章,第1.3節,作者【美】daniel howard,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

寫給php開發者的node.js學習指南

學會如何分析堆棧追蹤資訊是php到node.js成功轉換的一個重要技能。堆棧追蹤是查找代碼錯誤的一個診斷工具,就像醫生用x光來檢查病人一樣。從某種觀點來看,php到node.js的轉換可以類似于一個複雜的外科手術。你要對php和node.js代碼進行手術。像手術過程一樣,轉換需要技巧和耐性,但是一個好的環境也有很大幫助。就像手術室中使用x光一樣,堆棧追蹤就是轉換過程中開發環境中的工具。下一步,我們會讨論內建開發環境,為轉換過程提供類似“手術室”一樣的環境。

很快你可能就需要面對幾十個php檔案,成千上萬行的php代碼,緊接着,幾十個node.js檔案和成千上萬行的node.js代碼,一個簡單的文本編輯器無法有效地追蹤所有的内容完成轉換。對于嘗試一個簡單的例子來學習如何使用node.js程式設計來說,文本編輯器足夠了,但是在面對大量的php和node.js代碼時,你需要更有效的工具。

在開發php或者node.js本身時,你可能會選擇一個單語言支援的內建開發環境(ide)直接使用。eclipse pdt(php development tools)是一個非常流行的php ide,用java編寫,由eclipse基金建立。其他的還有zend studio、phpedit和dreamweaver。對node.js來說,選擇就比較少了,并且對其适用範圍和有效性持懷疑态度。在寫本書的這個時候,我知道的有komodo edit、nide和cloud9。

然而,你的目标是将php代碼移植到node.js,同步地改進兩個代碼庫并添加新的特性。為了有效地完成這一過程,我推薦使用eclipse pdt,需要做一些修改來支援node.js。還需要知道的是如何在轉換過程中更容易地對比php和node.js代碼。

現在,在我開始介紹如何為php到node.js轉換過程設定eclipse pdt之前,我需要為那些拒絕使用類似工具堅持使用文本編輯器的開發人員做出聲明。他們說,“我隻使用vi”。如果你也是這麼想的,那麼你可以跳過本章其餘的部分然後用任何你覺得對的方法設定你的轉換環境。我會在這裡介紹如何安裝以及配置eclipse pdt,隻是因為對我來說它是一個非常重要的工具,幫助我将php代碼移植到node.js,對其他開發人員來說這也會是一個非常有用的工具。

要安裝eclipse pdt,首先下載下傳java。所有eclipse ide都是java開發的,需要java運作環境,當然包括eclipse pdt。我偏向于安裝java jdk而不是jre。在編寫本書的這個時間,我使用jdk-6u29-windows-i586.exe。

在寫書的時候,eclipse pdt下載下傳頁面上有下載下傳pdt和zend server community edition的連結。如果連結不存在了或者你有其他的web伺服器,可以根據你的作業系統下載下傳合适的eclipse pdt。然後可以跳過以下幾段,一直到講解安裝和配置eclipse pdt的段落。按照連結下載下傳eclipse pdt for zend server ce。現在,我用的是zend-eclipse-php-helios-win32-x86.zip。解壓但是暫時不要運作eclipse pdt。

在同一個頁面上,下載下傳zend server ce。我使用的是zendserver-ce-php-5.3.8-5.5.0- windows_x86.exe。

安裝zend server ce。簡要來說,一直選擇預設的選項直到setup type 頁面。選擇該頁面的custom按鈕而不是typical,然後點選下一步。在custom setup頁面勾選“mysql”server。然後完成安裝。

到這裡,zend server ce會顯示一個浏覽器頁面來進行配置。我們這種情況并不需要對伺服器本身做任何特殊配置。

安裝mysql 資料庫伺服器,并配置其作為zend server ce安裝包的一部分。預設情況下mysql資料庫伺服器root密碼為空字元串(也就是“”)。

運作eclipse pdt。zend server ce是基于apache2,有一個htdocs檔案夾。當eclipse pdt運作時,會查找并選擇htdocs檔案夾作為eclipse pdt的工作空間檔案夾。如果你使用zend server ce或者apache之外的web伺服器,選擇文檔根目錄作為eclipse pdt的工作目錄,部署到web伺服器的php檔案就可以在适當的位置進行修改了。

這并不在本書範圍之内,但是如果你願意,可以在你現有的php代碼庫上嘗試使用php debugger。

eclipse pdt和你的web伺服器是你的轉換開發環境的基礎。現在,我們來做一些修改,學習如何使用eclipse pdt有效地管理和實作轉換過程。

eclipse pdt本身已經支援javascript檔案,而node.js本身就是javascript,是以也可以支援node.js。但是.njs并不是标準的檔案擴充名,是以eclipse pdt并不會認為.njs檔案是node.js檔案。是以如果在eclipse pdt裡打開.njs檔案(例如,httpsvr.njs),會顯示成文本檔案,沒有像一般javascript檔案(.js)的文法提示顔色,也沒有代碼補充提示。

為了使eclipse pdt将.njs檔案作為node.js檔案,在eclipse pdt主菜單裡打開window菜單,選擇preferences菜單項;然後你可以看到preferences對話框,包含兩個窗格(圖1-1)。在左側的視窗,你會看到一個preferences的目錄和子目錄組成的樹形層級結構。右邊的視窗,你會看到一個按左側視窗標明目錄的可以浏覽和編輯偏好選項的對話框。

在左側視窗中,打開general 檔案結構,選擇content types選項。在右側視窗中,你會看到content type的清單。在右側視窗中打開text樹形檔案夾。在text目錄下,選擇javascript源檔案。當你選擇了javascript源檔案,你會看到一個清單框,有一個選項“.js”,在“file associations”清單框中,還有一個add按鈕在視窗的右中位置。單擊add按鈕,會彈出add content type association 對話框(圖1-2)。你可以在“content type”編輯表中輸入“.njs”。

然後,在所有打開的對話框上單擊ok按鈕儲存修改。

儲存修改完成後,對儲存為.njs的node.js源檔案,javascript文法高亮和代碼補全功能會生效。

《寫給PHP開發者的Node.js學習指南》一1.3 Eclipse PDT

文法高亮對.njs檔案生效後,你可以通過單詞的錯誤顔色注意到一些簡單的node.js文法錯誤。對任何程式設計項目來說,肉眼檢測都是很重要的一部分,尤其是php到node.js的轉換過程。另一個有用的肉眼檢測技術是使用一個先進的可視化對比工具來比較php和node.js代碼,可以看到所有的東西,包括轉換的品質和進度。

對比工具可以顯示兩個檔案的差異。簡單的基于文本的對比工具一般會将每個檔案的每一行的差異作為單色的文本輸出。這種對比工具對于分析php和node.js的轉換沒有太大幫助。我們需要更進階一點的對比工具。檔案需要并排顯示而不是作為交替行文本;需要顔色對比,而不是單色;顯示到字元級别的差異而不是隻顯示不同行的内容。

eclipse pdt内建了一個不錯的可視化對比工具。我們可以使用這個工具來對比一個.php檔案和其對應的.njs檔案。使用的時候選中.php和.njs兩個檔案,右鍵單擊,選擇compare with 子菜單然後在該菜單内選擇each other菜單項。圖1-3是使用 eclipse pdt對比工具對一個簡單的.php檔案和對應的.njs檔案進行對比的截圖。

《寫給PHP開發者的Node.js學習指南》一1.3 Eclipse PDT

你并不需要詳細了解這個特性是如何工作的,隻需要看到php代碼和node.js對比相似度即可。

左邊是rand.njs檔案,右邊是rand.php檔案。檔案的差别用灰色顯示,比對到相似的字元用白色顯示。

注意到有些行幾乎完全是白色,除了一個美元符号($)是灰色。php和node.js在同樣的地方使用同樣的關鍵字function,并且函數名位置也相同。多年以來,這成為各種新的語言的共性,避免文法結構的變化,采用相似的文法,比如定義函數。同樣,也注意到while語句也基本一緻。

這對開發人員來說是有好處的,對比php和.njs檔案會變得更容易。

eclipse pdt自帶的可視化對比特性很好但是并不絕對可靠。有些時候,在檔案中移動代碼則希望可視化對比工具可以找到更多比對的内容,這就是說,該工具會在兩個檔案中顯示更多的白色。在檔案中拷貝一個函數的時間與代碼的表現和功能無關,但是可能會使可視化對比工具更精确地進行代碼比對。在轉換過程中值得花一些時間來嘗試在每個檔案中移動代碼,看看會對對比結果産生什麼影響。

在eclipse pdt中,代碼既可以在單獨的視窗中編輯,也可以在對比視窗中。如果在獨立的視窗中編輯并且儲存,任何顯示該檔案的對比視窗都會重新加載該檔案并且重新進行比對。可視化對比工具的普遍實作都是在獨立視窗中編輯代碼之後對比視窗重新加載。

一般來說,将兩個檔案中的代碼保持相同的格式,使用相同的名字(比如函數和變量),包括重構一個或者兩個檔案中的代碼,都有助于對比工具找到盡可能多的比對代碼。

為了保持php和node.js代碼同步改進和添加新的特性,你需要依賴于對比工具確定php和node.js代碼的正确性。慢慢地,開發人員就可以培養一種感覺知道比對到什麼程度是最好的。

當比對度不夠時,對比工具就會偏離其本來的功能,嘗試将.php檔案中的php代碼和.njs檔案中的node.js代碼進行對比,這并不意味着比對。會有很多表示差異的灰色的高亮,無法比對。經常嘗試修改可以糾正這種問題。

當白色高亮太多時,意味着.njs檔案中的php代碼沒有完全轉換為node.js代碼。即使.njs檔案可以解析并且運作,太多的白色高亮意味着需要更進一步的轉換。經常對node.js代碼進行肉眼檢測會發現還沒完成的一些特定轉換。一個很容易忘記的轉換就是給php變量加上美元符号($),node.js變量不需要美元符号。給php代碼中加上美元符可以減少白色比對高亮,使對比工具接近于正确的比對度。

視覺上的對比,特别是使用對比工具,要比互動式的測試php和node.js代碼快很多。肉眼檢查可以作為“通煙測試”(smoke test)來檢測轉換過程是否接近正确。自動化測試用例,不在本書讨論範圍内,可以快速檢測移植的正确性與否。

在本書中,你有機會将一大段特定的php代碼轉換為對應的node.js代碼元素。例如,php中使用array()函數建立數組,而node.js中,一般使用文字元号,比如花括号,建立數組。在轉換開始時,拷貝了整個.php檔案的代碼到.njs檔案進行轉換,.njs檔案中肯定包含很多php array()函數,需要被替換成node.js對象的符号。一個簡單的處理辦法是使用eclipse pdt的find/replace功能來進行“array(”的全局替換(全部替換為左半邊花括号)。如圖1-4所示。

《寫給PHP開發者的Node.js學習指南》一1.3 Eclipse PDT

這個對話框的使用非常簡單。

本書使用文本速記來代替每次說明find/replace對話框時的截圖。對上圖中的find/replace對話框來說,使用以下文本作為替換:

《寫給PHP開發者的Node.js學習指南》一1.3 Eclipse PDT

有兩種不同的使用find/replace對話框方式。

一種方式稱為無條件(blind)全局查找替換操作。如圖1-4所示。

稱之為“無條件”是因為該操作會在檔案中一次完成所有查找和替換操作,不提示警告資訊,不需要手動幹預。如果所有的find/replace對話框都經過測試并驗證為安全的,無條件的全局查找替換操作速度快并且準确。但是,如果結果出現錯誤,隻有兩個選擇:撤銷之前的操作或者進行一次新的替換糾正前一次的錯誤。

值得一提的是對于查找和替換糾正工作的第二個選擇。有些時候,一個簡單易于了解的替換操作可能正确地替換了298處代碼,但有兩處替換錯誤,要比一個複雜的查找替換操作正确替換了300處代碼好很多。手動查找和修複一些邊緣案例是值得的,并不是所有的事情都需要完全自動化。即使php到node.js的轉換過程是一個漫長的過程,你也不需要一遍一遍重複操作。本書介紹的并不是“持續轉換”,而是将轉換作為一次性事件。是以對于完成工作來說完全可以接受手動查找和修複少數邊緣案例。

第二種使用find/replace對話框的方式是全局查找單步替換操作。首先,find/replace對話框用于查找第一個比對到的内容所在。開發人員檢查該處是否需要手動修改代碼(可以通過點選該處代碼而不需要關閉對話框)或者執行替換(點選replace/find按鈕),或者跳過目前所在查找下一處比對(再次點選find按鈕)。以下是單步全局查找替換操作的簡介:

《寫給PHP開發者的Node.js學習指南》一1.3 Eclipse PDT

eclipse pdt中的find/replace也可以使用正規表達式。正規表達式是一種模式比對技術:正規表達式用于描述一種搜尋的模式,而不是準确的内容。每次找到比對模式時,比對上的内容都作為待替換區域。比如,如果數組正規表達式((.))比對到了array(id=>‘name’),正規表達式中的(.)則表示内容id=>‘name’。這段内容被稱為比對字段,或者有時候被稱為比對組。在eclipse pdt find/replace對話框中,比對字段由它周圍的括号決定。為了使比對字段成為替換字段,比對字段會按照比對到的順序列舉出來。美元符($)用于描述一個特定的比對字段,後面的數字表示比對字段的編号。例如,替換區域中的$1表示第一個比對字段,在之前的例子中表示id=>‘name’内容。一般情況下都隻有一個比對字段,是以經常使用的都是$1,很少看到$2、$3或者更多的。

以下表示使用正規表達式的無條件查找替換操作:

《寫給PHP開發者的Node.js學習指南》一1.3 Eclipse PDT

正規表達式的使用不包含在php到node.js的轉換過程中,是以本書并不會介紹如何了解和編寫正規表達式相關的基礎知識。是以正規表達式都是作為查找替換操作中的一部分,可以拷貝到eclipse pdt find/replace對話框中的對應區域,你不需要去了解或者修改這些正規表達式。如果你确實需要正規表達式相關的幫助或者需要了解正規表達式的規則和它們的工作原理,鼓勵你去研究eclispse pdt,使用google或者其他搜尋引擎,查找網頁、部落格或者論壇來回答你的問題。

大部分時候使用正規表達式的查找替換操作比逐字逐句的替換查找(比如隻比對到一個特定的字元串)更容易了解并且效率更高。一個正規表達式可以使比對的内容更加靈活,并且通過比對字段,将比對到的内容作為replace字段。一般來說,按字元查找替換一次隻能比對到代碼的開始或結尾,代碼元素的中間部分可能有變化。而正規表達式,中間部分可以比對某種模式,一次的替換查找操作就可以比對整個代碼元素。當這種代碼元素的替換可以在一次查找替換的操作中完成,發生錯誤的機率就降低很多。

截止到這裡,本章介紹了如何建立php到node.js轉換環境的一系列操作和相關知識。第一件事是下載下傳node.js本身,熟悉自帶的兩個指令。之後,通過調試node.js堆棧追蹤資訊來學習如何閱讀堆棧資訊以及根據該資訊找到定位問題背後真實的深層次的原因。接下來,安裝eclipse pdt作為開發環境的基礎,包括對配置的修改使其支援.njs檔案,專注于php到node.js的轉換。最後,了解了轉換過程中很重要的可視化對比工具以及查找替換操作。

一個好的開發環境對提高開發效率以及完成工作至關重要。很多時候,業餘的開發人員會陷入在程式設計的過程中而忽略了開發環境的重要性。最開始的時候,在任何環境下都可以很快開始開發工作,因為這個時候代碼量較少容易改進。當代碼庫逐漸增長,代碼的複雜度逐漸上升,開發的速度就會降下來了。一個低效率的開發環境在複雜度層面上對開發人員沒有任何幫助,但是一個好的開發環境可以幫助開發人員簡化必備的知識維持開發速度,直到項目結束。

在php到node.js的轉換過程中,我們假定已經有一個很大的php代碼庫。在轉換結束的時候,期待代碼庫在規模上可能會翻倍:php代碼會因為轉換進行重構,但不會縮減,是以代碼量會增長。當然,還會添加一個完整的node.js代碼庫。原始的php代碼庫可能由很多人合作開發,但是轉換過程中的耦合太多一般是由一個人完成主要的工作。是以,對原始的php代碼一個基本的開發環境也許就足夠了,但是想要移植到node.js則需要一個更複雜的開發環境。

如果一個項目已經有了一套自己的開發環境,也許不會選擇eclipse pdt。eclipse pdt隻是一個可用于轉換的可工作的典型開發環境。其他的開發環境如果支援本章之前提到的各種特性,也可以使用。總而言之,開發環境需要支援.php和.njs檔案的文法高亮,對兩個檔案進行單次級别的可視化對比而不僅僅是代碼行級别,以及支援正規表達式的查找替換操作。

現在,轉換過程的所有準備工作已經就緒,我們可以開始建立.njs檔案來儲存新的node.js代碼。在下一章中,會介紹一個初始.njs檔案的模闆,之後的章節中,php代碼會被重構,複制到node.js檔案中,然後轉換為可運作的node.js代碼。