Package Management
Master package management with npm, yarn, and pnpm for efficient dependency management. This is a foundational concept in programming and web interactivity that professional developers rely on daily. The explanations below are written to be beginner-friendly while covering the depth and nuance that comes from real-world JavaScript experience. Take your time with each section and practice the examples
npm Commands
npm is the default package manager for Node.js and provides powerful dependency management capabilities.. This is an essential concept that every JavaScript developer must understand thoroughly. In professional development environments, getting this right can mean the difference between code that works reliably and code that breaks in production. The following sections break this down into clear, digestible pieces with practical examples you can try immediately
Package.json Management
// package.json
{
"name": "my-project",
"version": "1.0.0",
"description": "A sample project",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"build": "webpack --mode production",
"test": "jest",
"lint": "eslint src/"
},
"dependencies": {
"express": "^4.18.0",
"lodash": "^4.17.21"
},
"devDependencies": {
"jest": "^29.0.0",
"eslint": "^8.0.0"
}
}Dependency Management
// Installing packages
npm install express // Production dependency
npm install -D jest // Development dependency
npm install -g nodemon // Global package
// Version management
npm install express@4.17.1 // Specific version
npm install express@^4.17.0 // Compatible version
npm install express@~4.17.1 // Patch version
// Updating packages
npm update // Update all packages
npm update express // Update specific package
npm outdated // Check outdated packagesYarn vs pnpm
// Yarn commands
yarn add express // Add dependency
yarn add -D jest // Add dev dependency
yarn install // Install dependencies
yarn upgrade // Update dependencies
// pnpm commands
pnpm add express // Add dependency
pnpm add -D jest // Add dev dependency
pnpm install // Install dependencies
pnpm update // Update dependencies
// Performance comparison
// pnpm > yarn > npm (in terms of speed and disk usage)Workspace Management
// Monorepo with workspaces
// package.json (root)
{
"name": "my-monorepo",
"workspaces": [
"packages/*",
"apps/*"
]
}
// packages/shared/package.json
{
"name": "@myorg/shared",
"version": "1.0.0"
}
// apps/web/package.json
{
"name": "@myorg/web",
"dependencies": {
"@myorg/shared": "workspace:*"
}
}Mini-Project: Package Manager
// Simple package manager
const fs = require('fs');
const path = require('path');
class SimplePackageManager {
constructor(projectPath) {
this.projectPath = projectPath;
this.packageJsonPath = path.join(projectPath, 'package.json');
this.nodeModulesPath = path.join(projectPath, 'node_modules');
this.packageJson = this.loadPackageJson();
}
loadPackageJson() {
if (fs.existsSync(this.packageJsonPath)) {
return JSON.parse(fs.readFileSync(this.packageJsonPath, 'utf8'));
}
return {
name: path.basename(this.projectPath),
version: '1.0.0',
dependencies: {},
devDependencies: {}
};
}
addDependency(name, version, isDev = false) {
const key = isDev ? 'devDependencies' : 'dependencies';
this.packageJson[key][name] = version;
this.savePackageJson();
console.log(`Added ${name}@${version} to ${key}`);
}
removeDependency(name) {
let removed = false;
if (this.packageJson.dependencies[name]) {
delete this.packageJson.dependencies[name];
removed = true;
}
if (this.packageJson.devDependencies[name]) {
delete this.packageJson.devDependencies[name];
removed = true;
}
if (removed) {
this.savePackageJson();
console.log(`Removed ${name}`);
} else {
console.log(`Package ${name} not found`);
}
}
listDependencies() {
console.log('Dependencies:');
Object.entries(this.packageJson.dependencies).forEach(([name, version]) => {
console.log(` ${name}: ${version}`);
});
console.log('Dev Dependencies:');
Object.entries(this.packageJson.devDependencies).forEach(([name, version]) => {
console.log(` ${name}: ${version}`);
});
}
savePackageJson() {
fs.writeFileSync(
this.packageJsonPath,
JSON.stringify(this.packageJson, null, 2)
);
}
}