Never Worry About Project Dependencies: A Comprehensive Guide to package.json and package-lock.json
Tags: javascript, node, packagejson, packagelockjson
Published: 2023-07-01 15:14:37


![packagejsonvspackagelockjsonHeader](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1tru06wk3lg7uulyjygs.png)
## Introduction:
Managing dependencies is a crucial aspect of any software project. By correctly declaring and tracking dependencies, developers can ensure consistent and reliable application builds. In the JavaScript ecosystem, package.json and package-lock.json files play a vital role in managing project dependencies. This article will delve into the intricacies of these files, exploring their attributes and various ways to declare dependencies.

![packageJsonIssueVspackage-lockJson](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tbi51u0x143njib6rf7z.jpg)

## Understanding package.json:
package.json is a file that contains metadata about your Node.js project. This includes the project's name, version, author, and dependencies. The dependencies section of package.json is a list of all the packages that your project needs. Each dependency is listed with its name, version, and optionally, a range of versions that are acceptable.

```
{
  "name": "package.json-file",
  "version": "1.0.0",
  "description": "creating a new package.json file",
  "private": false,
  "main": "index.js",
  "scripts": {
    "start": "node index",
    "dev": "nodemon index",
    "test": "jest"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Easybuoy/package.json-mastery.git"
  },
  "keywords": [
    "node",
    "javascript",
    "npm",
    "yarn"
  ],
  "author": "Ezekiel Ekunola",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/Easybuoy/package.json-mastery/issues"
  },
  "homepage": "https://github.com/Easybuoy/package.json-mastery#readme",
  "engines": {
    "npm": "6.10.0",
    "node": "10.14.1"
  },
  "dependencies": {
    "bcryptjs": "~2.4.3",
    "cors": "^2.8.5",
    "dotenv": "^6.1.0",
    "express": "^4.16.4"
  },
  "devDependencies": {
    "eslint": "^4.19.1",
    "mocha": "~6.2.0",
    "nodemon": "^1.19.1"
  },
  "nyc": {
    "exclude": [
      "server/app.js",
      "server/config/",
      "server/build"
    ]
  }
}
```

1. **"name":**
The "name" attribute specifies the project's name. It should be unique and typically follows the format: "@author/project-name".

2. **"version":**
The "version" attribute represents the project's current version. It follows the Semantic Versioning (SemVer) format (e.g., "1.0.0").

3. **"description":**
The "description" attribute provides a brief description of the project.

4. **"author" and "contributors":**
The "author" attribute denotes the project's primary author, while "contributors" lists additional contributors.

5. **"license":**
The "license" attribute specifies the license under which the project is distributed (e.g., "MIT," "Apache-2.0").

## Dependency Declaration:
In package.json, dependencies are declared under the "dependencies" attribute. There are different ways to specify dependencies:

```
{
  "dependencies": {
    "foo": "1.0.0 - 2.9999.9999",
    "bar": ">=1.0.2 <2.1.2",
    "baz": ">1.0.2 <=2.3.4",
    "boo": "2.0.1",
    "qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
    "asd": "http://asdf.com/asdf.tar.gz",
    "til": "~1.2",
    "elf": "~1.2.3",
    "two": "2.x",
    "thr": "3.3.x",
    "lat": "latest",
    "dyl": "file:../dyl"
  }
}
```

**2.1. Version Ranges:**

_Tilde (~) Range:_ This symbol indicates that any version of the package that is greater than or equal to the specified version, but less than the next major version, is acceptable. For example, ~4.17.1 means that any version of your package that is greater than or equal to 4.17.1 and less than 5.0.0 is acceptable.

_Caret (^) Range:_ This symbol indicates that any version of the package that is greater than or equal to the specified version is acceptable. For example, ^4.17.1 means that any version of your package that is greater than or equal to 4.17.1 is acceptable.

**2.2. Exact Version:**
Specifying the exact version ensures that only that specific version is installed. Example: "lodash": "4.17.21"

**2.3. Version Ranges with Operators:**
You can use operators to define version ranges:
Greater than (>): Example: "axios": ">0.21.1"
Greater than or equal to (>=): Example: "jest": ">=26.0.0"

![Versoning](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w4809q95572ved8aaci1.png)

## Working with package-lock.json:
package-lock.json is a file that is generated by npm when you install your dependencies. It contains the exact versions of all the packages that are installed in your project. This means that even if you install your project on a different machine or use a different version of npm, you can be sure that the same versions of the dependencies will be installed.


![package-lock.json](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dtnbwu1k7pha9tp0oasz.png)

## Best Practices:
To ensure smooth dependency management, consider the following best practices:

**5.1. Regularly update dependencies:**
Keeping dependencies up to date ensures security patches and feature enhancements. Use tools like "npm outdated" or "npm-check-updates" to identify outdated packages.

**5.2. Lock dependencies:**
Commit both package.json and package-lock.json to your version control system to ensure reproducible builds across different environments.

**5.3. Use semantic versioning:**
Follow SemVer guidelines when declaring dependencies to ensure compatibility and avoid breaking changes.

## Conclusion:
Understanding the attributes of package.json and leveraging package-lock.json is essential for managing project dependencies effectively. By adopting best practices and utilizing the various dependency declaration methods, developers can ensure reliable and hassle-free dependency management in their projects.

Remember, a well-managed dependency ecosystem contributes to the stability and maintainability of your applications, enabling you to focus on delivering valuable features to your users.


### References :-
1. Dependencies Versions details Semver:- https://github.com/npm/node-semver#versions
2. Package.json details from NPM:- https://docs.npmjs.com/cli/v8/configuring-npm/package-json
3. Package-lock.json details from NPM:- https://docs.npmjs.com/cli/v8/configuring-npm/package-lock-json
4. More Better Explanation with Diagram:- https://www.atatus.com/blog/package-json-vs-package-lock-json/

Lol found the 4th one in last. Felt mine as 🥔
Most images are taken from **Atatus** rest Google