跳到主要內容

開發者轉換到 node.js 開發方向 - Node.js for php develpers PHP

Node.js for php develpers

從某一種語言跳到另外一種語言,通常來說痛感應該是不會太大,只要有些觀念釐清即可,畢竟每種語言存在都是有某些特別的道理,或者是有他的歷史存在意義,所以語言的對戰比較之類的事情,我對於這種事情通常是一笑至之。有時間去吵那些莫名其妙的事情,倒不如發揮自己所長,好好將產品快速產出,這才是『實現的王道』

話說回來,前面談到前端開發者來說 JavaScript 是一個很棒的利基點,也是一個很好出發點,轉向到後端開發當中。那是否意味著其他語言開發者就沒有相對的機會呢?

就個人在其他語言上琢磨並沒有這麼多, PHP 倒是寫過不少年,因此我從 PHP 開發者的角色來檢視一下,有哪些觀念需要被改變,需要被調整。

Node.js 是一個整體的服務 / 語言

對於 php 開發者來說,一開始的環境就是要先開始架設 Apache / Nginx,接著使用 cgi 的方式來起動 php ,當然在 linux 底下的話,直接使用套件管理,直接進行安裝會是更為方便。

apt-get install php apache

但是在 node.js 裡面,node 本身就是一個服務,不需要其他相關的程式進行啟動, node 本身就可以是一個後端的服務,或者一個 web service ,更或者是一個 command line 的進行,所以 node.js 是不需要任何相依設定。

也因為如此,所以許多 apache 幫你處理掉的事情,在 node 裡面都需要自己處理,這件事情聽起來或許很煩,事實上也是如此,開發 php 的時候許多事情 apache 都已經幫你處理完的事情,node.js 在 web 上,前面的所有開發都需要自己來,這是一個很大的不同,你需要稍微了解一下之前 apache 到底幫 php 做了哪些事情,接下來開發 node.js 才能夠了解,為什麼他要做這些事情。

Node.js 每個檔案都是獨立的 Class

node.js 每一個檔案都可以視為獨立的 Class ,這跟我們之前所認知的 JavaScript 似乎有很大的不同,JavaScript 本身都是採用 fuction call ,變數宣告也很容易互相影響,可是因為 Node.js 採用 CommonJS 標準,因此在每個程式裡面,變數都不會互相影響,每個檔案內的變數都是獨立的。

開發 php 的時候很經常會使用到 require,而 php 將會把這個檔案讀取進來,當然變數也會連帶的影響到,可能 a.php 的變數會出現在 b.php 裡面,這都是時常發生的事情。
a.php
<?php
$hello = 'abc';
?>

b.php
<?php
$hello = 'world';
?>

main.php
<?php
require('a.php');
require('b.php');
echo $hello;
// print 'world'
?>

範例如上面,當我們執行 main.php ,就會得到 world 這個資訊,可見 a.php, b.php 兩者的變數會互相干擾,同時 main.php 可以直接讀取已經宣告過的變數,這在多數的 php 開發者都有深刻的經驗,當然這也是一個特性,開發 php 的時候這個特性,是個很方便的東西。
在 node.js 開發裡面卻不是這麼回事,每個檔案都是獨立的 class,的程式都有不同的東西。

a.js
exports.hello = 'abc';

b.js
exports.hello = 'world';

main.js
a = require('./a.js');
b = require('./b.js');
console.log(a.hello);
// print 'abc'
console.log(b.hello);
// print 'world'

從上面的範例來看,在 node.js 開發上的確與 php 有許多不同,尤其是變數宣告處理上,更是不一樣的架構,這樣的好處 node 不會有變數互相打架的狀況發生,當然麻煩的部份也是,無法共用變數,思維上的確與 php 原有的宣告思維上有許多不同。

Node.js 的套件都存在於 NPM 上

php 開發的時候大多數時間我們的環境都已經把所有需要的套件安裝上去了,或者是需要憑靠著經驗,從 log 中查看到底還缺少哪些套件,當然 php 之前有 pear 這樣的東西可以進行套件安裝,不過對於 pear 的社群維護度來說,通常我還是在一開始架設 apache 的時候就先把所有的套件全部設定完畢。

