npm package.json

By Xah Lee. Date: . Last updated: .

package.json

package.json is the heart of every npm project. Example:

{
  "name": "xxttt",
  "version": "1.0.0",
  "description": "test",
  "license": "ISC",
  "author": "",
  "type": "commonjs",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}

important package.json fields

name
Package name. Sample value: "my-cool-lib"
version
Semantic versioning. Sample value: "1.2.3"
scripts
Custom commands.
dependencies
Production packages. Sample value: { "express": "^4.19.2" }
devDependencies
Dev-only packages. Sample value: { "vite": "^5.4.0" }
type

The type field in package.json instructs Node.js on how to interpret .js files within that package. If the field is missing or set to "commonjs", .js files are treated as CommonJS modules (using require and module.exports). If set to "module", .js files are treated as ES Modules (using import and export).

Key behaviors include:

  • Default Behavior: Without a type field, Node.js assumes CommonJS.
  • Explicit Extensions: Files ending in .mjs are always ES modules, and .cjs files are always CommonJS, regardless of the type field.
  • Tooling Impact: Package managers (like npm) and bundlers (like Webpack) use this field to ensure correct dependency handling and bundling strategies.
  • TypeScript: Modern TypeScript settings (e.g., "module": "nodenext") respect the type field to determine if .ts files should be compiled as ESM or CommonJS.