你好,我的名字是Lucas Wasilewski,就像自從我開始使用NodeJS 編程(2021 年初)以來我在github 上添加項目描述一樣,我一直想寫一些看起來像工具的東西,在我觀看有關該項目的紀錄片後,這種情況才有所增加,我驚訝於開源世界如何能夠有一些曲折,並且在需要時非常受歡迎。經過一週的大量頭痛之後,我決定寫這篇文章,以便未來想要這個挑戰的瘋狂程式設計師不會犯我犯過的同樣的錯誤。
JavaScript 運行時
這個術語很容易誤導那些不太了解主題的人,因此需要一個好的定義:
Javascript 執行時期是一種允許您在瀏覽器之外運行語言的工具
現在有3 個流行的運行時:NodeJS、Deno (Node Killer) 和Bun (Deno Killer),但它們基本上做同樣的事情:它們允許您在瀏覽器之外使用javascript 並使用其他庫來創建新功能,這非常好,因為您可以使用它們中的任何一個來建立伺服器、創建庫甚至移動或終端應用程式。
Node 和Deno 都是由同一個人創建的:Ryan Dahl,早在2009 年,他就創建了該工具,使開發人員能夠創建“異步IO”應用程序,也就是說,不會阻塞主線程,但仍會繼續回應請求,考慮到這一點,他創建了Libuv,一個專門做這件事的庫。在那之前,這個計畫只是一大堆C,如果他想讓更多人使用這個工具,他需要一些更容易理解和使用的語言,巧合的是,谷歌同時推出了V8,總的來說,這是一個超快速的javascript 編譯器,這使他將兩者結合起來,從而創建了Node.
一段時間後(更具體地說是9 年),Ryan 離開了該專案並開始從事其他他認為更有趣的事情,這讓他意識到一些可以在Node 中修復的錯誤,但社區已經非常大了退一步是不可能的,所以,決心做得更好,他創建了Deno,另一個承諾比Node 優越得多的IO 運行時,從今天(2024 年)開始,Deno 是2.0 版本,非常好用。對於專案和社區來說都是穩定的。
這整個故事讓更多的人加入了運行時社區,這也導致我們創建了 Bun,更好的是,我的和你的運行時!現在讓我們開始正題吧。
編譯V8
如前所述,V8 是 Node 引擎,因此我們必須實際下載它並手動編譯它才能存取其庫和標頭。由於它是一個 Google 項目,他們有自己的下載和編譯方法,因此為此我們必須遵循他們的手冊:鏈接,只需複製和貼上即可到達最終命令。
但是,我在這裡犯了一個錯誤,花了三天時間我才意識到我所做的一切都是錯的。使用以下命令產生建置設定檔後:
tools/dev/v8gen.py x64.release
您需要非常小心out.gn/x64.release/資料夾中的args.gn文件,因為它包含ninja(編譯工具)將用來產生庫文件的構建配置,一些舊教程使用v8_monolithic = true 參數,但在最近的版本中不再使用。根據這個 StackOverflow 評論,我們現在需要使用 is_component_build = true 參數來產生正確的檔案並在編譯檔案時修改標誌,這是一個非常愚蠢的事情,如果您不注意的話可能會浪費寶貴的時間。
正確放置其餘標誌後,我們只需要執行指令來編譯專案
ninja -C out.gn/x64.release
同時,去吃點東西吧,因為 V8 是一個非常廣泛的項目,有無數的測試,根據您的機器,這個過程很容易需要 1 小時或更長時間,所以讓它運行並繼續閱讀。
控制台.log 在哪裡?
編譯完成後,您可以查看 v8/samples/hello-world.cc 並開始了解如何編譯 javascript,但具體是以下幾行:
v8::Local<:string> source = v8::String::NewFromUtf8Literal(isolate, "'Hello' + ', World!'"); // Compile the source code. v8::Local<:script> script = v8::Script::Compile(context, source).ToLocalChecked(); </:script></:string>
繼續使用包含「Hello World」的字串,建立函數、循環、條件,當您意識到如果包含經典的console.log() 時,您將收到一個未定義的訊息,這讓您感到很困惑對我來說,我一直認為console 物件是V8 本身的一部分,但事實上Node 本身包含它,並且瀏覽器將它作為DOM 的一部分包含(2012 年的帖子說瀏覽器可能不支援console.log ),這意味著我們必須自己創建它。
你好世界!
為了能夠創建我們自己的函數,我們首先需要了解V8 適用於多個範圍,其中之一是上下文,通過它,運行時知道在其中的位置以及如何單獨執行腳本可能有一個全局對像在所有其他物件之間共享,我們將在其中插入自訂函數。
tools/dev/v8gen.py x64.release
透過這些行,我們能夠建立一個名為 global 的對象,我們插入了一個「列印」函數模板,該模板在執行時呼叫 Print 函數。
v8::Local<:string> source = v8::String::NewFromUtf8Literal(isolate, "'Hello' + ', World!'"); // Compile the source code. v8::Local<:script> script = v8::Script::Compile(context, source).ToLocalChecked(); </:script></:string>
Print 函數接收這個瘋狂的參數,其中包含有關javascript 中函數調用的信息,透過它,我們迭代其中的所有項目,將它們轉換為C 字串並將它們打印在屏幕上,非常直接,非常簡單,它完成了它的作用,這足以將它放入一個文件中,讀取它並在V8 上播放它(我把那個留在你手中)。
v8::Local<:objecttemplate> global = v8::ObjectTemplate::New(GetIsolate()); global->Set(GetIsolate(), "print", v8::FunctionTemplate::New(GetIsolate(), this->Print)); v8::Local<:context> context = v8::Context::New(GetIsolate(), nullptr, global); </:context></:objecttemplate>
利布夫
好吧,我希望到目前為止您已經能夠跟上,甚至已經停止閱讀來為您的自製Node 進行一些獨特的實現,但是V8 只會帶我們到目前為止,以便我們能夠更接近專業運行時我們需要讓javascript 能夠執行更多操作,為此我們將使用Libuv,它正是為此而創建的。
您可以在這裡找到安裝和編譯的教學。這裡需要注意的重要一點是,它使我們可以自由地執行非同步操作,即不阻塞主線程,從而允許程式在執行較繁重的工作(例如打開檔案或等待伺服器中的請求)時繼續執行插座)。
它本身已經內建了創建 http 伺服器的功能,因此我們只需將其與 V8 呼叫同步即可。毫無疑問,這不是一件容易的事,因為這兩個庫的介面有很大不同,因此很難將兩者連接起來,但總有一種方法,並且節點原始碼是開放的,因此請務必從其中偷取一些想法那裡
結論
我們已經到了另一篇文章的結尾,我們透過它來看看我在實現過程中註意到的一些細節。首先肯定是複雜性,當然,這不是一個簡單的項目,但是一旦你了解瞭如何與 V8 介面交互,事情就會進展得很快。
這個專案也讓我更了解 Node。事實上,運行時只是庫通訊的集合體,這使得理解更複雜的事物(如「事件循環」)如何運作變得非常容易。
如果你想看看我做對了什麼,或者可能做錯了什麼,請看一下 github 上的項目:done
空談很便宜,給我看程式碼 - Linus Torvalds
## 參考文獻
https://github.com/libuv/libuv
https://v8.dev/docs
https://stackoverflow.com/questions/71213580/cant-get-v8-monolith-to-genorate
https://github.com/ErickWendel/myownnode
https://github.com/WasixXD/done
以上是建立運行時的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3漢化版
中文版,非常好用

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具