在 node.js 裡面,套件相依性,以及套件管理是很重要的一環, npm 就是如此的東西,可以透過 npm 進行 node.js 套件的安裝,例如我們常用的 express

npm install express@2.5.8

可以透過指令去尋找,安裝,解除,更可以透過指令來指定版本號碼,特別是每個 node.js 專案幾乎都需要重新安裝一次套件,這個部分對於 php 開發者是覺得神奇,而且浪費空間的事情。

不過仔細想想,開發專案,在不同時期,不同時間點,我們需要的 module 可能也會不同,因此在每個專案裡面安裝套件似乎又如此的合情合理,當然還是必須要說,這樣子是真的比較佔用空間,不過又如何,目前的硬碟這麼大,對於開發者來說,裝 code 的空間佔用多少?

因此每個 php 開發者轉移到 node.js 時候,需要去了解、熟悉 npm 這個指令。

Node.js 的 package.json 設定是必要的

如上面所提到,每個 node.js 專案都是需要去被執行 npm ,進行相依模組的安裝。接下來你將開發許多不同的 node.js 專案,請先做好相依模組記錄的習慣,在每個專案目錄底下設定 package.json ,設定好版本號。

cd project_name
npm install

接著開發、維護的成員,可以不用再去猜測之前的模組為哪個版本,直接透過你之前設定的 package.json ,透過 npm 進行快速的安裝,立即進入開發的行列之中。

Node.js 是 Event driven I/O 處理

對於 php 開發者來說,開發程式的習慣就是很直覺性的 debug,設定 break point ,觀看 log 跳到的地點,程式的執行是依序的,由上往下依序執行,以前我們的老師也都是這樣子教導我們的,程式的確也是這樣看的,

$my_file = 'file1.txt';
$handle = fopen($my_file, 'r');
$data = fread($handle,filesize($my_file));

$my_file = 'file2.txt';
$handle = fopen($my_file, 'r');
$data = fread($handle,filesize($my_file));

但是,在 node.js 開發裡面,事情似乎變得不一樣,我們的開發寫法開始有了許多改變,event-driven 是一個很強的衝擊,許多的東西都使用 callback 都使用匿名函式來銜接,當然連同裡面的變數也是如此,而這些變數的來源,通常都要去參考 nodejs.org/api 的部份,事情是需要不斷的在 callback 裡面慢慢被完成,這的確很奇怪,也的確很神奇,

var fs = require('fs');
var my_file = 'file1.txt';
var data;

fs.readFile(my_file, 'utf8', function (err, data) {
    data += this.data;
    my_file = 'file2.txt';
    fs.readFile(my_file, 'utf8', function (err, data) {
        data += this.data;
    });
});

如同之前的 php 程式,讀取兩個不同檔案的程式架構卻全然不同,在 node.js 裡面許多程式都是以非同步的方式執行,你無法依照以前排序的方式進行開發,當然程式的執行順序也不會如你所願,如果希望讀取檔案完成之後,進行另外一個檔案的讀取,那就只能進去 callback 裡面,進行另外一段程式的進行。

聽起來似乎非常奇怪,不過這就是 JavaScript ,這就是 node.js ,這是他獨特之處,如果希望開發 node.js 就請習慣這種風格,也請習慣 event-driven 的方式。程式只會等到被執行的時間點才會進行,程式執行的時間並不會依序進行。

後記

就在你看這篇文章的時候,表示你對於 node.js 應該是有聽過,或者是有想要進入這個領域,想看看 node.js 到底要怎麼開發,當然這是一個好的開始,表示你期待改變。

這邊很尊重你想要改變的心情,如果你是要拿來測試新的專案、新的服務、甚至於公司目前有改造計畫,這是一個不錯的發想開始。不過,如果你的程式已經有了許多基礎建設、許多歷史的累積,這邊不建議妳採用新的語言進行開發,也不建議妳整個重新打掉這個『正在運作的服務』。

