第一部分:npm 本质理解
什么是 npm?
npm 是:
Node Package Manager
它是:
-
一个包管理工具
-
一个全球最大的 JavaScript 包仓库
-
一个依赖版本管理系统
官方网站属于:
npm, Inc.
现在归属于:
GitHub
第二部分:初始化一个工程
bash
mkdir day5-demo
cd day5-demo
npm init -y
生成:
bash
Wrote to 自己本地的路径\day5-demo\package.json:
{
"name": "day5-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
详细解释
1 mkdir day5-demo
mkdir = make directory(创建文件夹)
意思是:创建一个名为 day5-demo 的文件夹
📌 本质:
为一个"独立项目"准备一个单独空间。
2 cd day5-demo
cd = change directory(切换目录)
意思是:进入 day5-demo 这个文件夹
📌 本质:
后续所有操作都在这个项目目录里进行。
如果不 cd,npm 会在外层目录初始化项目。
3 npm init -y
这是重点。
npm init 是什么?
它会:
创建一个 package.json 文件
这是 Node 项目的"身份证"。
那 -y 是什么?
-y = yes
意思是:自动使用默认配置生成 package.json
如果不写 -y:
bash
npm init
它会让你手动输入:
-
name
-
version
-
description
-
entry file
-
license
-
等等
写 -y 就是:
👉 全部默认,直接生成。
4 逐字段解析你生成的内容
bash
{
"name": "day5-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
1️⃣ name
项目名称。
bash
"name": "day5-demo"
⚠️ 发布到 npm 时必须唯一(全网唯一)。
2️⃣ version
bash
"version": "1.0.0"
语义化版本号:
bash
主版本.次版本.修订版本
major.minor.patch
例如:
-
1.0.0 → 正式版
-
1.0.1 → 修复 bug
-
1.1.0 → 新增功能
-
2.0.0 → 重大升级
3️⃣ main
bash
"main": "index.js"
入口文件。
意思是:
bash
require('day5-demo')
默认会加载:index.js(类似 .NET 项目的 Program.cs)
4️⃣ scripts
bash
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
}
这里是:
👉 项目命令入口
比如以后你可以写:
bash
"scripts": {
"start": "node index.js"
}
然后运行:
bash
npm run start
这就是工程化的第一步。
5️⃣ license
bash
"license": "ISC"
开源协议。
常见的:
-
MIT
-
ISC
-
Apache
-
GPL
个人项目一般 MIT 或 ISC。
第三部分:安装依赖
安装一个包试试:
bash
npm install lodash
你会看到:
-
生成 node_modules
-
生成 package-lock.json
-
package.json 里出现 dependencies
lodash 是什么?
Lodash
一个常用工具库。
第四部分:版本号机制(非常重要)
假设:
bash
"lodash": "^4.17.21"
规则:
| 符号 | 含义 |
|---|---|
| ^ | 锁定大版本 |
| ~ | 锁定小版本 |
| 无符号 | 精确版本 |
例子:^4.17.21 允许升级到:4.x.x 但不能升级到:5.0.0
第五部分:小作业
在 package.json 中添加:
javascript
"scripts": {
"start": "node index.js"
}
安装包 axios
bash
npm install axios
创建index.js
javascript
const axios = require('axios')
axios.get('https://api.github.com')
.then(res => {
console.log(res.status)
})
安装成功后
bash
npm run start
即可得到
bash
> day5-demo@1.0.0 start
> node index.js
200
说明:
✅ axios 请求成功
✅ GitHub API 返回状态码 200
✅ 你的 Node 项目依赖机制工作正常
第六部分:需要额外清楚的几个问题
1️⃣ npm 和 Node 的关系?
🔹 Node 是什么?
Node.js
它是:
JavaScript 运行时环境
作用:
-
执行 JS
-
提供文件系统
-
提供网络能力
-
提供模块机制
🔹 npm 是什么?
npm
它是:
Node 的包管理工具
作用:
-
下载第三方库
-
管理依赖版本
-
管理项目配置
-
运行 scripts
✅ 关系总结
| 项目 | 角色 |
|---|---|
| Node | 引擎(运行 JS) |
| npm | 仓库管理员(管理依赖) |
类比:
| .NET 世界 | Node 世界 |
|---|---|
| dotnet runtime | Node |
| NuGet | npm |
2️⃣ node_modules 为什么不能提交到 Git?
🔹 ① 体积巨大
因为:
-
每个包
-
依赖别的包
-
再依赖别的包
形成依赖树。
🔹 ② 可以重新生成
只要有package.json package-lock.json
执行
bash
npm install
就能重新生成 node_modules。
🔹 ③ 不可读
node_modules 不是你写的代码。
提交它:
-
增加 Git 仓库体积
-
影响 clone 速度
-
制造冲突
🔹 ④ 团队协作原则
3️⃣ package-lock.json 的作用?
这是 依赖锁文件。
它解决一个核心问题:
同样的 package.json,在不同时间安装版本可能不同。
举例
package.json:
javascript
"axios": "^1.6.0"
^ 允许升级小版本。
今天:1.6.2 明天:1.6.5
版本可能变。
package-lock.json 的作用
它会记录:
-
精确版本
-
依赖树
-
每个子依赖的版本
保证:
所有人安装结果 100% 一样
团队工程必备必须提交
4️⃣ dependencies 和 devDependencies 区别?
🔹 dependencies
生产环境需要的依赖。
例如:
-
axios
-
express
-
mysql
安装方式
bash
npm install axios
🔹 devDependencies
开发环境用的工具。
例如:
-
eslint
-
prettier
-
typescript
-
nodemon
安装方式
bash
npm install nodemon --save-dev
🔥 核心区别
| 类型 | 生产环境会安装? | 用途 |
|---|---|---|
| dependencies | ✅ 会 | 运行代码 |
| devDependencies | ❌ 不一定 | 辅助开发 |
5️⃣ 为什么团队必须锁版本?
这是最重要的问题。
🚨 如果不锁版本
可能出现:
-
你电脑正常
-
同事电脑报错
-
线上服务器崩溃
因为:依赖偷偷升级了
所以必须:
✔ 提交 package-lock.json
✔ CI 使用锁文件安装
✔ 禁止随意升级