”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 前端架构:如何免费托管您的 Web 应用程序

前端架构:如何免费托管您的 Web 应用程序

发布于2024-11-04
浏览:588

我正在开展一个个人项目,旨在帮助用户查找芝加哥音乐会。从架构角度来看,该项目的一个值得注意的方面是整个 Web 应用程序完全免费托管。

下图说明了架构组件:

Front-End Architecture: How to Host Your Web App for Free

免责声明:我没有受到我在这里提到的任何服务的赞助;我强调它们只是因为我发现它们很有用。

项目代码库

GitHub 是最受欢迎的免费托管代码库的平台。我还尝试过 Bitbucket 和 GitLab 等替代方案,它们也同样有效。老实说,这些选项中的任何一个都可以完成工作 - 只需选择一个并继续前进,无需过度思考。

前端工作流程编排

在专业环境中,您通常会直接与 AWS 或其他云服务提供商合作,从而使您能够完全控制部署、通知和监控。然而,这种方法需要更多的时间和精力。幸运的是,Netlify 和 Vercel 等服务消除了很多麻烦,简化了这一过程。它们允许快速部署,但依赖于其生态系统。一旦您的网站开始接收大量流量(数千次访问),最好检查免费套餐限制以避免意外费用。对于个人项目,我已经多次使用这些服务,到目前为止没有任何问题。

也就是说,Netlify 提供了一些开箱即用的功能。在架构图中,Netlify 自动提供了三个组件:

  • GUI 集成

Netlify 的 GUI 允许您集成代码库存储库 - 在我的例子中是 GitHub。 Netlify 了解 Next.js 应用程序的默认设置并使用它们无缝部署代码。

  • 静态站点托管

chicagomusiccompass.com 是一个静态 Web 应用程序,这意味着不涉及服务器。触发部署时,应用程序会生成存储在 S3 存储桶中的静态资产(HTML、JS 和 CSS)。然后,Netlify 使用 CloudFront 处理配置,为您提供现成的 URL。

  • Lambda 函数

静态站点通常需要从其他域获取数据。这通常需要一个代理,称为“前端的后端”(BFF)。默认情况下,客户端应用程序无权访问其他域,除非服务器通过 CORS 明确允许,但这并不总是常见的做法。对于这个项目,我使用代理从不同的域中提取 JSON 文件

Netlify 管理所有部署编排并提供一个 URL(子域),您可以将其链接到您的域以获得用户友好的 URL。

例如,这是我的项目的Netlify URL

https://clinquant-chebakia-f64a5b.netlify.app/

然后,我使用 CNAME 记录配置我的域,将 www 指向 Netlify URL:

Front-End Architecture: How to Host Your Web App for Free

当用户访问 https://www.chicagomusiccompass.com/ 时,DNS 会将域解析为其最终目的地 - Netlify URL ?.

虽然这里发生了很多事情,但其中大部分都是通过仪表板(GUI)进行配置的。关键是要理解一切是如何联系在一起的;剩下的只是浏览用户界面。

自动计划任务(Cron 作业)

cron-job.org 是一项允许您免费运行 cron 作业的服务。以下是它在此设置中的工作原理:

a) Netlify 部署挂钩:
Netlify 提供了一个可配置的 Webhook(URL 端点),触发后会重新部署站点。这确保了 chiagomusiccompass.com 可以在需要时自动更新。

Front-End Architecture: How to Host Your Web App for Free

b) cron-job.org 集成:
通过 cron-job.org,您可以安排一个 cron 作业——在本例中,设置为每天运行。该作业只是触发 Netlify 部署挂钩,提示 Netlify 每天重新部署(更新)站点。

Front-End Architecture: How to Host Your Web App for Free
注意:虽然chicagomusiccompass.com也有后端组件,但本文仅关注前端架构。

概括

chicagomusiccompass.com 是一个 Next.js 应用程序,构建后会生成一个静态站点(无服务器)以及几个 Lambda 函数。 GitHub 存储库与 Netlify 集成,因此每次推送到存储库都会触发新的部署。此过程会生成新版本的静态站点并更新 Lambda 函数。 Netlify 处理这些文件的部署并自动配置必要的网络基础设施,允许通过子域访问 Web 应用程序。此外,我还配置了自定义域chicagomusiccompass.com,以指向Netlify。该网站通过触发 Netlify 部署挂钩的每日 cron 作业保持最新状态。

该网站已经运行了几个月,目前没有获得太多流量,但就基础设施成本而言,我没有支付一分钱。

在专业环境中,根据项目要求,我可能会选择类似的解决方案,尤其是在早期阶段。后来,随着业务的增长和需求的发展,我可以迁移某些组件。

如今,前端架构变得非常令人兴奋,尤其是当您可以利用免费服务时。但是,请记住,如果一项服务是免费的,那么您可能就是产品

版本声明 本文转载于:https://dev.to/garciadiazjaime/front-end-architecture-how-to-host-your-web-app-for-free-29ke?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符提取最后一行,在Postgresql中,您可能需要遇到与在数据库中的每个不同标识相关的信息中提取信息的情况。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: ...
    编程 发布于2025-06-15
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-06-15
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-06-15
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-06-15
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-06-15
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中可能会遇到一个冲突,其中3派对软件包将另一个带有导入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    编程 发布于2025-06-15
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解决此问题,必须确保提供给HAAR CASCADE XML文件的路径有效。在提供的代码片段中,级联分类器装有硬编码路径,这可能对您的系统不准确。相反,OPENCV提...
    编程 发布于2025-06-15
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-06-15
  • 在JavaScript中如何并发运行异步操作并正确处理错误?
    在JavaScript中如何并发运行异步操作并正确处理错误?
    同意操作execution 在执行asynchronous操作时,相关的代码段落会遇到一个问题,当执行asynchronous操作:此实现在启动下一个操作之前依次等待每个操作的完成。要启用并发执行,需要进行修改的方法。 第一个解决方案试图通过获得每个操作的承诺来解决此问题,然后单独等待它们: co...
    编程 发布于2025-06-15
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-06-15
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-06-15
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-06-15
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-06-15
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-06-15
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-06-15

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3