node.js 是不是很不穩定? node.js 是不是適用於我的開發架構? node.js 到底能不能開發大型架構? 如果有開發者問我這樣的問題,我通常會回答他,先使用 node.js 想辦法建立一個 todo list, 留言板之類的簡單網站,之後,我們再來討論。

程式語言只是一種實現的工具,每個階段都會有不斷的程式架構調整,程式只有更好,沒有最好,不斷的調教,不斷的改善,當每段程式上線我們舉杯慶祝的同時,下一秒,開發人員又回到座位上繼續進行下一個里程碑,『程式只有更好,沒有最好』

本文章同步轉載於:

留言

這個網誌中的熱門文章

Vibe Coding:為什麼 Junior 更快上手?Senior 要如何追趕?

現象層面(市場觀察) 最近有篇文章討論 junior & senior 開發者在 AI 時代的角色轉變,非常熱門。 身為 Cympack 產品開發團隊 ,我們也一直關注這個議題,在閱讀這篇文章時觀察到一些有趣的現象,對我們來說,這正好反映出 AI 正在改變開發生態,junior 借力 AI 快速成長、senior 則需要在 「架構思維」 與 「多 agent 協作」 中找到新定位,其中有些啟發(insight) 可以跟大家分享。 為什麼 Junior 更容易上手 vibe coding? 心智負擔低 → Junior 沒有太多傳統 code workflow 的框架包袱 敢於嘗鮮 → Gen Z / 年輕工程師天生習慣用 prompt-based 工具、跟 LLM 互動 少「優雅程式設計」的束縛 → 不太糾結「這樣寫會不會不夠優雅」,反而 embrace 快速迭代、快速出成果 反觀 Senior: 熟悉大型系統設計 有豐富的「工程正統流程」知識(架構設計、測試策略、效能優化、設計模式) 對 AI 生成 code 的品質 / 維護性通常比較保留 部分 10+ 年資深工程師,對 prompt engineering 沒那麼熟練,還在觀望 技能面(未來的關鍵能力) Vibe coding 本質上 = prompt engineering + AI co-pilot 管理能力 能力項目 誰目前比較有優勢? Prompt 撰寫 / AI 互動 Junior 較強(熟悉 chat-based 流程) 系統設計 / 架構把關 Senior 較強 AI 生成 code 驗證 / Bug 察覺能力 Senior 較強(能看出潛在問題) 快速疊代 / Hackathon 式開發 Junior 較強 長期維護性 / 穩定性 Senior 較強 總結 Junior 確實更快適應 vibe coding,並且更習慣以 「chat-based coding」 的工作流開發。 Senior 擁有驗證 AI 產物與系統設計的深度能力,但若不主動練習 vibe coding,長期會逐漸落後於新一波開發潮流。 就如同在 GAI 技術年會分享,希望帶給各位的感受, 『與 AI 協...

RAG 和 Prompt 原理超簡單解說!想知道 AI 怎麼找答案看這篇

