理解npm的工作原理:优化你的项目依赖管理流程

目录

什么是npm

npm核心功能

[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 目录)

10.示例流程

[执行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))

常见问题:

8.总结

coress-env

[为什么需要 cross-env?](#为什么需要 cross-env?)

coress-env核心功能

coress-env安装

coress-env基本用法

coress-env总结

npm、pnpm、yarm、bun、npx的差异

[1. 核心定位与关联性](#1. 核心定位与关联性)

[2. 核心差异对比](#2. 核心差异对比)

[3. 命令对比](#3. 命令对比)

[4. 使用场景示例](#4. 使用场景示例)

npm

pnpm

Yarn

Bun

npx

5.总结

常用命令行接口

1.基础操作

2.网络与端口

3.文件与目录

4.环境与模式

5.调试与日志

6.依赖管理

7.其他高频参数

8.总结

script文件解读

[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 文件记录项目依赖的包及其版本。

  • 自动处理依赖树,解决版本冲突。

安装包

  • 本地安装 (项目依赖):

    javascript 复制代码
    npm install <package-name>
  • 本地安装 (项目依赖):

    bash 复制代码
    npm install -g <package-name>

发布与共享

开发者可以发布自己的包到 npm 仓库,供他人使用

javascript 复制代码
"scripts": {
  "start": "node app.js"
}

npm 常用指令及其作用

指令 作用 示例
npm init 初始化项目,生成 package.json 文件 npm init -y(快速生成,跳过提问)
npm installnpm i 安装 package.json 中所有依赖 npm install
npm install <package> 安装指定包(默认添加到 dependencies npm install express
npm install <package> --save-devnpm 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 listnpm 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(更新补丁版本)

关键说明

  1. --save-dev vs 默认安装

    • 开发工具(如 webpackeslint)用 --save-dev,生产代码依赖(如 react)直接安装。
  2. 全局安装 (-g)

    • 适用于全局命令行工具(如 create-react-app),但需谨慎使用以避免权限问题。
  3. 版本管理

    • package-lock.json 会锁定依赖版本,确保团队环境一致,建议提交到版本控制。

执行npm i 发生了什么?

当运行 npm install(或 npm i)时,整个过程可以分解为以下步骤,涵盖依赖解析、缓存处理、文件操作及生命周期脚本执行:

1. 解析命令与参数

  • 命令类型 :根据参数判断是全局安装(-g)还是本地安装(默认)。本地安装会将依赖写入 package.jsondependenciesdevDependencies

  • 目标包 :若指定了包名(如 npm install lodash),npm 会明确安装该包;否则安装 package.json 中声明的所有依赖。


2. 检查依赖文件

  • package.json :读取项目根目录的 package.json,获取 dependenciesdevDependenciespeerDependencies 等信息。

  • package-lock.jsonnpm-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. 执行生命周期脚本

按顺序执行包定义的生命周期钩子:

  1. preinstall:安装前触发。

  2. install:包安装后运行。

  3. postinstall :通常用于编译原生模块(如 node-gyp 构建)。

  4. 其他钩子 :如 prepublish(已弃用,改用 prepare)。


9. 生成 node_modules/.bin 目录

  • 创建可执行文件的快捷方式,使 CLI 工具(如 webpackeslint)可直接通过 npxnpm scripts 调用。

10.示例流程

假设运行 npm install lodash

  1. 解析命令,确认安装 lodashdependencies

  2. 检查 package-lock.json,若无则向 registry 查询最新版本。

  3. 下载 lodash.tgz 并验证哈希。

  4. 解压到 node_modules/lodash

  5. 更新 package.jsonpackage-lock.json

  6. 执行 lodashpostinstall 脚本(如果有)。

执行npm start 发生了什么?

当你在项目中执行 npm start 时,背后发生了一系列复杂的流程。以下是详细的分解步骤:

1. 解析命令与 package.json 查找

  • 命令触发 :输入 npm start 后,npm CLI 会解析 start 命令。

  • 查找 package.json :npm 会从当前目录开始向上查找 package.json 文件,直到找到最近的配置文件。

  • 读取 scripts 字段 :在 package.jsonscripts 对象中查找 start 字段:

    javascript 复制代码
    {
      "scripts": {
        "start": "node server.js"
      }
    }
  • 如果未定义 start,npm 会尝试默认行为:运行 node server.js(若存在该文件)。

  • 如果既没有定义 start 也没有 server.js,npm 会报错 Missing script: "start"

2. 执行生命周期钩子

npm 会按顺序触发与 start 相关的生命周期脚本(如果存在):

  1. prestart :在 start 命令执行前运行。

  2. start:执行用户定义的脚本。

  3. poststart :在 start 命令执行后运行。

例如:

javascript 复制代码
{
  "scripts": {
    "prestart": "echo '准备启动...'",
    "start": "node app.js",
    "poststart": "echo '已启动!'"
  }
}

执行顺序为:prestartstartpoststart

3. 环境变量与路径设置

npm 在执行脚本时,会为子进程(即脚本运行的进程)设置以下环境变量:

  • PATH 扩展 :将项目的 node_modules/.bin 目录添加到 PATH 中,使得可以直接运行安装的 CLI 工具(如 webpackreact-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"
  }
}

实际执行流程:

  1. 路径解析 :npm 会在 node_modules/.bin 中查找 react-scripts 可执行文件。

  2. 启动子进程:通过操作系统的 shell(如 Bash、PowerShell 或 cmd.exe)执行命令。

  3. 参数传递 :将 start 作为参数传递给 react-scripts

  4. 保持进程运行:启动的进程(如开发服务器)会持续运行,直到手动终止(Ctrl+C)或发生错误。

5. 依赖工具链的启动(以 Create React App 为例)

react-scripts start 为例,详细流程:

  1. 检查依赖 :确保 webpackbabelwebpack-dev-server 等工具已安装。

  2. 读取配置 :合并默认配置与项目中的 webpack.config.js(如有覆盖)。

  3. 启动开发服务器

    • 监听文件变化(通过 webpack --watch)。

    • 启用热模块替换(HMR)。

    • 打开浏览器(默认 http://localhost:3000)。

  4. 输出日志:在终端显示编译状态、错误或警告信息。


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-scriptsvue-cli-service 会导致命令找不到。

8.总结

执行 npm start 的完整流程:

  1. 解析 package.json 中的 scripts.start

  2. 触发 prestart 钩子(如果有)。

  3. 设置环境变量并启动子进程。

  4. 执行用户定义的命令(如启动服务器或构建工具)。

  5. 触发 poststart 钩子(如果有)。

  6. 保持进程运行直至手动终止。

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

不同操作系统设置环境变量的语法不同,这会导致以下问题:

  1. 脚本不兼容 :在 package.jsonscripts 中编写的命令无法跨平台运行。

  2. 维护成本高:需要为不同操作系统编写不同的脚本。

cross-env 通过提供统一的命令格式,屏蔽了操作系统差异,使脚本更具可移植性。

coress-env核心功能

  1. 跨平台支持:在 Windows、macOS、Linux 中统一使用相同的命令。

  2. 简化脚本:无需编写条件判断或特定于平台的语法。

  3. 兼容性:支持所有 Node.js 版本和主流包管理工具(npm、Yarn、pnpm)。

coress-env安装

通过 npm 或 Yarn 安装为开发依赖:

bash 复制代码
npm install --save-dev cross-env
# 或
yarn add --dev cross-env

coress-env基本用法

package.jsonscripts 中使用 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

  • 场景:新项目默认使用,或需要与旧项目兼容。

  • 示例

    bash 复制代码
    npm init -y
    npm install express
    npm run start

pnpm

  • 场景:需节省磁盘空间(如 Monorepo 项目),或依赖版本冲突频繁。

  • 示例

    bash 复制代码
    pnpm add react@18
    pnpm run build

Yarn

  • 场景:需要严格依赖锁定或使用 Yarn Workspaces。

  • 示例

    bash 复制代码
    yarn add lodash --immutable
    yarn workspace frontend dev

Bun

  • 场景:追求极速安装和全栈工具链(如同时管理 JS/TS 和 SQLite)。

  • 示例

    bash 复制代码
    bun install
    bun test
    bun run dev

npx

  • 场景:临时运行脚手架工具或 CLI 命令。

  • 示例

    bash 复制代码
    npx 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 清理构建产物或临时文件(如 distnode_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": {
    // 开发依赖项...
  }
}
相关推荐
我真的不会C3 分钟前
QT窗口相关控件及其属性
开发语言·qt
CodeCraft Studio3 分钟前
Excel处理控件Aspose.Cells教程:使用 Python 在 Excel 中进行数据验
开发语言·python·excel
장숙혜6 分钟前
ElementUi的Dropdown下拉菜单的详细介绍及使用
前端·javascript·vue.js
火柴盒zhang9 分钟前
websheet之 编辑器
开发语言·前端·javascript·编辑器·spreadsheet·websheet
某公司摸鱼前端12 分钟前
uniapp 仿企微左边公司切换页
前端·uni-app·企业微信
WKK_15 分钟前
uniapp自定义封装tabbar
前端·javascript·小程序·uni-app
莫问alicia15 分钟前
react 常用钩子 hooks 总结
前端·javascript·react.js
景天科技苑16 分钟前
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
开发语言·后端·rust·match·enum·枚举与模式匹配·rust枚举与模式匹配
阿让啊22 分钟前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
Mintopia24 分钟前
图形学中的数学基础与 JavaScript 实践
前端·javascript·计算机图形学