目录
[npm 常用指令及其作用](#npm 常用指令及其作用)
[执行npm i 发生了什么?](#执行npm i 发生了什么?)
[1. 解析命令与参数](#1. 解析命令与参数)
[2. 检查依赖文件](#2. 检查依赖文件)
[3. 依赖版本解析与树构建](#3. 依赖版本解析与树构建)
[4. 缓存检查与包下载](#4. 缓存检查与包下载)
[5. 解压包到 node_modules](#5. 解压包到 node_modules)
[6. 更新 package-lock.json](#6. 更新 package-lock.json)
[7. 处理特殊依赖类型](#7. 处理特殊依赖类型)
[8. 执行生命周期脚本](#8. 执行生命周期脚本)
[9. 生成 node_modules/.bin 目录](#9. 生成 node_modules/.bin 目录)
[执行npm start 发生了什么?](#执行npm start 发生了什么?)
[1. 解析命令与 package.json 查找](#1. 解析命令与 package.json 查找)
[2. 执行生命周期钩子](#2. 执行生命周期钩子)
[3. 环境变量与路径设置](#3. 环境变量与路径设置)
[4. 执行用户定义的脚本](#4. 执行用户定义的脚本)
[5. 依赖工具链的启动(以 Create React App 为例)](#5. 依赖工具链的启动(以 Create React App 为例))
[6. 进程管理与信号处理](#6. 进程管理与信号处理)
[7. 常见场景与问题](#7. 常见场景与问题)
[场景 1:启动一个 Express 服务器](#场景 1:启动一个 Express 服务器)
[场景 2:启动前端开发服务器(如 Vue CLI)](#场景 2:启动前端开发服务器(如 Vue CLI))
[为什么需要 cross-env?](#为什么需要 cross-env?)
[1. 核心定位与关联性](#1. 核心定位与关联性)
[2. 核心差异对比](#2. 核心差异对比)
[3. 命令对比](#3. 命令对比)
[4. 使用场景示例](#4. 使用场景示例)
[1. 基础开发命令](#1. 基础开发命令)
[2. 测试与代码质量](#2. 测试与代码质量)
[3. 钩子脚本(Hooks)](#3. 钩子脚本(Hooks))
[4. 高级场景](#4. 高级场景)
[5. 实用工具](#5. 实用工具)
[6.完整的 package.json 示例](#6.完整的 package.json 示例)
什么是npm
npm(Node Package Manager) 是 JavaScript 的包管理工具,也是 Node.js 的默认包管理器。它用于安装、共享和管理项目依赖,拥有全球最大的开源库生态系统之一(npm 官网)
npm核心功能
依赖管理
-
通过
package.json文件记录项目依赖的包及其版本。 -
自动处理依赖树,解决版本冲突。
安装包
-
本地安装 (项目依赖):
javascriptnpm install <package-name> -
本地安装 (项目依赖):
bashnpm install -g <package-name>
发布与共享
开发者可以发布自己的包到 npm 仓库,供他人使用
javascript
"scripts": {
"start": "node app.js"
}
npm 常用指令及其作用
| 指令 | 作用 | 示例 |
|---|---|---|
npm init |
初始化项目,生成 package.json 文件 |
npm init -y(快速生成,跳过提问) |
npm install 或 npm i |
安装 package.json 中所有依赖 |
npm install |
npm install <package> |
安装指定包(默认添加到 dependencies) |
npm install express |
npm install <package> --save-dev 或 npm i <package> -D |
安装包并添加到 devDependencies(开发依赖) |
npm install eslint --save-dev |
npm install -g <package> |
全局安装包(通常用于命令行工具) | npm install -g nodemon |
npm uninstall <package> |
卸载指定包 | npm uninstall lodash |
npm update |
更新所有依赖到最新版本(遵循 package.json 的版本规则) |
npm update |
npm update <package> |
更新指定包 | npm update express |
npm outdated |
检查过时的依赖包 | npm outdated |
npm list 或 npm ls |
列出已安装的依赖树 | npm list --depth=0(仅显示顶层依赖) |
npm run <script> |
运行 package.json 中定义的脚本 |
npm run start |
npm start |
快捷命令,等同于 npm run start |
npm start |
npm test |
快捷命令,等同于 npm run test |
npm test |
npm publish |
发布包到 npm 仓库(需登录) | npm publish |
npm login |
登录 npm 账号 | npm login |
npm logout |
退出当前 npm 账号 | npm logout |
npm search <keyword> |
搜索 npm 仓库中的包 | npm search react |
npm view <package> |
查看包的详细信息(版本、依赖等) | npm view lodash |
npm audit |
检查依赖中的安全漏洞 | npm audit |
npm audit fix |
自动修复可修复的安全漏洞 | npm audit fix |
npm cache clean --force |
清空 npm 缓存(解决安装问题) | npm cache clean --force |
npm config set <key> <value> |
修改 npm 配置(如镜像源) | npm config set registry https://registry.npmmirror.com |
npm config get <key> |
获取 npm 配置值 | npm config get registry |
npm version <semver> |
更新项目版本号(遵循语义化版本) | npm version patch(更新补丁版本) |
关键说明
-
--save-devvs 默认安装- 开发工具(如
webpack、eslint)用--save-dev,生产代码依赖(如react)直接安装。
- 开发工具(如
-
全局安装 (
-g)- 适用于全局命令行工具(如
create-react-app),但需谨慎使用以避免权限问题。
- 适用于全局命令行工具(如
-
版本管理
package-lock.json会锁定依赖版本,确保团队环境一致,建议提交到版本控制。
执行npm i 发生了什么?
当运行 npm install(或 npm i)时,整个过程可以分解为以下步骤,涵盖依赖解析、缓存处理、文件操作及生命周期脚本执行:
1. 解析命令与参数
-
命令类型 :根据参数判断是全局安装(
-g)还是本地安装(默认)。本地安装会将依赖写入package.json的dependencies或devDependencies。 -
目标包 :若指定了包名(如
npm install lodash),npm 会明确安装该包;否则安装package.json中声明的所有依赖。
2. 检查依赖文件
-
package.json:读取项目根目录的package.json,获取dependencies、devDependencies、peerDependencies等信息。 -
package-lock.json或npm-shrinkwrap.json:-
若存在,npm 会优先按 lock 文件中的精确版本安装,确保依赖树一致。
-
若不存在,npm 会根据
package.json中的语义化版本(如^1.0.0)下载最新兼容版本,并生成新的package-lock.json。
-
3. 依赖版本解析与树构建
-
版本确定:
-
有 lock 文件:直接使用其中指定的版本。
-
无 lock 文件:根据
package.json的版本范围(SemVer)从 registry 获取最新满足条件的版本。
-
-
依赖树构建:
-
npm 会递归分析每个包的依赖,构建完整的依赖树。
-
扁平化处理(Dedupe) :npm v3+ 采用扁平化结构(hoisting),将可共用的依赖提升到较高层级,减少冗余。若同一包的不同版本无法提升,会嵌套安装在具体包的
node_modules下。 -
冲突处理:当多个包依赖同一包的不同版本时,npm 会尽量选择兼容版本;若无法解决,则各自安装所需版本。
-
4. 缓存检查与包下载
-
缓存目录 :npm 会检查本地缓存(默认位于
~/.npm),通过integrity字段(哈希值)验证包完整性。-
缓存命中:直接使用缓存中的包文件,无需下载。
-
缓存未命中 :从配置的 registry(默认
https://registry.npmjs.org/)下载压缩包(.tgz)。
-
-
网络请求:
-
下载包元数据(metadata)和压缩包。
-
支持重试机制和离线模式(
--offline)。
-
5. 解压包到 node_modules
-
文件解压 :将下载或缓存的包解压到项目
node_modules目录。-
扁平化结构 :主依赖放在顶层
node_modules,子依赖尽可能提升以减少嵌套。 -
符号链接(Symlink) :对全局安装的包或
npm link创建的包,生成符号链接。
-
6. 更新 package-lock.json
-
锁定依赖树:写入所有依赖及其子依赖的精确版本、下载地址、哈希值,确保后续安装的一致性。
-
格式同步 :若
package.json变更(如手动修改版本范围),npm 会调整package-lock.json以保持兼容。
7. 处理特殊依赖类型
-
optionalDependencies:可选依赖安装失败不会中断流程,仅警告。 -
peerDependencies:-
npm v7+:自动安装 peer 依赖(若未显式声明可能引发警告)。
-
旧版本:仅检查是否存在,需手动安装。
-
-
bundledDependencies:直接包含本地文件,不通过 registry 下载。
8. 执行生命周期脚本
按顺序执行包定义的生命周期钩子:
-
preinstall:安装前触发。 -
install:包安装后运行。 -
postinstall:通常用于编译原生模块(如node-gyp构建)。 -
其他钩子 :如
prepublish(已弃用,改用prepare)。
9. 生成 node_modules/.bin 目录
- 创建可执行文件的快捷方式,使 CLI 工具(如
webpack、eslint)可直接通过npx或npm scripts调用。
10.示例流程
假设运行 npm install lodash:
-
解析命令,确认安装
lodash到dependencies。 -
检查
package-lock.json,若无则向 registry 查询最新版本。 -
下载
lodash.tgz并验证哈希。 -
解压到
node_modules/lodash。 -
更新
package.json和package-lock.json。 -
执行
lodash的postinstall脚本(如果有)。
执行npm start 发生了什么?
当你在项目中执行 npm start 时,背后发生了一系列复杂的流程。以下是详细的分解步骤:
1. 解析命令与 package.json 查找
-
命令触发 :输入
npm start后,npm CLI 会解析start命令。 -
查找
package.json:npm 会从当前目录开始向上查找package.json文件,直到找到最近的配置文件。 -
读取
scripts字段 :在package.json的scripts对象中查找start字段:javascript{ "scripts": { "start": "node server.js" } } -
如果未定义
start,npm 会尝试默认行为:运行node server.js(若存在该文件)。 -
如果既没有定义
start也没有server.js,npm 会报错Missing script: "start"。
2. 执行生命周期钩子
npm 会按顺序触发与 start 相关的生命周期脚本(如果存在):
-
prestart:在start命令执行前运行。 -
start:执行用户定义的脚本。 -
poststart:在start命令执行后运行。
例如:
javascript
{
"scripts": {
"prestart": "echo '准备启动...'",
"start": "node app.js",
"poststart": "echo '已启动!'"
}
}
执行顺序为:prestart → start → poststart。
3. 环境变量与路径设置
npm 在执行脚本时,会为子进程(即脚本运行的进程)设置以下环境变量:
-
PATH扩展 :将项目的node_modules/.bin目录添加到PATH中,使得可以直接运行安装的 CLI 工具(如webpack、react-scripts)。 -
NODE_ENV默认值 :如果未显式设置,NODE_ENV默认为空(但在某些框架如 Create React App 中会强制设置为development)。 -
其他 npm 变量 :如
npm_package_name(包名)、npm_package_version(版本号)等,可直接在脚本中使用。
4. 执行用户定义的脚本
假设 package.json 中定义如下:
javascript
{
"scripts": {
"start": "react-scripts start"
}
}
实际执行流程:
-
路径解析 :npm 会在
node_modules/.bin中查找react-scripts可执行文件。 -
启动子进程:通过操作系统的 shell(如 Bash、PowerShell 或 cmd.exe)执行命令。
-
参数传递 :将
start作为参数传递给react-scripts。 -
保持进程运行:启动的进程(如开发服务器)会持续运行,直到手动终止(Ctrl+C)或发生错误。
5. 依赖工具链的启动(以 Create React App 为例)
以 react-scripts start 为例,详细流程:
-
检查依赖 :确保
webpack、babel、webpack-dev-server等工具已安装。 -
读取配置 :合并默认配置与项目中的
webpack.config.js(如有覆盖)。 -
启动开发服务器:
-
监听文件变化(通过
webpack --watch)。 -
启用热模块替换(HMR)。
-
打开浏览器(默认
http://localhost:3000)。
-
-
输出日志:在终端显示编译状态、错误或警告信息。
6. 进程管理与信号处理
-
保持进程活跃:开发服务器通常是长期运行的进程(如 Express 服务器或前端开发服务器)。
-
信号处理:
-
按下
Ctrl+C会发送SIGINT信号,终止进程。 -
进程崩溃时可能触发
SIGTERM。
-
-
后台进程 :如果脚本中启动了守护进程(如
node server.js &),npm 不会自动管理其生命周期。
7. 常见场景与问题
场景 1:启动一个 Express 服务器
直接运行 server.js,启动 HTTP 服务并监听端口。
javascript
{
"scripts": {
"start": "node server.js"
}
}
场景 2:启动前端开发服务器(如 Vue CLI)
触发 webpack-dev-server,提供热重载和代理配置。
javascript
{
"scripts": {
"start": "vue-cli-service serve"
}
}
常见问题:
-
权限问题 :若脚本需要管理员权限(如监听 80 端口),需使用
sudo npm start。 -
端口冲突 :如果端口被占用,进程会抛出
EADDRINUSE错误。 -
依赖缺失 :未安装
react-scripts或vue-cli-service会导致命令找不到。
8.总结
执行 npm start 的完整流程:
-
解析
package.json中的scripts.start。 -
触发
prestart钩子(如果有)。 -
设置环境变量并启动子进程。
-
执行用户定义的命令(如启动服务器或构建工具)。
-
触发
poststart钩子(如果有)。 -
保持进程运行直至手动终止。
coress-env
cross-env 是一个用于跨平台设置环境变量的 Node.js 工具。它解决了在不同操作系统(如 Windows 和 Unix 类系统)中设置环境变量语法不一致的问题,使得开发者可以在 package.json 的脚本中统一使用相同的命令。
为什么需要 cross-env?
在开发 Node.js 项目时,经常需要在命令行中设置环境变量。例如:
bash
# Unix 系统(Linux/macOS)
NODE_ENV=production node app.js
# Windows 系统
set NODE_ENV=production && node app.js
不同操作系统设置环境变量的语法不同,这会导致以下问题:
-
脚本不兼容 :在
package.json的scripts中编写的命令无法跨平台运行。 -
维护成本高:需要为不同操作系统编写不同的脚本。
cross-env 通过提供统一的命令格式,屏蔽了操作系统差异,使脚本更具可移植性。
coress-env核心功能
-
跨平台支持:在 Windows、macOS、Linux 中统一使用相同的命令。
-
简化脚本:无需编写条件判断或特定于平台的语法。
-
兼容性:支持所有 Node.js 版本和主流包管理工具(npm、Yarn、pnpm)。
coress-env安装
通过 npm 或 Yarn 安装为开发依赖:
bash
npm install --save-dev cross-env
# 或
yarn add --dev cross-env
coress-env基本用法
在 package.json 的 scripts 中使用 cross-env 设置环境变量:
示例 1:设置 NODE_ENV
javascript
{
"scripts": {
"build": "cross-env NODE_ENV=production webpack",
"start": "cross-env NODE_ENV=development node server.js"
}
}
示例 2:传递多个环境变量
javascript
{
"scripts": {
"test": "cross-env API_URL=http://localhost:3000 DEBUG=true mocha"
}
}
示例 3:处理带空格的值(需用引号包裹)
javascript
{
"scripts": {
"run:app": "cross-env GREETING=\"Hello World\" node app.js"
}
}
coress-env总结
cross-env 是解决跨平台环境变量设置问题的轻量级工具,通过统一命令语法:
-
消除 Windows 和 Unix 系统间的脚本差异。
-
简化
package.json的维护。 -
提升开发体验和团队协作效率。
npm、pnpm、yarm、bun、npx的差异
1. 核心定位与关联性
| 工具 | 定位 | 关联性 |
|---|---|---|
| npm | Node.js 默认包管理器 | 所有工具的基础,定义 package.json 规范,其他工具均兼容 npm 生态。 |
| pnpm | 高效磁盘存储包管理器 | 兼容 npm 命令和 package.json,通过硬链接和符号链接优化依赖存储。 |
| Yarn | 改进版包管理器 | 最初为解决 npm 性能问题而生,兼容 npm 生态,提供更严格的依赖锁定机制。 |
| Bun | 全栈运行时与包管理器 | 兼容 npm 和 Yarn 命令,内置超快包管理、测试、脚本运行等功能。 |
| npx | 临时执行包命令工具 | 随 npm 5.2+ 内置,用于直接运行本地或远程包的可执行文件。 |
2. 核心差异对比
| 特性 | npm | pnpm | Yarn | Bun | npx |
|---|---|---|---|---|---|
| 安装方式 | 嵌套存储依赖 | 全局存储 + 硬链接 | 扁平化存储 | 全局缓存 + 并行安装 | 不安装(直接执行) |
| 依赖存储 | node_modules 冗余 |
单一全局存储 + 符号链接 | 扁平化 node_modules |
全局缓存 + 符号链接 | 无 |
| 安装速度 | 较慢 | 快 | 快 | 极快(Rust 实现) | 快速(仅下载临时包) |
| 磁盘占用 | 高 | 低(共享依赖) | 中等 | 低 | 无 |
| Lock 文件 | package-lock.json |
pnpm-lock.yaml |
yarn.lock |
bun.lockb |
无 |
| 工作区支持 | 需要手动配置 | 内置 | 内置 | 内置 | 无 |
| 兼容性 | Node.js 标准 | 完全兼容 npm | 兼容 npm | 兼容 npm/Yarn | 依赖 npm |
| 核心优势 | 官方默认 | 节省磁盘空间 | 稳定可靠 | 极速全栈工具链 | 临时运行命令 |
| 缺点 | 依赖冗余、速度慢 | 生态兼容性偶发问题 | 配置复杂度较高 | 新工具生态待完善 | 无法管理长期依赖 |
3. 命令对比
| 操作 | npm | pnpm | Yarn | Bun | npx |
|---|---|---|---|---|---|
| 初始化项目 | npm init |
pnpm init |
yarn init |
bun init |
- |
| 安装依赖 | npm install |
pnpm install |
yarn install |
bun install |
- |
| 添加生产依赖 | npm add lodash |
pnpm add lodash |
yarn add lodash |
bun add lodash |
- |
| 添加开发依赖 | npm add -D eslint |
pnpm add -D eslint |
yarn add -D eslint |
bun add -d eslint |
- |
| 全局安装 | npm install -g tsc |
pnpm add -g tsc |
yarn global add tsc |
bun add -g tsc |
- |
| 运行脚本 | npm run dev |
pnpm run dev |
yarn dev |
bun run dev |
- |
| 临时执行命令 | npx create-react-app |
pnpm dlx create-react-app |
yarn dlx create-react-app |
bunx create-react-app |
npx create-react-app |
4. 使用场景示例
npm
-
场景:新项目默认使用,或需要与旧项目兼容。
-
示例:
bashnpm init -y npm install express npm run start
pnpm
-
场景:需节省磁盘空间(如 Monorepo 项目),或依赖版本冲突频繁。
-
示例:
bashpnpm add react@18 pnpm run build
Yarn
-
场景:需要严格依赖锁定或使用 Yarn Workspaces。
-
示例:
bashyarn add lodash --immutable yarn workspace frontend dev
Bun
-
场景:追求极速安装和全栈工具链(如同时管理 JS/TS 和 SQLite)。
-
示例:
bashbun install bun test bun run dev
npx
-
场景:临时运行脚手架工具或 CLI 命令。
-
示例:
bashnpx create-next-app@latest npx http-server ./dist
5.总结
-
npm:基础工具,适合大多数项目。
-
pnpm:适合磁盘敏感或依赖冲突多的场景。
-
Yarn:适合需要稳定锁文件或复杂 Monorepo。
-
Bun:适合追求速度和全栈能力的新项目。
-
npx:适合临时运行一次性命令。
常用命令行接口
以下是常见的命令行接口(CLI)选项列表,涵盖开发、工具链和服务器场景中的高频参数及其用途:
1.基础操作
| 参数 | 用途 | 示例 |
|---|---|---|
--help / -h |
显示帮助信息(命令用法和选项说明) | npm run build --help |
--version / -V |
显示工具或应用的版本号 | node --version |
--verbose |
输出详细日志(调试时使用) | webpack --verbose |
--silent |
静默模式(减少日志输出) | npm install --silent |
--dry-run |
模拟执行,不实际执行操作(测试命令效果) | npm publish --dry-run |
2.网络与端口
| 参数 | 用途 | 示例 |
|---|---|---|
--port / -p |
指定服务监听的端口号 | next dev --port 8080 |
--host |
指定服务绑定的主机(如 0.0.0.0 允许外部访问) |
vite --host 0.0.0.0 |
--open / -o |
启动后自动打开浏览器 | create-react-app --open |
--proxy |
设置代理服务器地址 | webpack-dev-server --proxy http://api.example.com |
3.文件与目录
| 参数 | 用途 | 示例 |
|---|---|---|
--config / -c |
指定配置文件路径 | eslint --config .eslintrc.cjs |
--output / -o |
指定输出目录或文件 | tsc --outDir dist |
--watch / -w |
监视文件变化并自动重新执行 | nodemon --watch src |
--force |
强制覆盖文件或跳过安全检查 | rm -rf --force node_modules |
4.环境与模式
| 参数 | 用途 | 示例 |
|---|---|---|
--mode |
设置运行模式(如 development/production) |
vite build --mode production |
--env |
注入环境变量 | webpack --env NODE_ENV=prod |
--production |
标记为生产环境(安装依赖时跳过 devDependencies) |
npm install --production |
5.调试与日志
| 参数 | 用途 | 示例 |
|---|---|---|
--debug |
启用调试模式(输出额外信息) | node --debug app.js |
--inspect |
启用 Node.js 调试器(配合 Chrome DevTools) | node --inspect server.js |
--log-level |
设置日志级别(如 error, warn, info) |
npm install --log-level warn |
6.依赖管理
| 参数 | 用途 | 示例 |
|---|---|---|
--save / -S |
将依赖添加到 dependencies(默认行为) |
npm install lodash --save |
--save-dev / -D |
将依赖添加到 devDependencies |
npm install eslint --save-dev |
--global / -g |
全局安装包(系统级可用) | npm install http-server -g |
7.其他高频参数
| 参数 | 用途 | 示例 |
|---|---|---|
--yes / -y |
自动确认所有提示(非交互模式) | npm init -y |
--ignore-scripts |
跳过包安装时的生命周期脚本执行 | npm install --ignore-scripts |
--timeout |
设置超时时间(如网络请求超时) | curl --timeout 5000 URL |
--no-optional |
跳过安装 optionalDependencies 中的依赖 |
npm install --no-optional |
8.总结
-
通用性 :大部分工具支持
--help和--version,是快速查阅文档的入口。 -
组合使用 :参数可组合(如
npm run dev -- --port 3000 --open)。 -
工具差异 :不同工具可能有特定参数(如
vite --strictPort强制端口占用检查)。 -
最佳实践 :具体参数以工具文档为准,使用前建议通过
--help验证。
script文件解读
1. 基础开发命令
| Key | 用途 | 工具示例 |
|---|---|---|
start |
启动本地开发服务器(如 React、Next.js 项目) | react-scripts start |
dev |
开发模式(常见于 Vite、Nuxt.js 项目) | vite |
serve |
启动开发服务器(Vue CLI 项目) | vue-cli-service serve |
build |
构建生产环境代码(压缩、打包、优化) | vite build |
preview |
本地预览生产构建结果(Vite 特有) | vite preview |
2. 测试与代码质量
| Key | 用途 | 工具示例 |
|---|---|---|
test |
运行单元测试 | jest |
test:watch |
监听文件变化自动运行测试 | jest --watch |
lint |
静态代码检查(检查语法、风格问题) | eslint |
lint:fix |
自动修复可修复的代码规范问题 | eslint --fix |
format |
代码格式化(统一缩进、引号等风格) | prettier --write |
typecheck |
TypeScript 类型检查(不生成文件) | tsc --noEmit |
3. 钩子脚本(Hooks)
| Key | 用途 | 示例场景 |
|---|---|---|
pre[start] |
在 start 命令前执行(如 prestart) |
类型检查、环境准备 |
post[build] |
在 build 命令后执行(如 postbuild) |
分析构建结果、清理临时文件 |
pre[test] |
在 test 命令前执行(如 pretest) |
先运行代码检查 |
4. 高级场景
| Key | 用途 | 工具示例 |
|---|---|---|
analyze |
分析构建产物体积(查看哪些模块占用较大) | source-map-explorer |
storybook |
启动组件开发环境(Storybook) | start-storybook |
deploy |
部署到静态托管平台(如 GitHub Pages、Vercel) | gh-pages |
docker:build |
构建 Docker 镜像 | docker build |
docker:run |
运行 Docker 容器 | docker run |
5. 实用工具
| Key | 用途 | 工具示例 |
|---|---|---|
clean |
清理构建产物或临时文件(如 dist、node_modules) |
rimraf |
prepare |
在 npm install 后自动执行(常用于安装 Git 钩子) |
husky install |
6.完整的 package.json 示例
javascript
{
"name": "my-project",
"version": "1.0.0",
"scripts": {
// --- 基础命令 ---
"start": "react-scripts start", // 启动开发服务器
"dev": "vite", // 开发模式(Vite)
"serve": "vue-cli-service serve", // 启动开发服务器(Vue CLI)
"build": "vite build", // 构建生产环境代码
"preview": "vite preview", // 预览生产构建结果
"test": "jest --coverage", // 运行测试(Jest)
"test:watch": "jest --watch", // 监听文件变化运行测试
"lint": "eslint . --ext .js,.ts", // 代码规范检查(ESLint)
"lint:fix": "eslint . --fix", // 自动修复代码规范问题
"format": "prettier --write .", // 代码格式化(Prettier)
"typecheck": "tsc --noEmit", // TypeScript 类型检查
"prepare": "husky install", // 安装 Git 钩子(Husky)
"clean": "rimraf dist node_modules", // 清理构建产物和依赖
// --- 钩子脚本 ---
"prestart": "npm run typecheck", // 在 `start` 前执行
"postbuild": "npm run analyze", // 在 `build` 后执行
"pretest": "npm run lint", // 在 `test` 前执行
// --- 高级场景 ---
"analyze": "source-map-explorer dist/*.js", // 分析构建包体积
"storybook": "start-storybook -p 6006", // 启动 Storybook
"deploy": "gh-pages -d dist", // 部署到 GitHub Pages
"docker:build": "docker build -t my-app .", // 构建 Docker 镜像
"docker:run": "docker run -p 8080:80 my-app" // 运行 Docker 容器
},
"dependencies": {
// 依赖项...
},
"devDependencies": {
// 开发依赖项...
}
}