在树莓派上构建和部署 Node.js 项目

探索在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=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允许我们将所有这些打包成一个可执行二进制文件,无需安装任何必要的依赖项。

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做令人兴奋的事情,并且这些与你产生了共鸣,请与我联系!关注树莓派开发者,了解更多树莓派相关内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/54046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础考过软考信息系统项目管理师经验分享

选择适合的课程:如果你是零基础,建议找一些专门针对新手的课程,讲解通俗易懂。 刷题至关重要:软考的题库很庞大,多做题是必须的。 做好笔记和复习:上课时要做好笔记,课后及时复习,…

网络安全学习(二)初识kali

kali有两种界面模式,为了更好的适应windows用户,需要操作一下。 先更新一下kali,执行命令 sudo apt-get update 然后换界面 sudo apt install kali-desktop-gnome 等待,出现如下界面时,选择gdm3(键盘&a…

Mybatis中Like模糊查询三种处理方式

目录 Mybatis中Like模糊查询三种处理方式 1.通过单引号拼接${} 1)mapper接口 2)Mapper.xml 3)测试代码 4) 测试结果 2.通过concat()函数拼接(个人推荐使用这种) 1)mapper接口 2)Mapper.xml 3)测试代码 4) 测…

Requests-HTML模块怎样安装和使用?

要安装和使用Requests-HTML模块,您可以按照以下步骤进行操作: 打开命令行界面(如Windows的命令提示符或Mac的终端)。 使用pip命令安装Requests-HTML模块。在命令行中输入以下命令并按回车键执行: pip install request…

工厂模式(一):简单工厂模式

一、概念 顾名思义,带着工厂,两字肯定就是有标准、快速、统一等等一些工厂独有的特点。 那么什么是简单工厂模式呢? 定义:简单工厂模式是一种创建对象的设计模式,它定义了一个工厂类通过某个静态方法来生成不同类型的…

熵权法详细讲解+Python代码实现

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

C#/.NET/.NET Core技术前沿周刊 | 第 5 期(2024年9.9-9.15)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿&…

Docker安装mysql安装nginx安装Redis

Docker安装mysql 下载镜像 docker pull mysql:8.0注意,使用此方法安装镜像需要提前配置镜像源,详情看之前的文章 安装 docker run -d -p 3306:3306 \ --name mysql \ --restartalways \ --privilegedtrue \ -e TZAsia/Shanghai \ -e MYSQL_ROOT_PASSWORDroot \ mysql:8.0进…

[网络]https的概念及加密过程

文章目录 一. HTTPS二. https加密过程 一. HTTPS https本质上就是http的基础上增加了一个加密层, 抛开加密之后, 剩下的就是个http是一样的 s > SSL HTTPS HTTP SSL 这个过程, 涉及到密码学的几个核心概念 明文 要传输的真正意思是啥 2)密文 加密之后得到的数据 这个密文…

【南方科技大学】CS315 Computer Security 【Lab2 Buffer Overflow】

目录 引言软件要求启动虚拟机环境设置禁用地址空间布局随机化(ASLR)设置编译器标志以禁用安全功能 概述BOF.ctestShellCode.c解释 createBadfile.c 开始利用漏洞在堆栈上查找返回地址 实验2的作业 之前有写过一个 博客,大家可以先看看栈溢出…

【裸机装机系列】2.kali(ubuntu)-裸机安装kali并进行磁盘分区-2024.9最新

【前言】 2024年为什么弃用ubuntu,请参考我写的另一篇博文:为什么不用ubuntu,而选择基于debian的kali操作系统-2024.9最新 【镜像下载】 1、镜像下载地址 https://www.kali.org/get-kali/选择installer-image,进入界面下载相应的ISO文件 我…

【Android 13源码分析】WindowContainer窗口层级-2-构建流程

在安卓源码的设计中,将将屏幕分为了37层,不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析,整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

学习整理vue前端框架项目目录结构的含义

学习整理vue前端框架项目目录结构的含义 1、目录结构2、结构含义 1、目录结构 2、结构含义

EasyExcel拿表头(二级表头)爬坑,invokeHeadMap方法

OK,不废话,直接开干!说实话是有些坑,或者是我不会用吧 模板如下: invokeHeadMap 这个方法其实针对第一行就是表头的完全没问题。针对第二行的,我DEBUG拿到的是这样很明显,他拿到了第一行;既然…

PLC-Recorder 对西门子传动的采集方法

目录 一、增加西门子传动的通道 二、变量配置 2.1 语法格式 a:装置号 b:参数号 c:参数下标 2.2 配置及连接测试情况 三、正式采集 四、小结 PLC-Recorder V3.4.0版本增加了西门子传动参数采集的功能(增加了传动的设备类型&a…

详细介绍 Servlet 基本概念——以餐厅服务员为喻

什么是Servlet Servlet 是 Java EE(Java Platform, Enterprise Edition)中用于构建动态 web 应用的组件。它在服务器端运行,并能够处理客户端请求,生成动态响应。以下是对 Servlet 的详细介绍: 1. Servlet 的基本概念…

【Linux 20】进程控制

文章目录 🌈 一、创建线程⭐ 1. 线程创建函数⭐ 3. 给线程传参⭐ 4. 创建多线程⭐ 5. 获取线程 ID 🌈 二、终止线程⭐1. 使用 return 终止线程⭐ 2. 使用 pthread_exit 函数终止线程⭐ 3. 使用 pthread_cancel 函数终止线程 🌈 三、等待线程⭐…

召回02 Swing 召回通道

为了避免小圈子重合却误判物品相似度很高:降低小圈子对相似度的影响。

cc2530按键中断实现控制LED

1开启中断的步骤 1-1使能端口组的中断 IEN1 IEN2 实例 IEN2 | 0x10 //使能P1口中断 1-2 端口中断屏蔽 P0IEN和P1IEN P2IEN 实例 P1IEN |0x10; //使能P1_2口中断 1-3设置触发方式 PICTL 实例 PICTL |0X02 ;//P1_3到P1_2口下降沿触发 1-4设置中断优先级…

Android 13 固定systemUI的状态栏为黑底白字,不能被系统应用或者三方应用修改

目录 一.背景 二.思路 三.代码流程 1.colos.xml自定义颜色 2.设置状态栏的背景颜色 3.对View进行操作 ①.对Clock(状态栏左侧的数字时钟)进行操作 ②.对电池(BatteryMeterView)进行操作 4.锁屏状态栏 5.patch汇总 一.背景 客户需求将状态栏固定成黑底白字,并且不能让系…