跳到主要內容

技術轉換需知,學習 Node.js 的前期準備

image


技術轉換需知,學習 Node.js 的前期準備


持續推廣 node.js 對於新手教學上,通常會遇到許多狀況,以及許多不同的迷思,總和出來其實可以看到一些常見的問題。
這篇文章也是藉由數次的活動發想實踐當中,延伸出來的導讀文章之一,也是每次在活動一開始的時候,就會跟大家介紹的這門技術的一個初探介紹部分。

學習之前,先學會忘記

就像是所有武功絕學一樣,要學一門武功,一個新的技術,首先你需要改變自己的既有思想,這實際上真的很難,但就對於自己來說,也很有多既有概念,框架其實是無法捨棄,但是既然決定學習一件新事物,那勢必就是要改變。
對於已經有學習過一些程式編輯,或者一些程式框架的開發者,建議一開始學習 node.js 的朋友,先忘記掉所有你學過的語言,以及開發方式,試著忘記既有框架的狀況下,去學習這門技術。
在沒有既定框架下,不去過分討論,比較任何語言上的差異,而是先從他的背後歷史意義,演進接著再瞭解近期的改變以及未來規劃等。
以 Node.js 來說,在 2009 年,給與的示範就是一個聊天室,也表現提高 high concurrency 的實做,在當時定爲爲處理高承載量的新語言新服務,透過 JavaScript 實踐出來的結果。
到了 2012, 2013 年開始, Node.js 朝向不同環境中,透過許多公司投入全職開發者,將 Node.js 發佈到不同平臺上,同時依靠社群的力量,開始有極具的成長,也帶來不同的聲量。
最近的趨勢是開始走向, Node.js 嘗試解決分散式系統架構,以及直接嵌入式系統中,所以意味着開始有許多不同的發展,也有發展出不同於 Web 的應用。

JavaScript 並不是 bala, bala, bala …

講了許多過去歷史,雖然說大家已經開始試著要去忘記以往框架這件事情,但是我相信一開始還是做不到,這真的很難,但是請務必嘗試著,至少試著親手輸入每次的程式碼以及每次的相關測試,哪怕只是 hello world,跟着一起從頭開始進行所有流程。
在開宗明義上,根大家說,Node.js 其實就是在寫 JavaScript ,拋棄以往對於所有瀏覽器上的謬誤,以及對於所謂 IE 或者其他瀏覽器上面可能發生的錯誤。現在開始所有的事情都發生在背後,全部的事情都是在伺服器裏面進行。
所以可以說是,Node.js 程式編輯,其實是使用 JavaScript 爲基礎,透過 Google V8 engine (JavaScript interpreter) 進行後端程式的編譯。

非同步 ASYNC & 同步 SYNC

在以往的程式開發,一般的教育上我們都跟所有人講說, synchronization 序列化的程式開發,意思就是每個程式都是序列化進行,每個程式都是一步一步的慢慢進行。
在開始 Node.js 之前,接觸程式之前執行任何範例之前,我們必須記住在 Node.js 裏面,所有的東西都是非同步化,這也意味著其實你無法預測程式什麼時候會結束。
雖然聽起來有點怪異,不過這的確比較像是真實世界正在發生的狀況,最常舉的例子就像是準備早餐,當一開始準備早餐的時候,其實就是一個 process ,一開始我們需要準備煎蛋,準備咖啡,準備麵包。
如果使用 sync 的方式進行,我們的進行程序會變成
/*
1. 先開始煎蛋,直到蛋煎好了
2. 開始泡咖啡,直到咖啡煮開了
3. 開始烤麵包,直到麵包完成
*/

getEgg();
getCoffee();
getBread();
序列化的方式增加我們的準備時間,整個準備時間開始大幅增加,因爲每個執行序列都是一個一個完成後才開始執行。
可是在現實世界裏面,我們會怎麼做?
* 開始煎蛋(做好了,再取蛋)
* 開始泡咖啡(泡好了,再拿咖啡)
* 開始烤麵包(做好了,再拿麵包)

var cook = require("cook");

cook.getEgg(function (egg) {
    return egg;
});

cook.getCoffee(function (coffee) {
    return egg;
});

cook.getBread(function (bread) {
    return egg;
});
在執行 async process 當下,我們就直接進行了所有的事情,執行了所有方法一開始我們就並行了所有的程式,並不是一個一個等待,而真正完成時間我們並不知道,我們知道的是,這些事情其實都是同時並進。
所以程式並不是一個等待一個,一個等待一個,而是一次性的併發出來,觸發之後再進行通知動作。

Callback 程式藝術

