目录
[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-dev
vs 默认安装- 开发工具(如
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": {
// 开发依赖项...
}
}