這篇文章是給對於你已經開始使用所謂的 ChatGPT / Claude / Gemini 之類的 AI 服務,甚至是 Siri (嘿丟,他也是一種 AI 應用服務喔) 簡單來說是非 技術人員, PM,小白,想要趕快惡補的人 ,直接花十分鐘可以看完的一篇科普業配文章。 或者是概念僅止於,AI 這東西會幻想,會有誤差,會對於生活有些幫助但沒有幫助的人們,做個簡單又不是太簡單的介紹,希望用一個非常入門的方式讓你們有個了解。 當然,這篇文章目的很簡單, 就是引流 ,如果你身邊有已經對於 Web 技術開發的人員,歡迎報名分享給他,年末出國不如學一技在身,參加今年我們舉辦最後一場 RAG 實作工作坊,報名連結 , https://exma.kktix.cc/events/ai-for-dev-course-rag-2 注意: 接下來每個大段落結束都會有一段工商導入,但文章絕對精彩,請注意! 為了讓各位容易想像,我們將整個世界的資訊,先濃縮到這本『西遊記』的世界觀當中,我們整個世界都在這個 『西遊記』 ,而 大型語言模型 我們用 『書精靈』 來描述。 PS. 我們先預設各位,應該都有聽過,西遊記!如果沒有聽過西遊記的,請右轉出去,謝謝! 先來談談向量 在《西遊記》的世界裡,我們可以把 向量想像成一種「內容座標」 ,讓系統知道每個角色、場景、法術等的 「位置」和「距離」 。向量幫助語言模型知道不同內容之間的關聯程度。 向量就像內容的「距離」和「位置」 比方說,唐三藏的 「位置」(向量)會接近「佛經」和「取經」 的概念,因為他一路上都是為了取經而前進。孫悟空的 向量位置則會更靠近「金箍棒」和「七十二變」 這些概念,因為這些是他的特徵。 相似內容靠得更近:像「佛經」和「取經」會靠近唐三藏的向量,因為它們彼此有很強的關聯。 相差較大內容會離得較遠:像「取經」和「妖怪」「妖怪的寶藏」就距離比較遠,因為妖怪的寶藏和取經的目標關聯性不大。 是誰決定的這些位置? 簡單來說,這些位置和關係是模型自己學出來的。語言模型會閱讀大量的資料和這世界觀的資訊,觀察哪些詞語經常一起出現,根據「共同出現的頻率」來決定它們的關係,並且自動生成向量。例如: 如果模型看到 「唐三藏」 總是和 「取經」 一起出現,它就會讓「唐三藏」的向量靠近「取經」。 ...

Vibe Coding 協作到自建 Dev Agent?從 Claude / Codex 到 OpenHands

過去一年,越來越多工程師開始 把 AI 真正帶進工作流程 。從一開始用 ChatGPT、Claude 來問語法問題,到後來很多人愛上 Cursor,直接在編輯器裡讓 AI 幫忙改 code、補 test case、甚至自動整理 PR。這樣的開發體驗,已經大大改變了我們寫程式的方式。 更現實的是,在很多企業內部、政府單位、或涉及機密資料的專案裡, 其實根本不能直接用 Cursor 或雲端 LLM 工具。   畢竟這些服務通常會把資料傳到雲端模型做處理,萬一專案裡有未公開的技術、敏感客戶資料,或是受限於法規 (像金融、醫療、政府標案) ,直接用雲端 AI 工具就會踩 紅線 。  因此,許多團隊反而更希望 「自己架一套 Dev Agent」 ,可以在內網執行,資料完全掌握在自己手上,該整合的內部工具、該讀的私有 repo、該串的 CI/CD pipeline,全部客製化、安全可控。 這時候,像 OpenHands 這樣的開源 Dev Agent 框架就特別有價值。它的出發點不是單純的 AI 助手,而是讓你能夠打造出一個真的可以跑在自己環境裡、可以理解整個開發流程的 AI 工程師。從建置到部署,從 CLI 操作到瀏覽器查詢, 從多檔案編輯到自動測試,全部都能自己完成,甚至還能針對不同專案調整專屬的工作流。 對很多開始探索 AI 協作開發的團隊來說,這是一條 從 「AI 幫你寫一段程式」,走向「AI 幫你解決一整個任務」 的進化路徑。而且,還是在可控、可自定義、安全的環境裡完成的。 🧩 主要概述 OpenHands 是由 All‑Hands AI 開發的開源「軟體開發代理人平台」,能模仿人類工程師從建立程式、修改程式碼、執行指令,到瀏覽網頁、呼叫 API……等一整套開發流程 它提供雲端(OpenHands Cloud)與本地 Docker 運行版本,用戶能配置 LLM(如 Claude、OpenAI、Gemini…) 📚 核心特性與怎麼使用 代理人的工具能力 支援代碼編輯、命令行、執行環境、網頁瀏覽、API 呼叫—接近人類開發者完整技能。其中 OpenHands Cloud 版本提供 $50 試用額度讓大家方便使用,又或者如果自己本機有 docker 的話,可以自己Local 版本透過 Docker 自架環境。 ...