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

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

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

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

評(píng)論