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

去年 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

思诺流体邀您探索科技前沿2024年第13届生物发酵展

参展企业介绍 保定思诺流体科技有限公司是一家集研发、生产、销售于一体的高新技术企业。从事蠕动泵、蠕动泵软管、蠕动泵OEM产品、蠕动泵灌装系统等的研发、生产与销售。产品在科研实验室、化工、印刷、环保、水处理等领域得到了广泛应用。 “思诺”取自“Signal”的英…

Linux学习记录20——文件的隐藏权限

一.学习的内容 Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。既然叫隐藏权限,那么使用常规的ls命令肯定不能看到它的真面目。隐藏权限的专用设置命令是 …

认识JAVA语言(一)扩充

Java语言的程序控制结构 (2.5) 在Java语言中,程序的流程控制对于代码执行的逻辑有着至关重要的作用。通过条件控制和循环控制,程序可以做出决策、重复执行任务,并在合适的时间退出。本章将详细介绍这些结构,并通过代码示例和表格来…

D1084是一款具有5A输出能力、低压差为1.5V的三端稳压器。采用TO-220、TO-263和TO-252封装形式

1、 概述: D1084是一款具有5A输出能力、低压差为1.5V的三端稳压器。输出电压可通过电位器调节或1.5V, 1.8V, 3.3V三个固定电压版。内含电流限制和热保护功能,防止任何过载时产生过高的结温。D1084系列电路有标准TO-220、TO-263和TO-252封装形式。 2、 典…

短剧APP开发:探索剧情新领域,畅享精彩短剧时光

随着移动互联网的快速发展,短剧作为一种新兴的内容形式,以其短小精悍、情节紧凑的特点,逐渐受到广大用户的喜爱。为了满足用户对短剧内容的日益增长需求,我们决定开发一款全新的短剧APP,为用户带来前所未有的观剧体验。…

鼠标灵敏度怎么调,鼠标灵敏度怎么调最稳

鼠标和键盘是操作计算机过程中使用最频繁的设备之一,用电脑的时,我敢说你一定离不开鼠标。有些用户发现鼠标不太好用,尤其是在游戏时,总觉得鼠标移动太慢了。另外,如果你感觉鼠标按键失灵、鼠标单击变双击以及反应迟钝等等,出现这样的问题,应该是鼠标灵敏度没有调整好。…

先锋阀门带您领略2024第13届生物发酵装备展

参展企业介绍 温州先锋阀门有限公司坐落于【中国阀门城】---温州市龙湾,是一家集研发、设计、制造、销售和服务为一体的科技创新型企业。拥有10多项国家专利,三个产品荣获中国通用机械工业协会颁发的(中国国际阀门博览会)银奖称号,部分产品还…

干货 | 探索CUTTag:从样本到文库,实验步步为营!

CUT&Tag(Cleavage Under Targets and Tagmentation)是一种新型DNA-蛋白互作研究技术,主要用于研究转录因子或组蛋白修饰在全基因组上的结合或分布位点。相比于传统的ChIP-seq技术,CUT&Tag反应在细胞内进行,创新…

win10鼠标无限转圈圈是什么原因,win10系统鼠标无限转圈圈

win10鼠标无限转圈圈是什么原因?一般后台有程序在运行,鼠标出现圆圈转动则代表正在加载中,等待一会就好了。若如果转了好久的圈圈,程序没有响应,点击桌面也没有反应,则尝试打开任务管理器,将未响应或异常的程序强制结束掉。其实,出现这种情况,有可能是win10系统中的一…

HarmonyOS4.0 ArkUI常用组件

一、Image 语法: Image(src:string|PixelMap|Resource)使用方式: string格式:用来加载网络图片,需要在module.json5中申请网络访问权限:ohos.permission.INTERNET Image("http://xxx.png")PixelMap格式&am…

医保是如何报销的

《医保是如何报销的》 这是罗师兄的原创文章 预计5-6分钟读完 作者:罗师兄 地球号:luoyun515 很多时候大家听到医保报销比例80%,85%,90%等, 但真正报销后, 实际花费跟报销额度根本达不到这么高&#…

LeetCode-78. 子集【位运算 数组 回溯】

LeetCode-78. 子集【位运算 数组 回溯】 题目描述:解题思路一:回溯,回溯三部曲解题思路二:0解题思路三:0 题目描述: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的 子…

【OTA】STM32-OTA升级——持续更新

【OTA】STM32-OTA升级——持续更新 文章目录 前言一、ymodem串口协议1、Ymodem 协议2、PC3、蓝牙4、WIFI云平台 二、UDS车载协议1.UDS协议 总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、ymodem串口协议 1、Ymodem 协议 STM32 Ymodem …

上海亚商投顾:创业板指缩量下跌 有色等周期股逆势大涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指4月3日小幅调整,创业板指跌超1%,黄白二线有所分化。周期股持续走强,其…

电瓶车充电桩主板功能全解析

电瓶车充电桩主板是充电桩的核心部件,其功能涵盖了多个方面,以确保充电过程的安全、高效和便捷。主要功能包括: 智能化充电管理:电瓶车充电桩主板内置智能调度系统,可通过监测电池状态和控制充电流程,实现对…

【STL学习】(3)vector容器

前言 本章主要内容为两个部分: vector是什么?vector常用接口的使用。 一、vector的介绍 vector是表示可变大小数组的容器就像数组一样,vector也采用的连续空间来存储元素。也意味着可以采用下标对vector的元素进行访问,和数组一样…

IEEE顶刊!中科院2区TOP,影响因子逐年上涨!同领域IEEE-Trans,仅47天录用!

(一)期刊简介概况 【期刊类型】计算机医学类SCIE&EI 【出版社】IEEE出版社 【期刊概况】IF:7.0-8.0,JCR1区,中科院2区TOP 【版面类型】正刊,仅10篇版面 【预警情况】2020-2024年无预警记录 【收录…

Linux(centos7)部署spark

Spark部署模式主要有4种:Local模式(单机模式)、Standalone模式(使用Spark自带的简单集群管理器)、Spark On Yarn模式(使用YARN作为集群管理器)和Spark On Mesos模式(使用Mesos作为集…

fuse介绍,机制,调用流程

目录 fuse 引入 介绍 机制 远端服务的文件系统挂载到本地 自定义文件系统 调用流程 fuse内核驱动 用户态文件系统 梳理 fuse 引入 因为用户空间的需求多样,而内核提供的功能固定单一,所以为了迎合用户的需求,就需要引入用户空间驱动的概念 开发者可以通过编写用户空…

zookeeper中的znode节点的一些功能和应用

zookeeper是一个挺好玩的东西 有着独特的选举机制,一般在中小型集群中,zookeeper一般装在三个节点 其中只有一个节点对外提供服务,处于leader状态,另外两台未follower状态 这得益于zookeeper独特的选举机制,可以保证le…