使用 Cloudflare 和全栈框架实现快速开发

news2024/11/18 22:47:28

去年 Cloudflare 发布了一系列新功能,使在 Cloudflare 上部署 Web 应用程序变得更加容易,我们看到 Astro、Next.js、Nuxt、Qwik、Remix、SolidStart、SvelteKit 和其他托管 Web 应用程序的大幅增长。

近日 Cloudflare 对这些 Web 框架的集成模块进行了重大的升级,使其在开发中使用 Cloudflare 的 D1 数据库、R2 对象存储、AI 模型以及 Cloudflare 开发者平台的其他强大功能的复杂应用程序变得更加容易。

在过去,如果想使用 D1 开发一个由 Web 框架驱动的应用程序并在本地运行它,必须构建应用程序的生产版本,然后使用「wrangler Pages dev」在本地运行它。

虽然这有效,但每次代码迭代都需要几秒钟,对于大型应用程序来说需要几十秒。使用生产构建进行迭代实在是太慢了,会让我们脱离流程,并且不允许利用框架作者投入大量精力的所有 DX 优化,现如今这种情况正在改变。

我们的目标是以最自然的方式与 Web 框架集成,开发人员在将应用程序部署到 Cloudflare 时无需学习和采用重大的工作流程更改或自定义 API。

无论你是 Next.js、Nuxt 开发人员还是更喜欢其他框架,现在都可以继续使用你熟悉的本地开发工作流程,并将您的应用程序发布到 Cloudflare 上。

所有全栈 Web 框架都配有本地开发服务器,该服务器是根据框架定制的,通常会提供出色的开发体验,只有一个例外:它们本身不支持 Cloudflare 开发平台的一些重要功能,尤其是我们的存储解决方案。

你不得不做出艰难选择:要么使用特定框架的开发服务器开发应用,但放弃许多 Cloudflare 功能;要么充分利用 Cloudflare 平台包括 D1 或 R2 等资源,但放弃特定框架的开发工具。

这样,你的迭代周期会变慢,浏览器中看到代码更改结果的时间将从毫秒级变为秒级。但现在不再如此!让我们来看看。

构建应用程序

让我们使用 C3(create-cloudflare CLI)创建一个新应用程序。我们可以使用我们选择的任何包管理器,但为了在这篇文章中保持简单,我们将坚持使用默认的 npm 客户端。只需运行:

npm create cloudflare@latest

为您的应用程序提供一个名称,或者坚持使用随机生成的名称。然后选择「网站或网络应用程序」类别,并选择您选择的全栈框架。

我们支持多种:Astro、Next.js、Nuxt、Qwik、Remix、SolidStart 和 SvelteKit。

由于 C3 将应用程序搭建委托给最新版本的特定于框架的 CLI,因此您将完全按照框架作者的意图搭建应用程序,而不会错过任何框架功能或选项。然后,C3 会将集成和部署到 Cloudflare 所需的一切添加到您的应用程序中,这样您就无需自行配置。

通过我们的应用程序脚手架,只需几个步骤即可让它显示存储在数据库中的产品列表。首先,我们将数据库的配置添加到 wrangler.toml 配置文件中:

[[d1_databases]]
binding = "DB"
database_name = "blog-products-db"
database_id = "XXXXXXXXXXXXXXXX"

现在,您可以通过 wrangler.toml 文件配置绑定资源,甚至对于部署到 Pages 的全栈应用程序也是如此。我们将在专门的公告中分享更多有关页面配置增强的信息。

现在让我们创建一个简单的 schema.sql 文件来表示我们的数据库模式:

CREATE TABLE products(product_id INTEGER PRIMARY KEY, name TEXT, price INTEGER);
INSERT INTO products (product_id, name, price) VALUES (1, 'Apple', 250), (2, 'Banana', 100), (3, 'Cherry', 375);

并初始化我们的数据库:

npx wrangler d1 execute blog-products-db --local --file schema.sql

请注意,我们使用 wrangler d1 execute–local 标志将更改应用到本地 D1 数据库。这是我们的开发服务器将连接到的数据库。

接下来,如果您使用 TypeScript,请运行以下命令让 TypeScript 了解您的数据库:

npm run build-cf-types

该命令针对通过 C3 创建的所有全栈应用程序进行了预配置,并执行 wrangler types 来更新包含所有已配置绑定的 Cloudflare 环境的界面。

我们现在可以通过一个方便的快捷方式启动框架提供的开发服务器:

npm run dev

此快捷方式将启动框架的开发服务器,无论它是由 next dev、ninto 还是 vite 提供支持。

开发工作流程

