Skip to main content

Understanding package.json

Every modern JavaScript project has a package.json file at its root. If your project was a physical product, the package.json would be the instruction manual and the ingredient list found on the back of the box.

1. What does it do?

The package.json file serves three vital purposes:

  1. Metadata: It tells people (and tools) the name, version, and author of the project.
  2. Dependencies: It lists exactly which external libraries are needed to make the code run.
  3. Automation: It stores "Scripts" to automate tasks like starting a server or running tests.

2. Anatomy of the File

Here is what a standard package.json looks like for a CodeHarborHub student project:

{
"name": "my-awesome-app",
"version": "1.0.0",
"description": "A full-stack project built at CodeHarborHub",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
},
"author": "Ajay Dhangar",
"license": "MIT",
"dependencies": {
"express": "^4.18.2"
},
"devDependencies": {
"nodemon": "^3.0.1"
}
}

3. Key Fields Explained

Dependencies vs. devDependencies

This is the most common point of confusion for beginners.

  • dependencies: Tools required for the app to run in production (e.g., a web server like Express).
  • devDependencies: Tools only needed while you are writing and testing the code (e.g., a tool that restarts your server automatically).

The Scripts Object

The scripts field allows you to create aliases for complex terminal commands.

  • Instead of typing node server/production/app.js --port 3000, you can just define "start": "..." and run npm start.

4. Semantic Versioning (SemVer)

Have you noticed the numbers like ^4.18.2? This is called Semantic Versioning.

  • 4 (Major): Big changes that might break your code.
  • 18 (Minor): New features added that are safe to use.
  • 2 (Patch): Small bug fixes.
  • The Caret (^): Tells npm: "It's okay to update to any Minor or Patch version, but don't touch the Major version!"

5. package.json vs. package-lock.json

When you install a package, a second file called package-lock.json is created.

  • package.json: "I need version 4.x.x of Express."
  • package-lock.json: "I have installed exactly version 4.18.2, and here is the exact security hash to prove it."

Rule: Never edit the package-lock.json manually. npm manages it for you to ensure that everyone on your team has the exact same versions of every library.

Practice: Customizing Your Project

  1. Open your project folder in VS Code.

  2. Open your package.json.

  3. Add a new script:

    "scripts": {
    "hello": "echo 'Hello from CodeHarborHub!'"
    }
  4. In your terminal, run: npm run hello.

  5. You should see your message printed in the terminal!

Sharing Projects

When you share your code on GitHub, you do not include the node_modules folder. You only share the package.json. When your friend downloads your code, they just run npm install, and their computer reads your "recipe list" to download everything automatically.