剛剛提到的 Async,肯定要提到的就是 callback 這個特性,所有的流程處理都是在 callback 裏面所進行,這聽起來有點難懂,大部分的人也搞不清楚到底是怎麽一回事。
最長舉的例子就是直接啓動一個新的服務器。
var server = require("http");
var fs = require("fs");

server.createServer(function (req, res){

  res.end(content);


}).listen(3000);

console.log("start server");
特別要說明的部分就是,大部分的程式都是採用類似的方式執行,注意 createServer 這個部分,裏面的匿名函式雖然宣告,但是並不是直接觸發,而是等到當有使用者登入伺服器的時候才會觸發這個事件。
這也是通用的 callback 寫法,大部分的處理都是如此,就只要先記住這種寫作的感覺。
所以這也意味著,雖然 Node.js 是單一 Process 的程式,實際上可以透過 callback / event driven 機制達到類似像 mulit-thread。

爲何要學習 Node.js ,優勢?

最後是給所有對於 Node.js 質疑的人,Node.js 從 2009 年宣告之後,被發展到今天的狀況,透過 open source 的力量,加上許多企業全力的合作,已經把 Node.js 這個程式形成一股無法動搖的力量,也成爲這些企業的基礎建設之一。
就實際上來說,我們可以說 Node.js 可以透過程式開發來瞭解到平行化處理的流程,同步化處理的效益,因爲使用 event-driven 的特性,加上 v8 engine 的效能,因此 Node.js 在相同機器底下能夠支撐的 concurrency 會提高許多,所以對於開發高併發,高承載量的服務器其實是很有幫助的。
雖然說這對於開發成本上是比較高的,但另外一方面,這也是對於前端開發者的一個優勢,因爲沒有人比前端還要瞭解 JavaScript 特性,目前來說大部分真正瞭解 JavaScript 特性的就是前端開發者,也表示你們可以親眼見證轉職的可能性與機會。

後續討論

大部分的人都會問,對於目前的項目有沒有可以建議的 FRAMEWORK ,或者問現在是否適合改變到 Node.js 進行改寫。首先這個問題,沒有絕對的答案,但是先問自己,
  • 目前這個網站運作,有需要提高高承載量的需求?
  • 允許多久時間進行網站改寫,能否接受至少一個月沒有任何新進度?
如果以上答案都是 Y ,那答案就在各位心中。
在最近幾年其實 Node.js 已經有許多更多不同的變形,例如透過 node-webkit 可以進行 GUI 程式開發,透過 johnny-five 可以將 js 程式直接執行在 aduino 上面。甚至目前也有許多 robots 可以用 Node.js 進行程式開發。有人聽過 JavaScript 也可以寫音樂嗎?
因爲這些種種,我們必須承認 Node.js 的確對於 JavaScript 這門語言帶來巨大的震撼與改變。今年度 JSDC 2014 ,我們也特別規劃許多對於企業端,開發,JavaScript 最新流行趨勢的方向邀請各國講者來到臺灣。最精彩所有 JavaScript 頂尖技術全部都在 JSDC 2014

留言

這個網誌中的熱門文章

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. 我們先預設各位,應該都有聽過,西遊記!如果沒有聽過西遊記的,請右轉出去,謝謝! 先來談談向量 在《西遊記》的世界裡,我們可以把 向量想像成一種「內容座標」 ,讓系統知道每個角色、場景、法術等的 「位置」和「距離」 。向量幫助語言模型知道不同內容之間的關聯程度。 向量就像內容的「距離」和「位置」 比方說,唐三藏的 「位置」(向量)會接近「佛經」和「取經」 的概念,因為他一路上都是為了取經而前進。孫悟空的 向量位置則會更靠近「金箍棒」和「七十二變」 這些概念,因為這些是他的特徵。 相似內容靠得更近:像「佛經」和「取經」會靠近唐三藏的向量,因為它們彼此有很強的關聯。 相差較大內容會離得較遠:像「取經」和「妖怪」「妖怪的寶藏」就距離比較遠,因為妖怪的寶藏和取經的目標關聯性不大。 是誰決定的這些位置? 簡單來說,這些位置和關係是模型自己學出來的。語言模型會閱讀大量的資料和這世界觀的資訊,觀察哪些詞語經常一起出現,根據「共同出現的頻率」來決定它們的關係,並且自動生成向量。例如: 如果模型看到 「唐三藏」 總是和 「取經」 一起出現,它就會讓「唐三藏」的向量靠近「取經」。