为了减少开发延迟并保留特定于自定义框架的体验,我们需要使 Web 框架及其开发服务器能够以无缝、几乎不可见的方式与 wrangler 和 miniflare 集成。

Miniflare 是这个难题的关键组成部分。它是我们针对 Cloudflare 特定资源的本地模拟器,由我们的 JavaScript 运行时 workd 提供支持。

通过依赖 workerd,我们确保 Cloudflare 的 JavaScript API 以忠实模拟我们生产环境的方式在本地运行。问题在于框架开发服务器已经依赖 Node.js 来运行应用程序,因此将另一个 JS 运行时引入其中会破坏这些开发服务器的架构方式的许多假设。

然而,我们的团队想出了一个有趣的方法来弥合这两个 JS 运行时之间的差距。我们称之为 getPlatformProxy() API,它现在是 wrangler 的一部分,并由 miniflare 的魔法代理提供强大支持。

该 API 公开了一个 JS 代理对象,其行为就像包含所有绑定资源的普通 Workers env 对象一样。代理对象使 Node.js 中的代码能够透明地调用在workerd 中运行的 JavaScript 代码,以及访问特定于 Cloudflare 的运行时 API。

借助 Node.js 和 Workerd 运行时之间的这座桥梁,您的应用程序现在可以在由 Node.js 提供支持的开发服务器中运行时,直接访问 D1、R2、KV 和其他存储解决方案的 Cloudflare 模拟器。或者您甚至可以编写一个 Node.js 脚本来执行相同的操作:

import {getPlatformProxy} from 'wrangler';

const {env} = getPlatformProxy();
console.dir(env);
const db = env.DB;

const productsResults = await db.prepare('SELECT * FROM products').all();
console.log(productsResults.results);

有了 getPlatformProxy() API 可用后,剩下的工作就是更新所有框架适配器、插件,在某些情况下更新框架本身以使用此 API。

Vite 未来改进

虽然 getPlatformProxy() API 对于许多场景来说都是一个很好的解决方案,但我们还可以做得更好。如果我们可以在 JS 运行时而不是 Node.js 中运行整个应用程序,我们就可以更忠实地模拟生产环境,并减少开发人员的摩擦和生产意外。

在理想的世界中,我们希望您针对在生产中部署的相同运行时进行开发,这只能通过将workerd直接集成到所有框架的开发服务器中来实现,考虑到数量,这不是一个小壮举。现有的框架以及它们之间的差异。

不过我们还是有点幸运。当我们开始这项工作时,我们很快意识到 Vite 这个被许多全栈框架使用的流行开发服务器正在获得越来越多的采用。事实上,Remix 最近才转向 Vite,并证实了 Vite 作为当今 Web 开发的共同基础的受欢迎程度。

如果 Vite 能够为在替代 JavaScript 运行时中运行全栈应用程序提供一流的支持,那么我们就可以让任何使用 Vite 的人在本地开发其应用程序,并完全访问 Cloudflare 开发者平台。不再需要特定于框架的自定义集成和解决方法 - 所有开发人员都可以访问全栈框架、Vite 和 Cloudflare 的所有功能。

我们非常高兴能够与 Vite 团队就 Vite 环境提案进行合作,这可以实现这一点。该提案仍在不断完善中,敬请关注更新。

参考链接:https://blog.cloudflare.com/blazing-fast-development-with-full-stack-frameworks-and-cloudflare

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

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

相关文章

【Java网络编程】IP网络协议与TCP、UDP网络传输层协议

1.1、IP协议 当应用层的数据被封装后,想要将数据在网络上传输,数据究竟要被发往何处,又该如何精准的在网络上定位目标机器,此时起到关键作用的就是“IP协议”。IP协议的作用在于把各种数据包准确无误的传递给目标方,其…

LeetCode 378 有序矩阵中第K小的元素

题目信息 LeetoCode地址: . - 力扣(LeetCode) 题解内容大量转载于:. - 力扣(LeetCode) 题目理解 题意很直观,就是求二维矩阵中所有元素排序后第k小的数。 最小堆写法 该写法不再赘述,维护…

好看流光风格个人主页HTML源码

这是一款好看流光风格个人主页HTML源码,感觉挺喜欢的,需要的自行下载! 源码下载 好看流光风格个人主页源码

“进击的巨人”:服务器硬件基础知识解析

引言: 服务器是网络环境中负责处理数据、运行应用程序和服务多用户的高性能计算机系统。了解服务器的硬件构成有助于更好地管理和优化IT资源。 服务器和普通PC的差异: 服务器具有比个人电脑更高的处理能力、稳定性和可靠性,它们通常运行在没…

【JavaEE】浅谈线程(一)

