Table of Contents
Setting Up Your Environment
Routing and Templating
Hello, world!
Data Persistence with Workers KV
Handling User Submissions
Rendering Data on the Homepage
Deployment
Further Development
Home Web Front-end CSS Tutorial Building a Full-Stack Serverless Application with Cloudflare Workers

Building a Full-Stack Serverless Application with Cloudflare Workers

Apr 18, 2025 am 10:58 AM

Building a Full-Stack Serverless Application with Cloudflare Workers

Serverless computing has revolutionized software development, simplifying deployment and DevOps. This tutorial demonstrates building a full-stack serverless application using Cloudflare Workers, a platform that abstracts away scaling and infrastructure. The project, "Repo Hunt," is a daily leaderboard for open-source projects, inspired by Product Hunt and Reddit. The finished site is available here.

Cloudflare Workers, leveraging Cloudflare's global network, delivers extremely low-latency performance regardless of user location. The Wrangler CLI tool simplifies building, uploading, and publishing. This tutorial uses the "Router" template, enabling URL-based routing. The source code is available on GitHub [link-to-github-repo].

Setting Up Your Environment

Install Wrangler:

npm install -g @cloudflare/wrangler
Copy after login

Create a new project using the Router template:

wrangler generate repo-hunt https://github.com/cloudflare/worker-template-router
cd repo-hunt
Copy after login

The Router template utilizes Webpack, allowing the inclusion of npm modules. A Router class handles URL routing. A basic example:

// index.js
const Router = require('./router');

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  try {
    const r = new Router();
    r.get('/', () => new Response("Hello, world!"));
    const resp = await r.route(request);
    return resp;
  } catch (err) {
    return new Response(err);
  }
}
Copy after login

Workers respond to fetch events, returning a Response. This tutorial uses routes for the homepage (/), submission form (/post), and submission handling (/repo).

Routing and Templating

The homepage (/) route renders a list of submitted repositories. We'll start with a simple HTML response:

// index.js
const Router = require('./router');
const index = require('./handlers/index');

// ... (rest of index.js)

// handlers/index.js
const headers = { 'Content-Type': 'text/html' };
const handler = () => {
  return new Response("Hello, world!", { headers });
};
module.exports = handler;
Copy after login

Use wrangler preview to test. Next, we'll create a more sophisticated template:

// handlers/index.js
const headers = { 'Content-Type': 'text/html' };
const template = require('../templates/index');

// ... (rest of handlers/index.js)

// templates/index.js
const layout = require('./layout');
const template = () => layout(`<h1 id="Hello-world">Hello, world!</h1>`);
module.exports = template;

// templates/layout.js
const layout = body => `<!-- HTML layout including Bulma CSS -->${body}`;
module.exports = layout;
Copy after login

This uses a layout template for consistent styling (Bulma CSS is included).

Data Persistence with Workers KV

Workers KV provides a key-value store for data persistence. We'll store repositories (key: repos:${id}) and daily lists (key: $date). Note: Workers KV requires a paid plan.

Basic KV operations:

REPO_HUNT.put("myString", "Hello, world!"); // Setting a value
const string = await REPO_HUNT.get("myString"); // Retrieving a value
Copy after login

We'll create classes for managing Repo and Day data:

// store/repo.js
const uuid = require('uuid/v4');

class Repo {
  // ... (Repo class implementation)
}
module.exports = Repo;

// store/day.js
const today = () => new Date().toLocaleDateString();

module.exports = {
  add: async function(id) { // ... },
  getRepos: async function() { // ... }
};
Copy after login

The Repo class handles validation and persistence. Day manages daily repository lists.

Handling User Submissions

A form (GET /post) allows users to submit repositories. A POST /repo handler processes submissions:

// handlers/create.js
const qs = require('qs');
const Repo = require('../store/repo');
const Day = require('../store/day');

// ... (create handler implementation)
Copy after login

This uses the qs library to parse form data, creates a Repo object, saves it to KV, and adds its ID to the daily list.

Rendering Data on the Homepage

The homepage now retrieves and renders repository data:

// handlers/index.js
// ... (updated index handler)

// templates/index.js
// ... (updated template function to render repos)
Copy after login

The Day module's getRepos function fetches and instantiates Repo objects. The template renders each repository.

Deployment

Claim a Workers.dev subdomain:

wrangler subdomain my-subdomain
Copy after login

Deploy the application:

wrangler publish
Copy after login

Create a KV namespace in the Cloudflare dashboard and update wrangler.toml with the namespace ID:

[[kv-namespaces]]
binding = "REPO_HUNT"
id = "$yourNamespaceId"
Copy after login

Republish after adding the KV namespace to wrangler.toml. The application is now live!

Further Development

This tutorial provides a foundation for a serverless application. Future enhancements could include upvoting, comments, and more sophisticated features. Explore the Workers documentation and template gallery for further development ideas.

The above is the detailed content of Building a Full-Stack Serverless Application with Cloudflare Workers. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Vue 3 Vue 3 Apr 02, 2025 pm 06:32 PM

It&#039;s out! Congrats to the Vue team for getting it done, I know it was a massive effort and a long time coming. All new docs, as well.

Can you get valid CSS property values from the browser? Can you get valid CSS property values from the browser? Apr 02, 2025 pm 06:17 PM

I had someone write in with this very legit question. Lea just blogged about how you can get valid CSS properties themselves from the browser. That&#039;s like this.

A bit on ci/cd A bit on ci/cd Apr 02, 2025 pm 06:21 PM

I&#039;d say "website" fits better than "mobile app" but I like this framing from Max Lynch:

Stacked Cards with Sticky Positioning and a Dash of Sass Stacked Cards with Sticky Positioning and a Dash of Sass Apr 03, 2025 am 10:30 AM

The other day, I spotted this particularly lovely bit from Corey Ginnivan’s website where a collection of cards stack on top of one another as you scroll.

Using Markdown and Localization in the WordPress Block Editor Using Markdown and Localization in the WordPress Block Editor Apr 02, 2025 am 04:27 AM

If we need to show documentation to the user directly in the WordPress editor, what is the best way to do it?

Comparing Browsers for Responsive Design Comparing Browsers for Responsive Design Apr 02, 2025 pm 06:25 PM

There are a number of these desktop apps where the goal is showing your site at different dimensions all at the same time. So you can, for example, be writing

How to Use CSS Grid for Sticky Headers and Footers How to Use CSS Grid for Sticky Headers and Footers Apr 02, 2025 pm 06:29 PM

CSS Grid is a collection of properties designed to make layout easier than it’s ever been. Like anything, there&#039;s a bit of a learning curve, but Grid is

Why are the purple slashed areas in the Flex layout mistakenly considered 'overflow space'? Why are the purple slashed areas in the Flex layout mistakenly considered 'overflow space'? Apr 05, 2025 pm 05:51 PM

Questions about purple slash areas in Flex layouts When using Flex layouts, you may encounter some confusing phenomena, such as in the developer tools (d...

See all articles