探索在Raspberry Pi上構建和部署Node.js項目的最佳實踐。通過我們的專業提示和技巧,克服常見挑戰,使您的項目順利運行。
去年圣誕節,我收到了一份極其令人著迷的禮物,它占據了我許多周末的時間,甚至讓我夜不能寐。它就是全新的Raspberry Pi Zero。
它帶來了無窮無盡的可能性,并且情不自禁占據著我的大腦,所以我采取了唯一明顯的行動方案就是把它扔進抽屜里,然后慢慢遠離它。幾個月后,我讀到了同為雙面間諜的Adam Lukens的一篇精彩文章。那篇文章給了我所需的鼓舞,讓我卷起袖子,拂去Raspberry Pi上的灰塵,開始工作。為了額外的挑戰,我決定在我的項目中加入Node.js。我將其稱為Tot Tunes。
我只用了一兩個小時就建立了一個可行原型,并短暫地感覺自己像個超級英雄。然后我發現了一個錯誤。我修復了那個錯誤,但又出現了許多其他小問題。如果斷電或拔下電源怎么辦?因此,我通過一系列的學習,并為我的小項目建立了一個工具庫。我想分享的不僅僅是構建Tot Tunes本身的經驗。這要歸功于Adam詳細的文章。我希望降低門檻,讓更多人能夠構建出色的產品,并滿懷信心地運行它們,而無需經歷我在項目中遇到的痛苦。
如果您想一邊閱讀本文一邊動手構建一些東西,您需要一臺安裝了Raspbian的Raspberry Pi、對JavaScript基礎有合理的掌握,以及安裝Node.js。我們還將進行少量的shell腳本編寫。
我構建了一個Node.js項目
您可能有一個一直渴望構建的小項目,如果沒有,我為您準備了一個簡單的Node.js服務。請前往此處克隆項目,并按照自述文件中的說明進行設置。
如何部署?
部署Node.js項目的最顯而易見的方法是在Raspberry Pi上安裝Node.js,然后開始編寫代碼。有些工作流程可能很適合這種方法,但我知道我很快就會懷念筆記本電腦的強大功能和便捷性。另一種常見的方法是在筆記本電腦上編寫代碼,然后將代碼復制到Raspberry Pi上并運行npm install && npm start。每次更新代碼時,只需復制代碼并重新啟動服務即可。雖然這不是世界上最糟糕的情況,但我認為一定有另一種更好的方法。其中一個問題是,我受限于Raspbian軟件包存儲庫中可用的Node.js版本,因為我想使用更新版本的Node.js來提高性能和功能。解決此問題的常見方法是使用像nodenv這樣的工具來管理Node.js版本。但我意識到可以有不同的選擇。我是繼續在Raspberry Pi上管理所有這些基礎設施,還是嘗試尋找一種更簡單的方法?我最近聽說了一個項目,該項目將軟件包與Node.js運行時捆綁在一起,以便您可以將應用程序作為獨立的可執行文件分發。這最終解決了我的許多問題。您可以在GitHub上的zeit/pkg找到該工具。由于我現在處理的是二進制可執行文件,因此我知道我需要獲取一個適用于Raspberry PiCPU架構的Linux二進制文件。初步測試表明,從理論上講,pkg支持這些限制條件,但出現了一條錯誤信息。
nodenv:https://github.com/nodenv/nodenv
zeit/pkg:https://github.com/vercel/pkg
錯誤!無法在此處為'armv7'構建,僅能為'x64'構建
經過一番挖掘,我在github上找到了這個問題的評論。它表明,只要我的依賴項是純JavaScript,我就可以通過一個標志告訴pkg不要將結果編譯為字節碼,即pkg ... --no-bytecode。構建成功,所以我把二進制文件復制到了Raspberry Pi上。它起作用了!我再也不用擔心部署和開發版本的Node.js同步問題了。我可以直接將這些配置檢入git。
問題的評論:https://github.com/vercel/pkg/issues/145#issuecomment-311150484
它起作用了!但它剛剛崩潰了...
我住在龍卷風巷附近。幸運的是,我的附近從來沒有真正發生過龍卷風。但不幸的是,每年都會有暴風雨來臨,然后就會停電。有時這只是電壓波動造成的短暫停電,但無論如何,我的沒有電池的Raspberry Pi都會在沒有警告的情況下重新啟動。關鍵是,我的Raspberry Pi服務需要為大自然帶來的任何事情做好準備。由于我使用的是Raspbian,因此systemd似乎是完成這項工作的合適工具。我不知道如何編寫systemd服務,但這似乎是學習的完美借口。它實際上非常容易制作!命令行界面非常直觀,您只需創建一個描述如何運行服務的文件即可。
[Unit]Description=TotTunes
[Service]User=piExecStart=/usr/local/bin/tot-tunesType=simpleRestart=always
[Install]WantedBy=multi-user.target
將該文件放置在/etc/systemd/system/目錄中。然后運行以下命令。
systemctl daemon-reloadsystemctl enable tot-tunes.serviceservice tot-tunes start
通過這種簡單的配置,您可以獲得一個在重啟和崩潰時自動重啟的服務。另外,它還可以通過journalctl接口輕松訪問應用程序的日志。
任務完成了嗎?
在Raspberry Pi(Raspberry Pi)項目上進行開發既有趣又有點讓人上癮。但如果你像我一樣,我們還渴望在我們小小的物聯網霸主之外擁有自己的生活,所以并沒有總是有時間花幾個小時來學習一個新的操作系統或編程語言。
我們需要快速實現一個想法,這樣我們就可以繼續我們的生活,只需稍微多一點的JS自動化,因為你永遠不會有太多的JS。
雖然我部分選擇Node.js是作為一種有趣的挑戰,但我認為它對于物聯網新手來說還有其他優勢。一方面,幾乎每個人都知道一點JS,所以這是讓那些想要快速提高生產力的人們的一條途徑。如果你不是JS的粉絲,那么有大量的工具可以幫助你編寫TypeScript、CoffeeScript和許多其他可以編譯成JS的語言。npm有成千上萬的包,所以你可以借鑒他人的工作成果,而pkg允許我們將所有這些打包成一個可執行二進制文件,無需安裝任何必要的依賴項。
即使在你的下一個Raspberry Pi項目上使用Node.js和pkg有充分的理由,但在投入這個平臺之前,你還是要權衡一下成本和收益。Node.js是一個相當大的依賴項,在二進制文件中包含運行時環境會創建超過30MB的文件。這會減慢部署速度,因為你必須傳輸整個二進制文件,而不僅僅是一些文本文件。此外,像任何解釋型語言一樣,你可能會遇到應用程序性能不可接受的情況。
這種設置非常適合啟動一個簡單的服務,但我認為我們可以繼續改善Raspberry Pi和Node.js的體驗。在為Raspberry Pi構建軟件時,最大的矛盾之一是,你可以通過在設備本身上進行開發來獲得快速且更高保真度的反饋,但你可能沒有習慣使用的所有好工具。如果你選擇在舒適的筆記本電腦上構建軟件,那么每次你想在Raspberry Pi上測試代碼時,都可能會經歷等待部署的痛苦。
另一個困擾是設置服務配置的繁瑣。在Raspberry Pi上手動編輯文件的過程很容易耗費你本來可以用來構建你熱愛的東西的幾個小時的時間。一個相關的問題是分發。如果你的非技術朋友來訪并注意到了你的酷炫新玩意怎么辦?如果你為別人建了一個項目,并且需要更新它怎么辦?
這個領域充滿了機遇,我很高興能繼續學習、建設和與你們分享。如果你正在用Raspberry Pi做令人興奮的事情,并且這些與你產生了共鳴,請與我聯系!關注樹莓派開發者,了解更多樹莓派相關內容!
-
Raspberry Pi
+關注
關注
2文章
613瀏覽量
22539 -
樹莓派
+關注
關注
118文章
1881瀏覽量
106243 -
NODE.JS
+關注
關注
1文章
49瀏覽量
32867
發布評論請先 登錄
相關推薦
Node.js 給前端帶來了什么
【Intel Edison試用體驗】XDK篇:Node.js操作SQLite3
【orangepi zero試用體驗】安裝Node.JS運行環境與示例
node.js的js要點總結
node.js在訓練好的神經網絡模型識別圖像中物體的方法
第3部分:使用NoDE.JS的程序
Node.js 內存泄漏問題初探
介紹Node.js應用全鏈路信息獲取的方法
Node.js小科普和Node.js安裝常見管理工具

Bun 1.2震撼發布:全力挑戰Node.js生態的JavaScript運行時新星

評論