npm是JavaScript项目的包管理器,负责依赖解析、版本锁定、模块隔离和脚本执行;无package.json即非npm项目;init时慎用-y,关键字段需手动补全;install行为受NODE_ENV影响;ci严格按lock文件安装;exports限制子路径导入;lock文件必须提交Git。

npm 是 JavaScript 项目的包管理器,不是“安装工具”或“下载器”——它负责解析依赖关系、锁定版本、隔离本地模块、执行脚本。项目里没 package.json,就等于没 npm 项目。
npm init 初始化时该不该用 -y 参数
用 npm init -y 会跳过交互,生成默认 package.json,但关键字段如 main、types、exports 都为空或不准确。尤其 TypeScript 项目或要发布到 npm 的库,必须手动补全。
-
name字段不能以点号或下划线开头,且不能包含大写字母(否则 publish 失败) -
version必须是合法语义化版本(如1.0.0),不能是0.1或dev -
main指向的入口文件必须真实存在,否则require('your-pkg')报Cannot find module
npm install 为什么有时装 devDependencies,有时不装
行为取决于当前环境和命令参数:npm install 默认装 dependencies 和 devDependencies;但若系统环境变量 NODE_ENV=production,则只装 dependencies(跳过 devDependencies)。
- CI/CD 构建时常见误操作:未显式设置
NODE_ENV,导致jest、eslint等缺失,npm test直接报错command not found - 想强制装全部,加
--include=dev(npm v8.3+);旧版可用NODE_ENV=development npm install -
npm ci总是严格按package-lock.json安装,不读package.json的 ^~ 范围,适合部署
node_modules 里的包为什么找不到 exports 字段
从 npm v7 开始默认启用 exports 字段做子路径导入限制,但很多老包没适配。当你 import lodash/debounce 报错 Package subpath './debounce' is not defined by "exports",说明该包的 package.json 声明了 "exports" 但没放开子路径。
立即学习“Java免费学习笔记(深入)”;
解决方式不是删 exports,而是改用兼容写法:
import debounce from 'lodash/debounce'; // ❌ 报错(如果 exports 未声明 ./debounce)
import { debounce } from 'lodash'; // ✅ 正确(前提是 exports 包含 ./index 或默认导出)
- 检查包的
package.json中exports是否包含"./debounce"或"./functions/debounce" - 临时绕过:加
"type": "commonjs"到你自己的package.json,并用require()(但破坏 ESM 一致性) - 真正可靠的做法是升级到已修复该问题的包版本,或换用明确支持子路径导出的替代品(如
lodash-es)
最常被忽略的是 package-lock.json 的提交策略:它必须进 Git,否则团队成员安装结果不一致;但很多人把它加进了 .gitignore,导致 CI 和本地行为割裂。










