探索在Raspberry Pi上构建和部署Node.js项目的最佳实践。通过我们的专业提示和技巧,克服常见挑战,使您的项目顺利运行。
去年圣诞节,我收到了一份极其令人着迷的礼物,它占据了我许多周末的时间,甚至让我夜不能寐。它就是全新的Raspberry Pi Zero。
它带来了无穷无尽的可能性,并且情不自禁占据着我的大脑,所以我采取了唯一明显的行动方案就是把它扔进抽屉里,然后慢慢远离它。几个月后,我读到了同为双面间谍的Adam Lukens的一篇精彩文章。那篇文章给了我所需的鼓舞,让我卷起袖子,拂去Raspberry Pi上的灰尘,开始工作。为了额外的挑战,我决定在我的项目中加入Node.js。我将其称为Tot Tunes。
Tot Tunes:https://github.com/pingortle/tot-tunes
我只用了一两个小时就建立了一个可行原型,并短暂地感觉自己像个超级英雄。然后我发现了一个错误。我修复了那个错误,但又出现了许多其他小问题。如果断电或拔下电源怎么办?因此,我通过一系列的学习,并为我的小项目建立了一个工具库。我想分享的不仅仅是构建Tot Tunes本身的经验。这要归功于Adam详细的文章。我希望降低门槛,让更多人能够构建出色的产品,并满怀信心地运行它们,而无需经历我在项目中遇到的痛苦。
如果您想一边阅读本文一边动手构建一些东西,您需要一台安装了Raspbian的Raspberry Pi、对JavaScript基础有合理的掌握,以及安装Node.js。我们还将进行少量的shell脚本编写。
我构建了一个Node.js项目
您可能有一个一直渴望构建的小项目,如果没有,我为您准备了一个简单的Node.js服务。请前往此处克隆项目,并按照自述文件中的说明进行设置。
项目:https://github.com/pingortle/til-node-raspberry-pi-delivery
如何部署?
部署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=Tot Tunes
[Service]
User=pi
ExecStart=/usr/local/bin/tot-tunes
Type=simple
Restart=always
[Install]
WantedBy=multi-user.target
将该文件放置在/etc/systemd/system/目录中。然后运行以下命令。
systemctl daemon-reload
systemctl enable tot-tunes.service
service tot-tunes start
通过这种简单的配置,您可以获得一个在重启和崩溃时自动重启的服务。另外,它还可以通过journalctl接口轻松访问应用程序的日志。
任务完成了吗?
在Raspberry Pi(Raspberry Pi)项目上进行开发既有趣又有点让人上瘾。但如果你像我一样,我们还渴望在我们小小的物联网霸主之外拥有自己的生活,所以并没有总是有时间花几个小时来学习一个新的操作系统或编程语言。
我们需要快速实现一个想法,这样我们就可以继续我们的生活,只需稍微多一点的JS自动化,因为你永远不会有太多的JS。
虽然我部分选择Node.js是作为一种有趣的挑战,但我认为它对于物联网新手来说还有其他优势。一方面,几乎每个人都知道一点JS,所以这是让那些想要快速提高生产力的人们的一条途径。如果你不是JS的粉丝,那么有大量的工具可以帮助你编写TypeScript、CoffeeScript和许多其他可以编译成JS的语言。npm 有成千上万的包,所以你可以借鉴他人的工作成果,而pkg允许我们将所有这些打包成一个可执行二进制文件,无需安装任何必要的依赖项。
npm:https://www.npmjs.com/
即使在你的下一个Raspberry Pi项目上使用Node.js和pkg有充分的理由,但在投入这个平台之前,你还是要权衡一下成本和收益。Node.js是一个相当大的依赖项,在二进制文件中包含运行时环境会创建超过30MB的文件。这会减慢部署速度,因为你必须传输整个二进制文件,而不仅仅是一些文本文件。此外,像任何解释型语言一样,你可能会遇到应用程序性能不可接受的情况。
这种设置非常适合启动一个简单的服务,但我认为我们可以继续改善Raspberry Pi和Node.js的体验。在为Raspberry Pi构建软件时,最大的矛盾之一是,你可以通过在设备本身上进行开发来获得快速且更高保真度的反馈,但你可能没有习惯使用的所有好工具。如果你选择在舒适的笔记本电脑上构建软件,那么每次你想在Raspberry Pi上测试代码时,都可能会经历等待部署的痛苦。
另一个困扰是设置服务配置的繁琐。在Raspberry Pi上手动编辑文件的过程很容易耗费你本来可以用来构建你热爱的东西的几个小时的时间。一个相关的问题是分发。如果你的非技术朋友来访并注意到了你的酷炫新玩意怎么办?如果你为别人建了一个项目,并且需要更新它怎么办?
这个领域充满了机遇,我很高兴能继续学习、建设和与你们分享。如果你正在用Raspberry Pi做令人兴奋的事情,并且这些与你产生了共鸣,请与我联系!关注树莓派开发者,了解更多树莓派相关内容!