Deploy Web App to Cloudflare Workers: A Practical Guide
Learn how to deploy a basic web app to Cloudflare Workers efficiently. This guide covers setup, coding, and deployment steps for developers.

How to Deploy a Basic Web App to Cloudflare Workers
Deploying a web application to Cloudflare Workers offers significant advantages in performance, scalability, and cost efficiency. Cloudflare Workers allow developers to run JavaScript, TypeScript, or WebAssembly code on Cloudflare's global network, close to your users. This edge computing model dramatically reduces latency and provides inherent DDoS protection and caching capabilities. This guide will walk you through the practical steps to deploy a basic web app to Cloudflare Workers, from initial setup to a live application.
By the end of this tutorial, you'll have a foundational understanding of how to leverage Cloudflare Workers for your web projects, setting the stage for more complex serverless architectures.
Why Choose Cloudflare Workers for Your Web App?
Before diving into the "how," let's briefly touch upon the "why." Cloudflare Workers provide a powerful platform for running serverless functions at the edge.
- Global Reach and Low Latency: Your code runs on Cloudflare's network in data centers closest to your users, leading to incredibly fast response times.
- Scalability Out-of-the-Box: Workers automatically scale to handle traffic spikes without any infrastructure management on your part.
- Cost-Effective: The free tier is generous, and paid tiers are priced competitively, often significantly cheaper than traditional server-based deployments for similar traffic.
- Enhanced Security: Leveraging Cloudflare's robust security features, your application benefits from DDoS protection, WAF (Web Application Firewall), and more.
- Developer Experience: Cloudflare provides excellent developer tools, including Wrangler CLI, to streamline development and deployment.
- Versatility: Beyond simple APIs, Workers can serve static assets, perform A/B testing, rewrite URLs, and even act as a full-stack backend with KV storage and Durable Objects.
For a basic web application, especially one that primarily serves dynamic content or acts as an API gateway for a static frontend, Workers are an excellent choice.
Prerequisites for Cloudflare Workers Deployment
Before we begin, ensure you have the following:
- Cloudflare Account: A free Cloudflare account is sufficient to get started. Sign up at Cloudflare.com.
- Node.js and npm/Yarn: Workers development relies on Node.js. Install the latest LTS version from nodejs.org.
npm(Node Package Manager) comes with Node.js, or you can useyarn. - Basic JavaScript Knowledge: Our example will use JavaScript.
- A Domain (Optional but Recommended): While Workers can be accessed via a
*.workers.devsubdomain, using your own custom domain is common for production. Your domain should be managed by Cloudflare.
Step 1: Install Wrangler CLI
Wrangler is the command-line interface for Cloudflare Workers. It allows you to develop, test, and deploy your web application to Cloudflare Workers.
Open your terminal or command prompt and run:
npm install -g wrangler
Or, if you prefer Yarn:
yarn global add wrangler
Verify the installation by checking the version:
wrangler --version
You should see an output similar to wrangler 3.x.x.
Step 2: Authenticate Wrangler with Cloudflare
To allow Wrangler to deploy to your Cloudflare account, you need to authenticate it.
wrangler login
This command will open a browser window asking you to log in to Cloudflare and authorize Wrangler. Once authorized, your terminal will confirm successful login.
Step 3: Create a New Cloudflare Workers Project
Now, let's create a new project. For a basic web application, we'll start with a simple fetch handler.
wrangler generate my-worker-app hello-world
Here:
my-worker-appis the name of your project directory.hello-worldis a template. Cloudflare provides various templates;hello-worldis a good starting point for a simple HTTP handler.
Navigate into your new project directory:
cd my-worker-app
Step 4: Understand the Project Structure
Inside my-worker-app, you'll find:
src/index.js: This is where your Worker's JavaScript code resides.wrangler.toml: The configuration file for your Worker.
Let's look at the default src/index.js:
/**
* Welcome to Cloudflare Workers! This is your first worker.
*
* - Run `npm run dev` in your terminal to start a development server
* - Open a browser tab at http://localhost:8787/ to see your worker in action
* - Run `npm run deploy` to publish your worker
*
* Learn more at https://developers.cloudflare.com/workers/
*/
export default {
async fetch(request, env, ctx) {
return new Response('Hello World!');
},
};
This code exports an object with a fetch method. This method is the entry point for every request that hits your Worker. It receives three arguments: request (the incoming Request object), env (environment variables and bindings), and ctx (context utilities, like waitUntil). For now, it simply returns a Response object with the text "Hello World!".
Now, let's look at wrangler.toml:
name = "my-worker-app"
main = "src/index.js"
compatibility_date = "2023-10-25" # Update this to the current date or later
name: The name of your Worker. This will also be part of its*.workers.devsubdomain.main: Specifies the entry point file for your Worker code.compatibility_date: This is crucial. It locks your Worker to a specific Workers runtime behavior. Always use a recent date to ensure you benefit from the latest features and bug fixes. You can set it to today's date or a future date for optimal compatibility.
Step 5: Develop Your Basic Web Application
Let's modify src/index.js to create a slightly more interactive web application. We'll build a simple API that responds differently based on the URL path.
Replace the content of src/index.js with the following:
/**
* Basic Web Application on Cloudflare Workers
* This worker demonstrates routing and dynamic responses.
*/
export default {
async fetch(request) {
const url = new URL(request.url);
let responseText = 'Welcome to your Cloudflare Worker app!';
let statusCode = 200;
let contentType = 'text/plain';
if (url.pathname === '/') {
// Serve a basic HTML page for the root path
responseText = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Worker App</title>
<style>
body { font-family: sans-serif; margin: 2em; background-color: #f0f0f0; }
h1 { color: #333; }
p { color: #666; }
a { color: #007bff; text-decoration: none; }
a:hover { text-decoration: underline; }
</style>
</head>
<body>
<h1>Hello from Cloudflare Workers!</h1>
<p>This is a basic web application served directly from the edge.</p>
<p>Try visiting <a href="/api/greet?name=WorkerDev">/api/greet?name=WorkerDev</a></p>
<p>Or <a href="/info">/info</a></p>
<p>Find more examples at <a href="https://developers.cloudflare.com/workers/">Cloudflare Workers Docs</a>.</p>
</body>
</html>
`;
contentType = 'text/html';
} else if (url.pathname === '/api/greet') {
const name = url.searchParams.get('name') || 'Guest';
responseText = `{"message": "Greetings, ${name}!"}`;
contentType = 'application/json';
} else if (url.pathname === '/info') {
responseText = `{"app_name": "My Worker App", "version": "1.0", "environment": "Cloudflare Workers"}`;
contentType = 'application/json';
} else {
responseText = '404 - Not Found';
statusCode = 404;
}
return new Response(responseText, {
headers: { 'Content-Type': contentType },
status: statusCode,
});
},
};
This updated Worker code:
- Parses the request URL to determine the path.
- Serves an HTML page for the root path (
/). - Acts as a simple JSON API at
/api/greet, taking an optionalnamequery parameter. - Provides basic application info at
/info. - Returns a 404 for any other path.
This demonstrates how you can handle routing and serve different content types (HTML, JSON) from a single Worker.
Step 6: Test Your Application Locally
Wrangler provides a local development server, which is incredibly useful for testing your changes without deploying them.
npm run dev
Or, if you created the project with wrangler generate, you might just run:
wrangler dev
Open your browser and navigate to http://localhost:8787/. You should see the HTML page. Try http://localhost:8787/api/greet?name=Cloudflare and http://localhost:8787/info to see the API responses.
Step 7: Configure for Deployment (wrangler.toml)
Before we deploy, let's ensure our wrangler.toml is optimized. For this basic app, the default configuration is mostly fine, but consider:
workers_dev = true: (Default) This makes your worker available atyour-worker-name.your-username.workers.dev.route = "": If you want to associate your Worker with a custom domain and specific routes on that domain, you'd add this. For example,route = "yourdomain.com/*".
Let's assume we want to use the *.workers.dev subdomain for now. Update your compatibility_date in wrangler.toml to a recent date to avoid warnings and ensure the latest runtime features. For example:
name = "my-worker-app"
main = "src/index.js"
compatibility_date = "2024-01-01" # Or a more recent date like "2024-07-20"
Step 8: Deploy Your Web App to Cloudflare Workers
Now for the exciting part – deploying your application to Cloudflare's edge network!
Ensure you are in your project directory (my-worker-app) and run:
wrangler deploy
Wrangler will compile your Worker, upload it to Cloudflare, and provide you with the public URL once the deployment is complete. It usually looks something like https://my-worker-app.your-username.workers.dev.
Go to that URL in your browser, and you should see your basic web application live! Test the different paths (/, /api/greet?name=YourName, /info) to confirm everything works as expected.
Step 9: (Optional) Connect a Custom Domain
For production applications, you'll likely want to use your own domain. Assuming your domain is managed by Cloudflare:
Add a
routetowrangler.toml: Openwrangler.tomland add arouteconfiguration under your worker's settings.name = "my-worker-app" main = "src/index.js" compatibility_date = "2024-01-01" [vars] # Example: environment variables # MY_ENV_VAR = "some_value" [[routes]] pattern = "yourdomain.com/app/*" # Or "yourdomain.com/*" to cover the whole domain zone_id = "YOUR_ZONE_ID" # Find this in your Cloudflare dashboard under your domain settings- Replace
yourdomain.com/app/*with your desired pattern.*is a wildcard. - Replace
YOUR_ZONE_IDwith the actual Zone ID for your domain, found in the Cloudflare dashboard overview for your domain.
- Replace
Deploy with the new configuration:
wrangler deployWrangler will detect the new
routeand associate your Worker with it.DNS Configuration (if necessary): Ensure you have appropriate DNS records. For
yourdomain.com/app/*, you might haveyourdomain.compointing toArecords for Cloudflare, and the routing rule inwrangler.tomlhandles the/app/*path. If you want the Worker to handle the root of your domain, ensure your domain's DNSArecords are proxied through Cloudflare.
Summary of Deployment Steps
Here's a quick overview of the essential steps we covered to deploy a web app to Cloudflare Workers:
| Step | Command/Action | Purpose |
|---|---|---|
| 1. Install Wrangler CLI | npm install -g wrangler |
Essential tool for Worker development and deployment. |
| 2. Authenticate | wrangler login |
Connects Wrangler to your Cloudflare account. |
| 3. Create Project | wrangler generate my-worker-app hello-world |
Initializes a new Worker project with basic structure. |
| 4. Develop Code | Edit src/index.js |
Write your web application's logic. |
| 5. Configure Worker | Edit wrangler.toml |
Define project settings, entry point, and routing. |
| 6. Test Locally | wrangler dev |
Develop and test your Worker locally before deploying. |
| 7. Deploy to Cloudflare | wrangler deploy |
Publishes your application to Cloudflare's edge network. |
| 8. (Optional) Custom Domain | Add [[routes]] to wrangler.toml, wrangler deploy |
Map your Worker to a custom domain for a professional URL. |
Next Steps and Advanced Concepts
You've successfully deployed a basic web application. This is just the beginning. Cloudflare Workers offer a rich ecosystem for more complex applications:
- Key-Value Store (KV): For persistent storage of simple key-value pairs at the edge. Great for caching, configuration, or user data.
- Durable Objects: Serverless, strongly consistent coordination primitives for building stateful applications. Think websockets, global counters, etc.
- R2 (Object Storage): S3-compatible object storage for storing large static assets, images, videos, etc., without egress fees.
- Databases: Integrate with various databases like Cloudflare D1 (serverless SQL), PlanetScale, Supabase, or use external databases via fetch requests.
- Bundling with Webpack/Rollup: For larger projects, use tools like Webpack or Rollup to bundle your code, including npm packages, for optimal performance. Wrangler supports this out-of-the-box with templates.
- TypeScript: Write your Workers in TypeScript for better maintainability and type safety.
- Testing: Implement unit and integration tests for your Worker code.
Cloudflare Workers empower developers to build incredibly fast, scalable, and resilient applications by bringing compute closer to the user. By mastering these basics, you're well on your way to leveraging the full potential of edge computing.
FAQ
Q1: What is a Cloudflare Worker and why should I use it for my web app?
A Cloudflare Worker is a serverless function that runs on Cloudflare's global network, close to your users (at the "edge"). You should use it for your web app to achieve extremely low latency, automatic scalability, enhanced security features, and cost efficiency, especially for dynamic content, APIs, or routing logic.
Q2: Is there a cost associated with deploying a web app to Cloudflare Workers?
Cloudflare Workers offer a generous free tier, which includes a significant number of requests and CPU time per day, making it ideal for basic web apps and getting started. Beyond the free tier, pricing is usage-based, often proving more cost-effective than traditional server hosting for similar traffic levels.
Q3: Can I deploy a complex frontend framework (like React, Vue, Angular) to Cloudflare Workers?
Yes, you can! While a Worker primarily serves JavaScript logic, you can easily serve the static assets (HTML, CSS, JS bundles) of your React, Vue, or Angular application from Cloudflare Pages (which is built on Workers and R2), and use a Worker to handle API requests, authentication, or dynamic routing for that frontend. This creates a powerful full-stack serverless setup.
Q4: How do I manage environment variables or sensitive data in my Cloudflare Worker?
Wrangler allows you to define environment variables in your wrangler.toml file under the [vars] section for non-sensitive data. For sensitive information like API keys, you should use Cloudflare Workers Secrets, which securely store and inject environment variables at runtime. You can set them using wrangler secret put MY_API_KEY.
Q5: What is Wrangler CLI and why is it important for Cloudflare Workers?
Wrangler is Cloudflare's official command-line interface for developing, testing, and deploying Workers. It streamlines the entire development workflow, allowing you to create new projects, run a local development server, manage configurations, set secrets, and deploy your Worker applications to Cloudflare's network efficiently.
Q6: Can I use languages other than JavaScript with Cloudflare Workers?
Yes, Cloudflare Workers support JavaScript, TypeScript, and WebAssembly. You can write your Worker logic in TypeScript, and Wrangler will compile it to JavaScript. For more complex performance-critical tasks, you can compile languages like Rust or C++ to WebAssembly and integrate them into your Worker.