当前位置: 首页 > news >正文

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

目录

什么是npm

npm核心功能

npm 常用指令及其作用

执行npm i 发生了什么?

1. 解析命令与参数

2. 检查依赖文件

3. 依赖版本解析与树构建

4. 缓存检查与包下载

5. 解压包到 node_modules

6. 更新 package-lock.json

7. 处理特殊依赖类型

8. 执行生命周期脚本

9. 生成 node_modules/.bin 目录

10.示例流程

执行npm start 发生了什么?

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

2. 执行生命周期钩子

3. 环境变量与路径设置

4. 执行用户定义的脚本

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

6. 进程管理与信号处理

7. 常见场景与问题

场景 1:启动一个 Express 服务器

场景 2:启动前端开发服务器(如 Vue CLI)

常见问题:

8.总结

coress-env

为什么需要 cross-env?

coress-env核心功能

coress-env安装

coress-env基本用法

coress-env总结

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

1. 核心定位与关联性

2. 核心差异对比

3. 命令对比

4. 使用场景示例

npm

pnpm

Yarn

Bun

npx

 5.总结

常用命令行接口

1.基础操作

2.网络与端口

3.文件与目录

4.环境与模式

5.调试与日志

6.依赖管理

7.其他高频参数

8.总结

script文件解读

1. 基础开发命令

2. 测试与代码质量

3. 钩子脚本(Hooks)

4. 高级场景

5. 实用工具

6.完整的 package.json 示例


什么是npm

npm(Node Package Manager) 是 JavaScript 的包管理工具,也是 Node.js 的默认包管理器。它用于安装、共享和管理项目依赖,拥有全球最大的开源库生态系统之一(npm 官网)

npm核心功能

依赖管理

  • 通过 package.json 文件记录项目依赖的包及其版本。

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

安装包

  • 本地安装(项目依赖):
    npm install <package-name>
  • 本地安装(项目依赖):
    npm install -g <package-name>

发布与共享

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

"scripts": {"start": "node app.js"
}

npm 常用指令及其作用

