What Are NPM Scripts?
Think of NPM scripts as your personal assistant in the development world. Just as you might create shortcuts on your computer for frequently used applications, NPM scripts let you create shortcuts for commands you use often in your project. They're like recipe cards in a kitchen - instead of listing out all the ingredients and steps each time, you give the recipe a name and can easily reference it later.
Basic Script Structure
Let's look at how scripts are defined in your package.json file:
{
"name": "my-express-app",
"version": "1.0.0",
"scripts": {
"start": "node server.js",
"dev": "nodemon server.js"
}
}
Each script is like a labeled button - when you press it (run it), it executes the command you've assigned to it. The left side is the name (the label on your button), and the right side is what happens when you press it (the command that runs).
Development vs Production Scripts
Imagine you're a chef in a restaurant. You have two different environments:
Development Environment (The Test Kitchen)
{
"scripts": {
"dev": "nodemon server.js"
}
}
This is like your test kitchen where you:
- Can experiment freely
- Get immediate feedback on changes
- Don't worry about affecting real customers
Production Environment (The Main Kitchen)
{
"scripts": {
"start": "node server.js"
}
}
This is like your main kitchen during service where:
- Everything needs to be stable
- Changes aren't made on the fly
- Performance is crucial
Complete Example: Express Server Setup
Let's set up a complete Express server with both development and production scripts:
First, create your server.js file:
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.send('Hello, Express!');
});
app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
Then, set up your package.json:
{
"name": "express-server-example",
"version": "1.0.0",
"main": "server.js",
"scripts": {
"start": "node server.js",
"dev": "nodemon server.js",
"test": "jest",
"lint": "eslint .",
"build": "webpack --mode production"
},
"dependencies": {
"express": "^4.17.1"
},
"devDependencies": {
"nodemon": "^2.0.15",
"jest": "^27.0.6",
"eslint": "^7.32.0",
"webpack": "^5.64.0"
}
}
Running Your Scripts
To run these scripts, you use different commands in your terminal:
# Start in production mode
npm start
# Start in development mode
npm run dev
# Run tests
npm run test
# Run linting
npm run lint
# Build for production
npm run build
Advanced Script Techniques
Scripts can be combined and made more sophisticated:
{
"scripts": {
"prestart": "npm run build",
"start": "node server.js",
"dev": "nodemon server.js",
"build": "webpack --mode production",
"test": "jest --watchAll",
"deploy": "npm run test && npm run build && node deploy.js"
}
}
In this example:
- "prestart" runs automatically before "start"
- "deploy" runs multiple scripts in sequence
- "test" runs Jest in watch mode for development
Common Script Patterns
Here are some common patterns you'll see in real-world applications:
{
"scripts": {
// Development
"dev": "nodemon server.js",
"dev:debug": "nodemon --inspect server.js",
// Building
"build": "webpack --mode production",
"build:dev": "webpack --mode development",
// Testing
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
// Linting
"lint": "eslint .",
"lint:fix": "eslint . --fix",
// Database
"db:migrate": "knex migrate:latest",
"db:rollback": "knex migrate:rollback"
}
}
Best Practices
When creating your scripts, follow these guidelines:
- Use clear, descriptive names that indicate the script's purpose
- Group related scripts using colons (e.g., "test:watch", "build:dev")
- Document any complex scripts in your README.md
- Use pre- and post- hooks for setup and cleanup tasks
- Keep scripts focused on a single responsibility
Troubleshooting Common Issues
If your scripts aren't working as expected, check these common issues:
- Verify that all required packages are installed (both dependencies and devDependencies)
- Check that file paths in your scripts are correct for your operating system
- Ensure you're using the correct script name when running the command
- Look for syntax errors in your package.json file
Exercise: Creating Your First Scripts
Try this exercise to practice working with NPM scripts:
// 1. Create a new directory and initialize a new Node.js project
mkdir script-practice
cd script-practice
npm init -y
// 2. Create a simple server.js file
touch server.js
// 3. Install necessary dependencies
npm install express
npm install nodemon --save-dev
// 4. Add your scripts to package.json
// 5. Test both development and production scripts
// 6. Try adding a custom script of your own!