npm uses Semantic Versioning (SemVer) to manage package versions, with the format MAJOR.MINOR.PATCH.
Version Format
- MAJOR: Incremented when making incompatible API changes
- MINOR: Incremented when adding functionality in a backwards compatible manner
- PATCH: Incremented when making backwards compatible bug fixes
Example: 1.2.3
- 1 = Major version
- 2 = Minor version
- 3 = Patch version
Version Range Symbols
npm supports various version range symbols to specify dependency versions:
1. Exact Version
shell"express": "4.18.0"
Only installs exactly version 4.18.0
2. Tilde (~)
shell"express": "~4.18.0"
Equivalent to >=4.18.0 <4.19.0
Allows patch updates, but major and minor versions remain unchanged
3. Caret (^)
shell"express": "^4.18.0"
Equivalent to >=4.18.0 <5.0.0
Allows minor and patch updates, but major version remains unchanged (default behavior)
4. Greater/Less Than
shell"express": ">4.0.0" "express": "<5.0.0" "express": ">=4.18.0 <5.0.0"
5. Hyphen Range
shell"express": "4.16.0 - 4.18.0"
Includes all versions from 4.16.0 to 4.18.0
6. OR Operator (||)
shell"express": "^4.0.0 || ^5.0.0"
Matches any version that satisfies either condition
7. Wildcard (*)
shell"express": "4.*" "express": "*"
Matches any version
8. Latest Version
shell"express": "latest" "express": "next"
Install latest published version or next prerelease version
Prerelease Versions
Prerelease versions use hyphens and identifiers:
shell"express": "5.0.0-beta.1" "express": "5.0.0-rc.1" "express": "5.0.0-alpha.3"
Common prerelease identifiers:
alpha: Internal testing versionbeta: Public testing versionrc(Release Candidate): Release candidate version
Role of package-lock.json
The package-lock.json file records the exact version and dependency tree structure for each dependency:
json{ "name": "my-project", "version": "1.0.0", "lockfileVersion": 2, "packages": { "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", "integrity": "sha512-...", "dependencies": { "accepts": "~1.3.8" } } } }
Purpose:
- Ensure team members install the same dependency versions
- Improve installation speed (use locked versions directly)
- Prevent unexpected issues from dependency drift
- Record integrity checksum information for dependencies
Version Management Best Practices
- Use exact versions in production: Ensure stability
- Use range versions in development: Facilitate getting updates
- Commit package-lock.json: Ensure team consistency
- Regularly update dependencies: Use
npm outdatedto check outdated packages - Use npm audit: Check for security vulnerabilities
- Understand breaking changes: Review changelogs before major version upgrades
Common Version Management Commands
bash# View currently installed versions npm list # View latest version of a package npm view <package> version # View all versions of a package npm view <package> versions # Check outdated packages npm outdated # Update packages (following ranges in package.json) npm update # Update to latest major version npm install <package>@latest # Check for security vulnerabilities npm audit # Automatically fix security vulnerabilities npm audit fix
Understanding npm version management is crucial for maintaining project stability and security, especially in team collaboration and long-term maintenance projects.