Node.js is a program that lets us run JavaScript code outside browsers – which we can use for a variety of things.
A shell provides a text-based way of interacting with the operating system. In this chapter, we explore how shells work and why we need them for web development.
CSS provides a variety of services for web content: In the previous chapter, we used it to format content: to change colors, typefaces, etc. In this chapter, we will use it to lay out content: to place HTML elements on a page.
In the previous chapter, we used HTML to create unformatted content. In this chapter, we use CSS to configure the style of that content: We can change the color of the background, use various fonts, add vertical spacing, etc. In this chapter, we learn the basics of CSS. In the next chapter, we use CSS for layout – positioning HTML elements on a web page.
I was looking for a way to create images (think screenshots) of CSS layouts that I can use in HTML, EPUB and PDF files. This blog post describes my solution – which produces SVG images.
In this blog post, I’d like to talk about CSS: I wish it supported inner breakpoints – breakpoints not for viewports or containers but for HTML elements inside viewports or containers.
In this chapter, we learn how to create web pages via HTML.
In this chapter, we perform a few steps to prepare us for web development.
In this chapter, we learn how to use the version control system Git and a useful companion website, GitHub. Both are important tools when programming in teams but even help programmers who work on their own.
In this chapter, we explore Markdown, a lightweight markup language that’s easy to learn and used a lot when writing about programming: documentation, comments, etc. We’ll need it in the next chapter. Learning it may seem like a detour but it’s easy to pick up and you’ll come across it often if you are interested in web development.
In this chapter, we install a package manager for our operating system. That enables us to install shell commands that we can’t get via npm.
In this chapter, we learn how to write a server that lets users log in via passwords. That process is called authentication.
In this chapter, we’ll write our own web server: It will serve files and manage the data for a browser app.
In this chapter, we’ll take a look at frontend frameworks – libraries that help with programming web user interfaces (“frontend” means “browser”, “backend” means “server”). We’ll use the frontend framework Preact to implement the frontend part of a todo list app – whose backend part we’ll implement in a future chapter.
In this chapter we develop a small web app in the same way that large professional web apps are developed: We use libraries that we install via npm. We write tests for some of the functionality. We combine all JavaScript code into a single file before we serve the web app. That is called bundling. (Why we do that it explained later.)
In this chapter, we learn how to handle tasks that take a long time to complete – think downloading a file. The mechanisms for doing that, Promises and async functions are an important foundation of JavaScript and enable us to do a variety of interesting things.
In this chapter, we explore the popular data format JSON. And we implement shell commands via Node.js that read and write files.
In this chapter, we’ll explore the data structure Map (a class) which lets us translate (“map”) from an input value to an output value. We’ll use a Map to display text upside-down in a terminal!
In this chapter, we look at exceptions in JavaScript. They are a way of handling errors. We’ll need them for the next chapter.
In this blog post, we discuss Oracle’s trademark of the word “JavaScript”: What are the problems caused by that trademark? How can we fix those problems?
In this chapter, we learn how to create plain objects with properties. We use them to create a simple flash card app.
So far, all of our JavaScript code resided in a single file – be it an .html file or a .js file. In this chapter, we learn how to split it up into multiple files. And how to automatically test if the code we write is correct.
In this chapter, we run a web server on our own computer and use it to serve a web app.
In this chapter we explore two topics: A shell is like browser console, but for the operating system instead of for JavaScript. It helps us with programming by running the tools (programs) we need to get things done. Node.js is a program that lets us run JavaScript code outside browsers – which we can use for a variety of things.
In this chapter, we learn how to do things repeatedly in JavaScript.
In this chapter, we learn about tools for only running a piece of code if a condition is met: truth values (booleans), comparisons and if statements.
In this chapter we look at one way of storing more than one value in a variable: arrays.
In the last chapter, we worked with numbers. In this chapter, we’ll work with text and write our first applications.
In this chapter, we take the very first steps with JavaScript and learn about numbers, variables and functions.
This blog post provides an overview of my new series of blog posts called “Learning web development”.
On 25 June 2025, the 129th Ecma General Assembly approved the ECMAScript 2025 language specification (press release), which means that it’s officially a standard now. This blog post explains what’s new.
In this blog post, we explore ways in which we can make regular expressions easier to use.
JavaScript has two common patterns: Maps: We check the existence of a key via .has() before retrieving the associated value via .get(). Arrays: We check the length of an Array before performing an indexed access. These patterns don’t work as well in TypeScript. This blog post explains why and presents alternatives.
In ECMAScript 2025, JavaScript gets a class Iterator with iterator helper methods. This class conflicts with TypeScript’s existing types for iterators. In this blog post, we explore why that is and how TypeScript solves that conflict.
In this blog post, we explore how we can style text that we log to the console in Node.js. Some of the examples use a Unix shell but most of the code should also work on Windows.
Converting values to strings in JavaScript is more complicated than it might seem: Most approaches have values they can’t handle. We don’t always see all of the data.
In this blog post we look at: The current best practice for deploying library packages: .js, .js.map, .d.ts, .d.ts.map, .ts Recent new developments in compiling and deploying TypeScript: type stripping, isolated declarations, JSR, etc. What the future of deploying TypeScript might look like: type stripping in browsers, etc.
In this blog post, we examine how we can test types in TypeScript: First, we look at the library asserttt and the CLI tool ts-expect-error. Then, we consider which functionality could be built into TypeScript.
In JavaScript, code has color: It is either synchronous or asynchronous. In this blog post, we explore: The problems caused by that How to fix them via synchronous await The two downsides that prevent synchronous await from being practical