构建与部署Node.js项目:在树莓派上的实用指南

图片

探索在Raspberry Pi上构建和部署Node.js项目的最佳实践。通过我们提供的专业提示和技巧,克服常见挑战,确保您的项目顺利运行。

去年圣诞节,我收到了一个极具吸引力的礼物,这让我在很多周末都沉浸其中,甚至彻夜难眠。这个礼物就是全新的Raspberry Pi Zero。

这个小设备带来了无限的可能性,令我产生了强烈的好奇心,最终我选择将它放进抽屉,暂时远离。几个月后,我偶然间阅读了一篇由同为双面间谍的Adam Lukens撰写的精彩文章。这篇文章激励我重新拿出Raspberry Pi,开始动手实践。为了增加一些挑战,我决定将Node.js融入到我的项目中,并称之为“Tot Tunes”。

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 Pi CPU架构的Linux二进制文件。初步测试表明从理论上讲,pkg支持这些限制,但我收到了一个错误信息。

nodenv:项目链接

zeit/pkg:项目链接

错误处理与解决

错误!无法在此处为'armv7'构建,仅能为'x64'构建

经过深入研究,我在GitHub上找到了一条相关问题的评论。该评论指出,只要我的依赖项是纯JavaScript,我可以通过一个标志告知pkg不要将结果编译为字节码,即执行pkg ... --no-bytecode。通过这种方式构建成功后,我将二进制文件复制到Raspberry Pi上,并确认它能够正常工作!现在,我无需担心部署和开发版本的Node.js同步问题,可以直接将这些配置检入git。

问题的评论:链接

处理崩溃与重启

我住在被称为龙卷风巷的地方。虽然幸运的是,我的周边从未真正发生过龙卷风,但每年都会有暴风雨袭来,导致停电。有时电压波动会引起短暂停电,而没有电池的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项目上进行开发既有趣又略显上瘾。但如果您和我一样,渴望在物联网项目之外拥有自己的生活,可能不会总有时间花费几个小时来学习新的操作系统或编程语言。

我们需要快速实现想法,以便继续我们的日常生活,同时也希望有一些JS自动化,因为你永远不会觉得JS太多。

虽然我部分选择Node.js是基于挑战性,但我认为它对物联网新手来说还有其他优势。一方面,几乎每个人都对JavaScript有一定了解,这为那些希望快速提高生产力的人提供了一条途径。如果您并不喜欢JavaScript,还有许多工具可以帮助您编写TypeScript、CoffeeScript及其他可以编译成JavaScript的语言。npm有成千上万的库可以使用,因此可以利用他人的成果,而pkg使我们能够将所有这些打包成一个可执行的二进制文件,无需安装任何必要的依赖项。

npm:项目链接

即使在您的下一个Raspberry Pi项目中使用Node.js和pkg都有充分的理由,但在投入这个平台之前,您仍然需要权衡成本与收益。Node.js是一个相对较大的依赖项,将运行时环境包含在二进制文件中可能会产生超过30MB的文件。这会减慢部署速度,因为您需要传输整个二进制文件,而不仅仅是一些文本文件。此外,像任何解释型语言一样,您可能会面临应用程序性能不佳的情况。

这种设置非常适合启动简单的服务,但我认为我们可以不断改善Raspberry Pi和Node.js的使用体验。在为Raspberry Pi构建软件时,一个主要矛盾是,您可以通过在设备上直接开发获得快速且高保真的反馈,但您可能缺乏常用的优秀工具。如果选择在舒适的笔记本电脑上进行软件开发,则每次想在Raspberry Pi上测试代码时,都会经历长时间等待部署的过程。

另一个挑战是配置服务所需的繁琐过程。在Raspberry Pi上手动编辑文件容易消耗您本可以用于构建热爱的项目的几个小时。一个相关的问题是分发。如果您的非技术朋友来访并对您的新设备感兴趣,您该如何应对?如果您为他人构建了项目并需要更新该项目,该怎么办?

这个领域充满了机会,我期待继续学习、构建并与大家分享。如果您在使用Raspberry Pi进行令人兴奋的项目,并与我有共鸣,欢迎与我联系!请关注树莓派开发者,以获取更多相关内容!