Chalarangelo/30-seconds-of-code

View on GitHub
content/snippets/js/s/semantic-versioning.md

Summary

Maintainability
Test Coverage
---
title: Introduction to Semantic Versioning (SemVer)
shortTitle: Semantic Versioning (SemVer) explained
type: story
language: javascript
tags: [node]
cover: wet-lowland-golden-hour
excerpt: Learn how semantic versioning works and how to use it to correctly version your software.
dateModified: 2023-07-16
---

**SemVer** (short for **Semantic Versioning**) is a versioning scheme commonly used in software development to communicate the changes and **compatibility** of a software package. The JavaScript ecosystem, embodied mainly in the **npm package manager**, has adopted SemVer as the standard versioning scheme for JavaScript packages. The version of a package can be found in its `package.json` file, and it is also displayed in the npm registry.

```json [package.json]
{
  "name": "my-package",
  "version": "1.0.0"
}
```

## SemVer versions

SemVer versions are formatted in **three numeric components**, as follows:

```
{major}.{minor}.{patch}
```

Each component represents a specific type of change made to the software.

- **Major version**: Significant changes that may **break compatibility** with previous versions. Developers should carefully review the documentation and test their code against the new version before upgrading.
- **Minor version**: Backwards-compatible **additions or improvements** that don't break compatibility with previous versions. Users can typically upgrade to a new minor version without worrying about major changes that might require code modifications.
- **Patch version**: Backwards-compatible **bug fixes, patches, or maintenance** releases. Patch releases are intended to be safe and shouldn't introduce new features or breaking changes.

The following table summarizes the different types of changes represented by each component:

| Component | Type of change | Example |
| --------- | -------------- | ------- |
| Major     | Incompatible   | Breaking changes, rewrites, architectural changes |
| Minor     | Compatible     | New features, functionalities, enhancements |
| Patch     | Compatible     | Bug fixes, patches, maintenance releases |

## Releases and pre-releases

The **first version** of a software package is typically denoted as `1.0.0`. This is because the initial release of a software package is considered to be a major version, and the first version of a major version is always `1.0.0`. Versions starting with `0.x.x` are considered to be pre-release versions and are not intended for production use.

Additionally, SemVer allows for **pre-release versions** to be appended to the version number. These are denoted by a hyphen followed by a series of alphanumeric identifiers, such as `1.0.0-alpha.1` or `1.0.0-beta.2`. Pre-release versions are typically used to indicate that the software is still under active development and may not be ready for production use.

## Specifying which version to use

When installing a package, you can specify which version to use by appending the version number to the package name, as follows:

```shell
npm install my-package@1.0.0
```

If you don't specify a version, npm will install the **latest version** of the package. You can also use the `^` or `~` symbols to specify a range of versions. For example, `^1.0.0` will install the latest version of the package that is compatible with `1.0.0`. Similarly, `~1.0.0` will install the latest version of the package that is compatible with `1.0.0` and has the same major version. Here's a quick summary of the different ways to specify a version:

- Exact version: `1.0.4`
- Patch releases: `1.0` or `1.0.x` or `~1.0.4`
- Minor releases: `1` or `1.x` or `^1.0.4`

Note that you can also change the version of each dependency by editing the `package.json` file directly. Just remember to run `npm install` after making any changes to the `package.json` file.