npm 還可以看影片,沒想到真的有人這麼做

 還真的有人做這件事情, 庆余年2剛上線,有一位小哥竟然利用 npm 包的機制,將整套高清視頻都搬上來了。 https://x.com/fengmk2/status/1791498406923215020 圖片來源, https://x.com/fengmk2/status/1791498406923215020/photo/1 此 Package 出處 https://www.npmjs.com/package/lyq2?activeTab=versions 截圖留念, 機制說明 NPM(Node Package Manager)是一個流行的 JavaScript 軟件包管理器,用於管理和分發 Node.js 應用的依賴。它允許開發者將自己的代碼打包成「包」,並上傳到 NPM 的公共註冊表,供其他開發者下載和使用。這個過程通常包括以下步驟: 創建 NPM 包 :開發者將自己的代碼和相關文件打包成一個 NPM 包。 上傳到註冊表 :將包上傳到 NPM 的公共註冊表。 下載和使用 :其他開發者可以通過 NPM 命令行工具下載並安裝這些包。 這位小哥利用這一機制,可能是通過將整套高清視頻文件打包成 NPM 包並上傳到公共註冊表。其他人只需通過簡單的 NPM 命令即可下載這些視頻文件。 影響 版權問題 :這種行為涉及明顯的版權侵犯。高清視頻通常受到版權保護,未經授權的分發和下載都是非法的。 NPM 註冊表的可靠性 :這類內容的出現可能會損害 NPM 註冊表的可靠性和聲譽。NPM 註冊表是開發者分享和使用代碼的重要平台,如果充斥著這些不合法的內容,會影響其公信力。 潛在的安全風險 :將視頻文件偽裝成 NPM 包可能會帶來潛在的安全風險。下載這些包的用戶可能會無意中下載到惡意軟件或其他有害內容。 技術濫用 :這一行為展示了技術的濫用,原本為了方便開發者分享和使用代碼的機制,被用來分發非法內容,會對整個開發者社區造成負面影響。 歡迎留言給我,讓我們得到更多討論,一起回饋更多可能。 如果對於技術架構或者技術開發有相關需要顧問教育訓練服務或專案開發,聯絡方式如下,或者是與皇漢科技 EXMA-Square 進行聯繫。 FB: https://www.facebook.com/clonncd/ Twitter: https://twitter.com/clonncd 熱血漢誌: htt

從易經八卦到 AI 應用:用 LLM 自動化數據整理的工程探險

從 2023 年開始,在去年 為何技術老人這樣想那樣做? 的那場分享之前,就開始探索管理的更多可能性,以及探索更深層的奧秘,宇宙的二進位,生活中的陰與陽,到透過朋友深入探索 8 進位和 64 進位的玄學領域。 一開始只是想將自己體驗進行工程的還原,先是以為透過 ai 可以很快(偷懶)就可以解決掉資訊整理的問題,這邊有些踩雷的過程,以及對於整體實作的紀錄,分享給大家。 人生,原本以為很輕鬆的事情,最後都會不太容易 原本目標是希望將網路上許多的八卦資訊,以及六十四卦象內容,透過 AI 將資料進行彙整,就資料進行整合以及釐清就花了些時間 (汗) 以下且聽我慢慢道來 ... . 思緒步驟 大概步驟會是這樣,首先進行基礎八卦資訊搜集,大概由乾掛到坤卦,這些都可以在網路上容易取得,(這邊採用的是先天八卦順序) https://chatgpt.com/share/672083ea-4000-8010-ae50-3e120d845244 接著進入重點, 64 卦目前並沒有太多工程項目可以進行整合資料,因此主要透過 ChatGPT 產生資訊,以及透過 wiki 進行先達到快速效果。 https://chatgpt.com/share/67208416-c210-8010-9d43-a8c7235a1b03 緊接著,就會得到一串很像是 64 掛的內容, 不看不知道,一看嚇一跳,取得資料中會包含錯誤資訊,對應錯誤的上下卦,但畢竟是電腦,有錯很正常,這才是我認識的 ChatGPT (這邊也有試過 Claude 也有相同問題)。 校正回歸 此時經驗就非常重要,透過 AI 協助我們進行資料編寫比對,但不是單純的比對,而是要先想清楚自己的目標是什麼。 64 卦,兩兩相對。 64 卦,每個卦象不重複。 基礎於一開始 『懶』的狀態 , 首先直覺性的,是將比對錯誤的 json 直接丟入,原本預計透過 chain of thought 的方式,讓 llm 進行重複確認,但 ... 測試發現,需要透過 llm 產出原生資料越大時,隱藏的重複錯誤性會隨之提高。 llm 不轉,我轉 因此,這邊的解法朝向糾錯為主。 首先回到目的性,我們需要得到的結果是 完整的 64 卦象 取得對應的正確上下卦位置。 當我們有這樣明