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

Node.js網(wǎng)頁控制的機器人小車

介紹Node.js應(yīng)用全鏈路信息獲取的方法
Node.js小科普和Node.js安裝常見管理工具

Bun 1.2震撼發(fā)布:全力挑戰(zhàn)Node.js生態(tài)的JavaScript運行時新星

評論