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

news2024/9/20 16:55:03

探索在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.coloradmin.cn/o/2123218.html

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

相关文章

SpringBoot打包部署,打包成jar和war有所不同?

1. 我的一个springboot项目,用mvn install打包成jar,换一台有jdk的机器就直接可以用java -jar 项目名.jar的方式运行,没任何问题,为什么这里不需要tomcat也可以运行了? 2. 然后我打包成war放进tomcat运行,…

云服务器部署DB-GPT项目

本文收录于《DB-GPT项目》专栏,专栏总目录: 点击这里。 文章目录 项目介绍 一、登录云服务器 1. 进入控制台 2.点击容器实例(点数字) 二、创建容器实例 1. 等待容器实例创建好,创建好的容器实例如下:…

多个微信是怎么进行管理的?

随着微信逐渐成为企业商务沟通的重要平台,对于业务咨询量较大的行业(例如教育培训、旅游、美容以及医疗等)而言,在利用微信进行营销活动和客户服务的过程中,往往会遭遇多微信管理的困境。 在此情形下,选用工…

fwt变换模板

在算法竞赛中&#xff0c;FWT 是用于解决对下标进行位运算卷积问题的方法。 公式&#xff1a; 1.ij|k(j,k相或等于i) void Or(ll * a, ll type) { // 迭代实现&#xff0c;常数更小 for (ll x 2; x < n; x << 1) { ll k x >> 1; …

C++ 在项目中使用Git

目录 一&#xff1a;配置邮箱和姓名 二&#xff1a;生成SSH Key 三&#xff1a;git 工作区和状态 四&#xff1a;git log 常用法 五&#xff1a;git diff 常用法 六&#xff1a;git 分支操作 七&#xff1a;git 回溯分支 八&#xff1a;git rebase -i 压缩历史提交…

UML之类图详解

犬余&#x1f436; “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 零、什么是类图 类图&#xff08;Class Diagram&#xff09;是面向对象系统建模中最常用和最重要的图&#xff0c;它通过图形化的方式展示系统中的…

数学建模笔记—— 蒙特卡罗法

数学建模笔记—— 蒙特卡罗法 蒙特卡罗法1. 模型原理2. 常见问题2.1 圆周率问题2.2 三门问题 蒙特卡罗法 1. 模型原理 提出&#xff1a; 蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的“曼哈顿计划”的成员S.M.乌拉姆和J.冯诺依曼首先提出。数学家冯诺依曼…

《磊落轶荡 情寄菱花》——曹大铁先生书画文献展盛大开幕

出席文献展相关领导嘉宾合影 值2024年9月10日曹大铁先生诞辰108 周年之际&#xff0c;《磊落轶荡 情寄菱花》——曹大铁先生书画文献展在常熟市工人文化宫隆重揭幕。该展由曹大铁先生文学艺术弘扬、传承、研究的机构、国内外艺术名家、专家、收藏家、亲属等倡议&#xff1b;该…

芯片杂谈 -- 常聊的内核包含哪些模块

目录 1. R52内核速览 2. 处理器模块详解 3.内核的功能安全测什么&#xff1f; 4.小结 最开始接触到汽车MCU大都来自NXP、Infineon、Renesas&#xff0c;例如MPC5748、TC275、RH850 P1X等等&#xff1b; 而各大OEM、供应商等等发布的JD通常都会要求熟悉AURIX、PowerPC、G3K…

智能客服的演变:从传统到向量数据库的新时代

国产数据库的发展在21世纪初取得了显著的进展。根据不完全统计&#xff0c;目前在国内已有超过300种不同的数据库在案。这一现象在40年前几乎是不可想象的&#xff0c;标志着中国在数据库领域取得了巨大的突破和多样化选择。对于对老一辈的故事或数据库发展史充满兴趣的朋友们&…

从gerrit上拉取未合入的代码工程

一. 简介 本文简单学习一下&#xff0c;如何将 gerrit上未合入的代码拉取到本地。 二. 从gerrit上拉取未合入的代码工程 有时候本地的代码经过 自动化编译通过&#xff0c;提交到 gerrit上&#xff0c;但是有时候在代码实现上还需要做一些更改。这时候就需要从 gerrit上将这…

企业如何筛选达人进行投放?投放效果如何统计?

投放已经成为企业品牌营销策略的重要组成部分&#xff0c;如何去筛选出各平台的优质达人&#xff0c;以达到最大的投放效果&#xff0c;增强市场的竞争力呢&#xff1f;很多企业可能会借助一些官方投放平台数据进行分析&#xff0c;比如星图、蒲公英等。也可以用声量通进行账号…

精选干货!分享5款免费论文生成软件

在当今学术研究和写作领域&#xff0c;AI论文生成工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。以下是五款免费且功能强大的AI论文生成软件推荐&#xff1a; ### 1. 千笔-AIPassPaper…

【逐行注释】自适应Q的AUKF|MATLAB代码(附下载链接)

文章目录 逐行注释的说明运行结果自适应UKF介绍实现过程 部分代码各模块解释 逐行注释的说明 每一行都标有中文注释&#xff1a; 是我自己一个字一个字打的&#xff0c;如果有错别字等问题&#xff0c;欢迎指正。 运行结果 三轴的估计值、真值、滤波前的值对比&#xff1a…

家庭用超声波清洗机哪个品牌好用?好用的眼镜清洗机推荐

在我们的日常生活中&#xff0c;像眼镜、项链和耳环这些频繁使用的个人物品&#xff0c;经常面临灰尘积聚和细缝中难以触及的污渍问题。超声波清洗机凭借其深入微细缝隙的清洁能力&#xff0c;成为了解决这一难题的理想工具&#xff0c;确保了这些珍贵小物的彻底清新。不过现在…

魔搭上创建数据集

本文将介绍如何在魔搭上创建数据集&#xff0c;首先登录后通过网页创建数据库集。 通过 git 命令 clone 数据集 创建数据集&#xff0c;初始化训练数据和测试数据 train.csv&#xff0c;test.csv&#xff0c;注意 csv 的首行为列名称 创建子数据集&#xff0c;魔搭上子数据集…

智能监控中图像质量增强方法研究

粗略的构思步骤 摘要 本文深入探讨了智能监控系统中图像质量增强的关键技术,通过融合深度学习、传统图像处理算法及生成对抗网络(GAN)的优势,提出了一套高效且鲁棒的图像质量提升方案。本文详细描述了技术框架的每一个组成部分,深入剖析了技术原理,并详细阐述了实现步骤…

leecode100题-双指针-三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 答案中不可以包含重复的三元组。 示例 1&#xff1a; 输入…

Kubernetes------Service

目录 一、属性说明 二、定义和基本配置 1、定义 2、创建Service 2.1、typeClusterIP 2.2、typeNodePort 2.3、固定IP访问 三、Service、EndPoint、Pod之间的关系 四、服务发现 1、基于Service中IP访问外部服务 2、基于Service中域名访问外部服务 五、Ingress的安装和使…

react js 路由 Router

完整的项目,我已经上传了 资料链接 起因, 目的: 路由, 这部分很难。 原因是, 多个组件,进行交互,复杂度比较高。 我看的视频教程 1. 初步使用 安装: npm install react-router-dom 修改 index.js/ 或是 main.js 把 App, 用 BrowserRouter 包裹起来 2. Navigate 点击…