npm init 是初始化 node.js 项目的标准命令,用于生成 package.json 文件:npm init -y 一键生成默认配置,npm init 则交互式自定义 name、version、main、type 等关键字段,其中 name 需小写短横线、type 建议设为 "module"、version 必须语义化(如 1.0.0)。

核心是把 package.json 当作项目的“依赖契约”——它不只记录装了什么,更决定装到哪、怎么装、何时装、谁来用。
初始化必须生成标准 package.json
没这个文件,npm 就不知道从哪开始。运行:
-
npm init -y:一键生成默认配置(推荐新手起步) -
npm init:交互式填写,可自定义入口(main)、类型(type)、作者等
关键字段不能错:
name 必须小写、短横线、数字,不能有空格或大写字母;
type 建议显式设为 "module"(用 ES 模块语法时),否则 import 和 require 混用会报错;
version 必须是合法语义化版本(如 1.0.0),不能写 1.0 或 dev。
依赖分类写进不同字段,行为完全不同
不是所有包都该塞进同一个地方。写错字段,轻则本地能跑线上炸,重则 CI 直接失败:
-
dependencies:运行时必需,比如
axios、react。安装命令:npm install axios→ 自动写入此字段 -
devDependencies:仅开发/构建/测试用,比如
eslint、vite。安装命令:npm install eslint -D→ 写入此字段 -
peerDependencies:不自动安装,由宿主项目提供(如组件库声明
"react": "^18.0.0")。漏配会警告,但不会阻止安装 -
optionalDependencies:安装失败也不中断流程(如
fsevents仅 macOS 有效)
误把 lodash 装进 devDependencies,上线后调用 _.debounce 就会直接报 ReferenceError: _ is not defined。
package-lock.json 是一致性底线,不是可选附件
它不是缓存,是精确快照——记录每个包的完整路径、哈希值、嵌套关系。删掉或手改,等于放弃可重现性:
- 每次
npm install都基于package.json + package-lock.json计算差异,只更新变动部分 - 多人协作必须提交它到 Git。否则 A 装的是
axios@1.6.0,B 可能装成axios@1.6.2,而后者存在未公开的 Promise race bug - 想彻底重装?先删
node_modules和package-lock.json,再npm install(不是npm update)
日常操作全靠它驱动,不是靠 node_modules
node_modules 是产物,package.json 才是源头。所有关键动作都围绕它展开:
-
npm install(无参数):读取package.json和package-lock.json,还原整个依赖树 -
npm install lodash@latest:升级并更新package.json中对应条目,同时刷新package-lock.json -
npm uninstall axios:从node_modules删除,并从package.json的dependencies中移除 -
npm list --depth=0:只看顶层依赖,快速确认package.json里写了哪些一级包
node_modules 不提交 Git,但 package.json 和 package-lock.json 缺一不可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