线程 前言线程的由来线程是什么线程的属性线程更高效的原因举个例子(线程便利性的体现) 多线程代码线程并发执行的代码jconsole(观测多线程) 线程的调度问题创建线程的几种方法1)通过继承Thread 重写run2)使用Runnable接口 重写ru…

.NET8 和 Vue.js 的前后端分离

在.NET 8中实现前后端分离主要涉及到两个部分:后端API的开发和前端应用的开发。后端API通常使用ASP.NET Core来构建,而前端应用则可以使用任何前端框架或技术栈,比如Vue.js、React或Angular等。下面是一个简化的步骤指南,帮助你在…

指针 基础知识

本笔记为观看56 指针-指针的定义和使用_哔哩哔哩_bilibili后的学习笔记 指针的定义和使用 1、定义指针 int main () {//1、定义指针int a 10;//指针定义的语法: 数据类型 * 指针变量名;int * p;//让指针记录变量a的地址p &a; //& 为取址符cou…

Mac资源库的东西可以删除吗?mac资源库在哪里打开 cleanmymacx是什么 cleanmymac免费下载

在使用Mac电脑的过程中,用户可能会遇到存储空间不足的问题。一种解决方法是清理不必要的文件,其中资源库(Library)文件夹是一个常被提及但又让人迷惑的目标。Mac资源库的东西可以删除吗?本文旨在解释Mac资源库的作用、…

Java常用函数接口

Java常用函数接口 Java 8 中引入的常用函数式接口,也就是 java.util.function 包中的接口。这些接口提供了一种简洁的方式来定义函数,常用于 Lambda 表达式和方法引用。下面是一些常用的接口: 一、Predicate(断言) …

应用性能分析工具CPU Profiler

简介 本文档介绍应用性能分析工具CPU Profiler的使用方法,该工具为开发者提供性能采样分析手段,可在不插桩情况下获取调用栈上各层函数的执行时间,并展示在时间轴上。 开发者可通过该工具查看TS/JS代码及NAPI代码执行过程中的时序及耗时情况…

c语言之动态内存管理及常见错误分析,柔性数组,内存划分

目录 前言 一:malloc,calloc,realloc,free四大函数 1.malloc 2.free 3.calloc 4.realloc 二:常见错误分析 1.malloc返回值不检查直接使用 2.对动态开辟空间的越界访问 3.对非动态开辟空间free 4.使用free释放动态开辟内存的一部分 5.对…

QAuth 2.0

OAuth 2.0授权框架支持第三方支持访问有限的HTTP服务,通过在资源所有者和HTTP服务之间进行一个批准交互来代表资源者去访问这些资源,或者通过允许第三方应用程序以自己的名义获取访问权限。 为了方便理解,可以想象OAuth2.0就是在用户资源和第…

多路转接-epoll/Reactor(2)

epoll 上次说到了poll,它存在效率问题,因此出现了改进的poll----epoll。 目前epoll是公认的效率最高的多路转接的方案。 快速了解epoll接口 epoll_create: 这个参数其实已经被废弃了。 这个值只要大于0就可以了。 这是用来创建一个epoll模…

用友U9 存在PatchFile.asmx接口任意文件上传漏洞

声明: 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 简介 用友U9是由中国用友软件股份有限公司开发的一款企业…

FJSP:狐猴优化算法(Lemurs Optimizer,LO)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题(Flexible Job Shop Scheduling Problem,FJSP),是一种经典的组合优化问题。在FJSP问题中,有多个作业需要在多个机器上进行加工,每个作业由一系列工序组成&a…

Linux(Ubuntu)中创建【samba】服务,用于和Windows系统之间共享文件

目录 1.先介绍一下什么是Samba 2.安装,配置服务 安装 配置(smb.conf) 配置用户 3.出现的问题(Failed to add entry for user XXXX) 4.创建文件夹 5.windows访问 1.先介绍一下什么是Samba Samba是一个开源的软…

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法,用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中,首先通过getElementById方法获取id为"myCanvas"的Canvas元素,然后使用getContext(“2d”)方法获取该Ca…

剑指Offer题目笔记26(动态规划的基础知识)

面试题88: 问题: ​ 一个数组cost的所有数字都是正数,它的第i个数字表示在一个楼梯的第i级台阶往上爬的成本,在支付了成本cost[i]之后可以从第i级台阶往上爬1级或2级。请计算爬上该楼梯的最少成本。 解决方案一:&…

【简单讲解下epoll】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

Day:004(1) | Python爬虫:高效数据抓取的编程技术(数据解析)

数据解析-正则表达式 在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样 把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 正则表达式是对字符串操作的一种…