指令作用示例
npm init初始化项目,生成 package.json 文件npm init -y(快速生成,跳过提问)
npm install 或 npm i安装 package.json 中所有依赖npm install
npm install <package>安装指定包(默认添加到 dependenciesnpm 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 startnpm start
npm test快捷命令,等同于 npm run testnpm 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.json 的 dependencies 或 devDependencies

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


2. 检查依赖文件

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

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

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

  1. preinstall:安装前触发。

  2. install:包安装后运行。

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

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


9. 生成 node_modules/.bin 目录

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


10.示例流程

假设运行 npm install lodash

  1. 解析命令,确认安装 lodash 到 dependencies

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

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

  4. 解压到 node_modules/lodash

  5. 更新 package.json 和 package-lock.json

  6. 执行 lodash 的 postinstall 脚本(如果有)。

    执行npm start 发生了什么?

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

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

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

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

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

      {"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 命令执行后运行。

    例如:

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

    执行顺序为:prestart → start → poststart

    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 中定义如下:

    {"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 服务并监听端口。

    {"scripts": {"start": "node server.js"}
    }

    场景 2:启动前端开发服务器(如 Vue CLI)

    触发 webpack-dev-server,提供热重载和代理配置。

    {"scripts": {"start": "vue-cli-service serve"}
    }

    常见问题

    • 权限问题:若脚本需要管理员权限(如监听 80 端口),需使用 sudo npm start

    • 端口冲突:如果端口被占用,进程会抛出 EADDRINUSE 错误。

    • 依赖缺失:未安装 react-scripts 或 vue-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 项目时,经常需要在命令行中设置环境变量。例如:

    # Unix 系统(Linux/macOS)
    NODE_ENV=production node app.js# Windows 系统
    set NODE_ENV=production && node app.js

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

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

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

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

    coress-env核心功能

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

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

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

    coress-env安装

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

    npm install --save-dev cross-env
    # 或
    yarn add --dev cross-env

    coress-env基本用法

    在 package.json 的 scripts 中使用 cross-env 设置环境变量:

    示例 1:设置 NODE_ENV

    {"scripts": {"build": "cross-env NODE_ENV=production webpack","start": "cross-env NODE_ENV=development node server.js"}
    }

    示例 2:传递多个环境变量

    {"scripts": {"test": "cross-env API_URL=http://localhost:3000 DEBUG=true mocha"}
    }

    示例 3:处理带空格的值(需用引号包裹)

    {"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. 核心定位与关联性

    工具定位关联性
    npmNode.js 默认包管理器所有工具的基础,定义 package.json 规范,其他工具均兼容 npm 生态。
    pnpm高效磁盘存储包管理器兼容 npm 命令和 package.json,通过硬链接和符号链接优化依赖存储。
    Yarn改进版包管理器最初为解决 npm 性能问题而生,兼容 npm 生态,提供更严格的依赖锁定机制。
    Bun全栈运行时与包管理器兼容 npm 和 Yarn 命令,内置超快包管理、测试、脚本运行等功能。
    npx临时执行包命令工具随 npm 5.2+ 内置,用于直接运行本地或远程包的可执行文件。

    2. 核心差异对比

    特性npmpnpmYarnBunnpx
    安装方式嵌套存储依赖全局存储 + 硬链接扁平化存储全局缓存 + 并行安装不安装(直接执行)
    依赖存储node_modules 冗余单一全局存储 + 符号链接扁平化 node_modules全局缓存 + 符号链接
    安装速度较慢极快(Rust 实现)快速(仅下载临时包)
    磁盘占用低(共享依赖)中等
    Lock 文件package-lock.jsonpnpm-lock.yamlyarn.lockbun.lockb
    工作区支持需要手动配置内置内置内置
    兼容性Node.js 标准完全兼容 npm兼容 npm兼容 npm/Yarn依赖 npm
    核心优势官方默认节省磁盘空间稳定可靠极速全栈工具链临时运行命令
    缺点依赖冗余、速度慢生态兼容性偶发问题配置复杂度较高新工具生态待完善无法管理长期依赖

    3. 命令对比

    操作npmpnpmYarnBunnpx
    初始化项目npm initpnpm inityarn initbun init-
    安装依赖npm installpnpm installyarn installbun install-
    添加生产依赖npm add lodashpnpm add lodashyarn add lodashbun add lodash-
    添加开发依赖npm add -D eslintpnpm add -D eslintyarn add -D eslintbun add -d eslint-
    全局安装npm install -g tscpnpm add -g tscyarn global add tscbun add -g tsc-
    运行脚本npm run devpnpm run devyarn devbun run dev-
    临时执行命令npx create-react-apppnpm dlx create-react-appyarn dlx create-react-appbunx create-react-appnpx create-react-app

    4. 使用场景示例

    npm

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

    • 示例

      npm init -y
      npm install express
      npm run start

    pnpm

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

    • 示例

      pnpm add react@18
      pnpm run build

    Yarn

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

    • 示例

      yarn add lodash --immutable
      yarn workspace frontend dev

    Bun

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

    • 示例

      bun install
      bun test
      bun run dev

    npx

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

    • 示例

      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/productionvite build --mode production
    --env注入环境变量webpack --env NODE_ENV=prod
    --production标记为生产环境(安装依赖时跳过 devDependenciesnpm install --production

    5.调试与日志

    参数用途示例
    --debug启用调试模式(输出额外信息)node --debug app.js
    --inspect启用 Node.js 调试器(配合 Chrome DevTools)node --inspect server.js
    --log-level设置日志级别(如 errorwarninfonpm install --log-level warn

    6.依赖管理

    参数用途示例
    --save / -S将依赖添加到 dependencies(默认行为)npm install lodash --save
    --save-dev / -D将依赖添加到 devDependenciesnpm 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
    typecheckTypeScript 类型检查(不生成文件)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_modulesrimraf
    prepare在 npm install 后自动执行(常用于安装 Git 钩子)husky install

    6.完整的 package.json 示例

    {"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": {// 开发依赖项...}
    }

    相关文章:

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

    目录 什么是npm npm核心功能 npm 常用指令及其作用 执行npm i 发生了什么? 1. 解析命令与参数 2. 检查依赖文件 3. 依赖版本解析与树构建 4. 缓存检查与包下载 5. 解压包到 node_modules 6. 更新 package-lock.json 7. 处理特殊依赖类型 8. 执行生命周期脚本 9. …...

    【Python笔记 04】输入函数、转义字符

    一、Input 输入函数 prompt是提示&#xff0c;会在控制台显示&#xff0c;用作提示函数。 name input("请输入您的姓名&#xff1a;") print (name)提示你输入任意信息&#xff1a; 输入input test后回车&#xff0c;他输出input test 二、常用的转义字符 只讲…...

    MySQL数据库基本操作-DQL-基本查询

    数据库的操作中&#xff0c;查询是最重要的 一、基本查询-数据准备 -- 数据准备 create database if not exists mydb2; use mydb2; create table product( pid int primary key auto_increment, pname varchar(20) not null, price double, category_id varchar(20) …...

    13、性能优化:魔法的流畅之道——React 19 memo/lazy

    一、记忆封印术&#xff08;React.memo&#xff09; 1. 咒语本质 "memo是时间转换器的记忆晶石&#xff0c;冻结无意义的能量波动&#xff01;" 通过浅层比较&#xff08;shallowCompare&#xff09;或自定义预言契约&#xff0c;阻止组件在props未变时重新渲染。 …...

    低代码平台开发手机USB-HID调试助手

    项目介绍 USB-HID调试助手是一种专门用于调试和测试USB-HID设备的软件工具。USB-HID设备是一类通过USB接口与计算机通信的设备&#xff0c;常见的HID设备包括键盘、鼠标、游戏控制器、以及一些专用的工业控制设备等。 主要功能包括&#xff1a; 数据监控&#xff1a;实时监控和…...

    Langchain_Agent+数据库

    本处使用Agent数据库&#xff0c;可以直接执行SQL语句。可以多次循环查询问题 前文通过chain去联系数据库并进行操作&#xff1b; 通过链的不断内嵌组合&#xff0c;生成SQL在执行SQL再返回。 初始化 import os from operator import itemgetterimport bs4 from langchain.ch…...

    Code Splitting 分包策略

    以下是关于分包策略(Code Splitting)的深度技术解析,涵盖原理、策略、工具实现及优化技巧: 一、分包核心价值与底层原理 1. 核心价值矩阵 维度未分包场景合理分包后首屏速度需加载全部资源仅加载关键资源缓存效率任意修改导致全量缓存失效按模块变更频率分层缓存并行加载单…...

    AI 开发入门之 RAG 技术

    目录 一、从一个简单的问题开始二、语言模型“闭卷考试”的困境三、RAG 是什么—LLM 的现实世界“外挂”四、RAG 的七步流程第一步&#xff1a;加载数据&#xff08;Load&#xff09;第二步&#xff1a;切分文本&#xff08;Chunking&#xff09;第三步&#xff1a;向量化&…...

    day36图像处理OpenCV

    文章目录 一、图像预处理18 模板匹配18.1模板匹配18.2 匹配方法18.2.1 平方差匹配18.2.2 归一化平方差匹配18.2.3 相关匹配18.2.4 归一化相关匹配18.2.5 相关系数匹配18.2.6 归一化相关系数匹配 18.3 绘制轮廓18.4案例 一、图像预处理 18 模板匹配 18.1模板匹配 模板匹配就是…...

    系统与网络安全------弹性交换网络(3)

    资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 STP协议 环路的危害 单点故障 PC之间的互通链路仅仅存在1个 任何一条链路出现问题&#xff0c;PC之间都会无法通信 解决办法 提高网络可靠性 增加冗余/备份链路 增加备份链路后交换网络上产生二层环路 …...

    FPGA上实现YOLOv5的一般过程

    在FPGA上实现YOLOv5 YOLO算法现在被工业界广泛的应用&#xff0c;虽说现在有很多的NPU供我们使用&#xff0c;但是我们为了自己去实现一个NPU所以在本文中去实现了一个可以在FPGA上运行的YOLOv5。 YOLOv5的开源代码链接为 https://github.com/ultralytics/yolov5 为了在FPGA中…...

    verilog和system verilog常用数据类型以及常量汇总

    int和unsigned 在 Verilog-2001 中&#xff0c;没有 int 和 unsigned 这样的数据类型。这些关键字是 SystemVerilog 的特性&#xff0c;而不是 Verilog-2001 的一部分。 Verilog-2001 的数据类型 在 Verilog-2001 中&#xff0c;支持的数据类型主要包括以下几种&#xff1a; …...

    wordpress学习笔记

    P1 P2 P3...

    Rust 学习笔记:编程语言的相关概念

    Rust 学习笔记&#xff1a;编程语言的相关概念 Rust 学习笔记&#xff1a;编程语言的相关概念动态类型 vs 静态类型动态类型 (Dynamically Typed)静态类型 (Statically Typed)对比示例 强类型 vs 弱类型强类型 (Strongly Typed)弱类型 (Weakly Typed)对比示例 编译型语言 vs 解…...

    react nativeWebView跨页面通信

    场景 react native项目里&#xff0c;有一些移动端的应用喜欢使用h5来开发&#xff0c;会出现需要跨tab和跨页面通信的场景&#xff0c;可以使用pubsub-js来实现通信。 实现思路 在react native 层实现pubsub的公共API&#xff0c;提供订阅消息、发布消息、取消订阅接口&…...

    Python爬虫(3)HTML核心技巧:从零掌握class与id选择器,精准定位网页元素

    目录 一、背景与意义‌二、class与id的基础概念与语法规则‌2.1 什么是class与id&#xff1f;‌2.2 核心区别总结 三、应用场景与实战案例‌3.1 场景1&#xff1a;CSS样式管理‌3.2 场景2&#xff1a;JavaScript交互‌3.3 场景3&#xff1a;SEO优化与语义化‌ 四、常见误区与最…...

    BGE(BAAI General Embedding)模型详解

    BGE&#xff08;BAAI General Embedding&#xff09;模型详解 BGE&#xff08;BAAI General Embedding&#xff09;是北京智源人工智能研究院&#xff08;BAAI&#xff09;推出的通用文本嵌入模型系列&#xff0c;旨在为各种自然语言处理任务提供高质量的向量表示。 一、BGE模…...

    【Linux网络】应用层自定义协议与序列化及Socket模拟封装

    &#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

    Rust项目GPG签名配置指南

    Rust项目GPG签名配置指南 一、环境准备 # 安装Gpg4win&#xff08;Windows&#xff09; winget install -e --id GnuPG.Gpg4win二、密钥生成与配置 # 生成RSA4096密钥 gpg --full-generate-key # 类型选RSA and RSA&#xff0c;长度4096&#xff0c;邮箱填z3266420686202216…...

    6.第六章:数据分类的技术体系

    文章目录 6.1 数据分类的技术架构6.1.1 数据分类的整体流程6.1.2 数据分类的技术组件6.1.2.1 数据采集与预处理6.1.2.2 特征工程与选择6.1.2.3 分类模型构建6.1.2.4 模型评估与优化6.1.2.5 分类结果应用与反馈 6.2 数据分类的核心技术与算法6.2.1 传统机器学习算法6.2.2 深度学…...

    Nginx 反向代理,啥是“反向代理“啊,为啥叫“反向“代理?而不叫“正向”代理?它能干哈?

    Nginx 反向代理的理解与配置 User 我打包了我的前端vue项目&#xff0c;上传到服务器&#xff0c;在宝塔面板安装了nginx服务&#xff0c;配置了文件 nginx.txt .运行了项目。 我想清楚&#xff0c;什么是nginx反向代理&#xff1f;是nginx作为一个中介&#xff1f;中间件来集…...

    下篇:深入剖析 BLE GATT / GAP / SMP 与应用层(约5000字)

    引言 在 BLE 协议栈的最上层,GAP 定义设备角色与连接管理,GATT 构建服务与特征,SMP 负责安全保障,应用层则承载具体业务逻辑与 Profile。掌握这一层,可实现安全可靠的设备发现、配对、服务交互和定制化业务。本文将详解 GAP、GATT、SMP 三大模块,并通过示例、PlantUML 时…...

    Linux Awk 深度解析:10个生产级自动化与云原生场景

    看图猜诗&#xff0c;你有任何想法都可以在评论区留言哦~ 摘要 Awk 作为 Linux 文本处理三剑客中的“数据工程师”&#xff0c;凭借字段分割、模式匹配和数学运算三位一体的能力&#xff0c;成为处理结构化文本&#xff08;日志、CSV、配置文件&#xff09;的终极工具。本文聚…...

    无人设备遥控之调度自动化技术篇

    无人设备遥控器的调度自动化技术是现代科技发展的重要成果&#xff0c;它通过集成先进的通信、控制、传感器及人工智能技术&#xff0c;实现了对无人设备的高效、精准调度与自动化管理。 一、核心技术 无线通信技术 调度自动化依赖于高速、稳定的无线通信网络&#xff08;如5…...

    STM32F407 HAL库使用 DMA_Normal 模式实现 UART 循环发送(无需中断)

    在 STM32 开发中&#xff0c;很多人喜欢使用 DMA 来加速串口发送数据。然而&#xff0c;默认的 DMA 往往配合中断或使用循环模式&#xff08;DMA_CIRCULAR&#xff09;使用。但在某些特定需求下&#xff0c;我们希望&#xff1a; 使用 DMA_NORMAL 模式&#xff0c;确保 DMA 每次…...

    汽车自动驾驶介绍

    0 Preface/Foreword 1 介绍 1.1 FSD FSD: Full Self-Driving&#xff0c;完全自动驾驶 &#xff08;Tesla&#xff09; 1.2 自动驾驶级别 L0 - L2&#xff1a;辅助驾驶L3&#xff1a;有条件自动驾驶L4/5 &#xff1a;高度/完全自动驾驶...

    Uniapp-小程序从入门到精通

    沉淀UNIAPP项目精华模版 ******************************************************************************************************************************************* 1、数据库的导入SQL **************************************************************************…...

    深度剖析操作系统核心(第一节):从X86/ARM/MIPS处理器架构到虚拟内存、分段分页、Linux内存管理,再揭秘进程线程限制与优化秘籍,助你成为OS高手!

    文章目录 OS处理器X86ARMMIPSPowerPC 内存管理虚拟内存内存分段内存分页段页式内存管理Linux 内存管理 OS 处理器 常见处理器有X86、ARM、MIPS、PowerPC四种。 X86 X86架构是芯片巨头Intel设计制造的一种微处理器体系结构的统称。如果这样说你不理解&#xff0c;那么当我说…...

    基于 EFISH-SBC-RK3588 的无人机通信云端数据处理模块方案‌

    一、硬件架构设计‌ ‌核心计算单元&#xff08;EFISH-SBC-RK3588&#xff09;‌ ‌异构计算能力‌&#xff1a;搭载 8 核 ARM 架构&#xff08;4Cortex-A762.4GHz 4Cortex-A551.8GHz&#xff09;&#xff0c;集成 6 TOPS NPU 与 Mali-G610 GPU&#xff0c;支持多任务并行处理…...

    Unity 内置Standard Shader UNITY_BRDF_PBS函数分析 (二)

    四、BRDF1_Unity_PBS // 主物理基BRDF实现 // 基于Disney工作并以Torrance-Sparrow微面模型为基础 // 公式&#xff1a; // BRDF kD / π kS * (D * V * F) / 4 // I BRDF * (N L) // // * NDF&#xff08;法线分布函数&#xff09;可根据 UNITY_BRDF_GGX 选择&#…...

    GitHub万星项目维护者分享:开源协作的避坑指南

    GitHub万星项目维护者分享&#xff1a;开源协作的避坑指南 ——开发者张三与237个文件改动PR的五年战争 序幕&#xff1a;深夜的炸弹 2019年夏天&#xff0c;张三维护的开源项目TerminalX刚突破8000星&#xff0c;一个标题猩红的PR突然弹出&#xff1a;“彻底重构&#xff0…...

    Linux基础篇、第四章_01软件安装rpm_yum_源码安装_二进制安装

    Linux基础篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; ————laowang 基础命令&#xff1a;rpm、yum、源码安装、二进制安装 一、rpm本地安装&#xff1a; (无需网络安装&#xff0c;无法解决软件依赖) rpm -ivh …...

    焊接机排错

    焊接机 一、前定位后焊接 两个机台&#xff0c;①极柱定位&#xff0c;相机定位所有极柱点和mark点&#xff1b;②焊接机&#xff0c;相机定位mark点原理&#xff1a;极柱定位在成功定位到所有极柱点和mark点后&#xff0c;可以建立mark点和极柱点的关系。焊接机定位到mark点…...

    4.2 Prompt工程与任务建模:高效提示词设计与任务拆解方法

    提示词工程&#xff08;Prompt Engineering&#xff09;和任务建模&#xff08;Task Modeling&#xff09;已成为构建高效智能代理&#xff08;Agent&#xff09;系统的核心技术。提示词工程通过精心设计的自然语言提示词&#xff08;Prompts&#xff09;&#xff0c;引导大型语…...

    oracle 锁的添加方式和死锁的解决

    DML锁添加方式 DML 锁可由一个用户进程以显式的方式加锁&#xff0c;也可通过某些 SQL 语句隐含方式实现。 DML 锁有三种加锁方式&#xff1a;共享锁方式、独占锁方式、共享更新。 共享锁&#xff0c;独占锁用于 TM 锁&#xff0c;共享锁用于 TX 锁。 1)共享方式的表级锁 共享方…...

    Nginx 二进制部署与 Docker 部署深度对比

    一、核心概念解析 1. 二进制部署 通过包管理器&#xff08;如 apt/yum&#xff09;或源码编译安装 Nginx&#xff0c;直接运行在宿主机上。其特点包括&#xff1a; 直接性&#xff1a;与操作系统深度绑定&#xff0c;直接使用系统库和内核功能 。定制化&#xff1a;支持通过…...

    以太网的mac帧格式

    一.以太网的mac帧 帧的要求 1.长度 2.物理层...

    每日算法-250424

    每日算法打卡 (24/04/25) - LeetCode 2971 & 1647 记录一下今天解决的两道 LeetCode 题目 2971. 找到最大周长的多边形 题目 思路 贪心 一个基本的多边形构成条件是&#xff1a;最长边必须小于其他所有边的长度之和。 为了找到周长最大的多边形&#xff0c;我们应该尽可能…...

    在本地部署n8n:完整指南

    n8n是一个强大的工作流自动化工具&#xff0c;可以帮助你连接不同的应用程序和服务&#xff0c;无需编写复杂的代码。本指南将带你完成在本地计算机上部署n8n的完整过程。 什么是n8n&#xff1f; n8n&#xff08;发音为"n-eight-n"&#xff09;是一个开源的工作流自…...

    棋盘格角点检测顺序问题

    文章目录 前言一、OpenCV函数测试二、原因分析三、libcbdetect修改总结 前言 棋盘格角点检测在相机拼接、机械臂手眼标定中等应用很广泛&#xff0c;通常也要求尽量各种角度摆放从而保证标定精度。然后就自然想到了这个问题&#xff1a;如果棋盘格任意角度摆放怎么能对应上角点…...

    C++之类和对象:定义,实例化,this指针,封装

    C语言是面向过程的&#xff0c;C是面向对象的&#xff0c;利用对象交互&#xff0c;接口完成事情。 类的定义&#xff1a; 我们在C语言中可以用struct创建自定义结构体&#xff0c;在C中可以在结构体中定义函数了&#xff0c;这种就被称为类。 #include<iostream> usi…...

    Ubuntu系统下交叉编译iperf3

    一、参考资料 Linux下iperf3移植到arm下测试100M网口-CSDN博客 Iperf3移植到ARM Linux及使用教程-CSDN博客 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编…...

    游戏引擎学习第243天:异步纹理下载

    仓库 https://gitee.com/mrxiao_com/2d_game_6 https://gitee.com/mrxiao_com/2d_game_5 回顾并为今天设定阶段 目前的开发工作主要回到了图形渲染相关的部分。我们之前写了自己的软件渲染器&#xff0c;这个渲染器性能意外地好&#xff0c;甚至可以以相对不错的帧率运行过场…...

    27、Session有什么重⼤BUG?微软提出了什么⽅法加以解决?

    Session的重大BUG 1、进程回收导致Session丢失 原理&#xff1a; IIS的进程回收机制会在系统繁忙、达到特定内存阈值等情况下&#xff0c;自动回收工作进程&#xff08;w3wp.exe&#xff09;。由于Session数据默认存储在进程内存中&#xff0c;进程回收时这些数据会被清除。 …...

    机器学习在网络安全中的应用:守护数字世界的防线

    一、引言 随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;成为全球关注的焦点。传统的网络安全防护手段&#xff0c;如防火墙、入侵检测系统&#xff08;IDS&#xff09;和防病毒软件&#xff0c;虽然在一定程度上能够抵御攻击&#xff0c;但在面对复杂多…...

    从数据到智慧:解密机器学习的自主学习密码

    在数字洪流奔涌的时代&#xff0c;每一次点击、每一行代码、每一条传感器数据都在生成海量信息。传统编程如同精心设计的齿轮组&#xff0c;需要工程师逐行编写规则&#xff1b;而机器学习则打破这一范式&#xff0c;赋予机器从数据中自主提炼规律、总结模式的超能力。这种能力…...

    Trae或者VsCode无法识别相对路径(不自动切换工作目录)

    在VsCode中或者Trae中&#xff0c;只要是在vscode的基础上修改得到的编辑器&#xff0c;都默认没有勾选自动选择当前文件路径为工作路径&#xff0c;因此需要手动修改工作路径或者设置&#xff0c;否则无法识别相对路径&#xff0c;PyCharm中就不会出现这种问题。 解决方法&…...

    解决VSCode每次SSH连接服务器时,都需要下载vscode-server

    如下图所示&#xff0c;本地下载或者在服务器终端上运行wget指令获得vscode服务器包 注意&#xff0c;解压完成后&#xff0c;需要修改文件名为你本地vscode的commit ID...

    架构-系统工程与信息系统基础

    一、系统工程核心知识 1. 系统工程定义 本质&#xff1a;一种组织管理技术&#xff0c;从整体出发分析系统要素&#xff08;组成、结构、信息流、控制机制&#xff09;&#xff0c;追求“整体最优”&#xff0c;借助计算机实现规划、设计、管理、控制的优化。目标&#xff1a…...

    矩阵运算和线性代数操作开源库

    用于矩阵运算和线性代数操作常用的开源库推荐&#xff0c;涵盖不同编程语言和硬件平台&#xff1a; C/C 库 Eigen 特点&#xff1a;高性能的模板库&#xff0c;支持矩阵/向量运算、线性求解、特征值计算等&#xff0c;无需依赖外部BLAS/LAPACK。 官网&#xff1a;https://eig…...