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

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902721.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    React Native 安卓端 android Image 播放gif webp 动态图

    React Native 安卓端 android Image 播放gif webp 动态图 RN项目是0.78.2 React是19.0 基本介绍 Image 是 React Native 中用于显示各种类型图片的核心组件&#xff0c;支持显示网络图片、静态资源、本地图片以及 base64 编码的图片。在 Android 端&#xff0c;Image 组件还可…

    实时数字人——DH_LIVE

    前两天亲手搭建了实时对话数字人VideoChat&#xff0c;今天来搭建下DH_LIVE。 DH_LIVE一个实时数字人解决方案&#xff0c;从输入文字到数字人对口型说话用时2-3秒。 今天就来实际操作下dh_live的搭建过程。 首先贴上git地址&#xff1a;https://github.com/kleinlee/DH_liv…

    AOSP CachedAppOptimizer 冻结方案

    背景 Android 一直面临一个核心难题&#xff1a;如何优化进程对有限系统资源&#xff08;如 CPU、电量&#xff09;的使用&#xff0c;同时保证用户体验。 当进程进入后台后&#xff0c;它们虽不再贡献用户体验&#xff0c;却仍可能消耗资源。传统的杀后台方案虽然节省资源&a…

    实体店的小程序转型之路:拥抱新零售的密码-中小企实战运营和营销工作室博客

    实体店的小程序转型之路&#xff1a;拥抱新零售的密码-中小企实战运营和营销工作室博客 在当今数字化浪潮的冲击下&#xff0c;实体店面临着前所未有的挑战&#xff0c;但小程序的出现为实体店转型新零售带来了新的曙光。先来看一组惊人的数据&#xff0c;据相关统计&#xff…

    Java求职面试:从Spring Boot到微服务的全面考核

    Java求职面试实录&#xff1a;从Spring Boot到微服务的全面考核 第一轮&#xff1a;基础技术的考察 场景&#xff1a; 赵大宝走进了一家互联网大厂的面试间&#xff0c;面试官严肃地看着他。 面试官&#xff1a; 赵大宝&#xff0c;你好。我们先从简单的开始。请你解释一下J…

    记录一个坑关于STM32 ARM Compiler Version

    在用 Keil 进行 STM32 开发的时候&#xff0c;一开始下载&#xff0c;下载的 ARM 编译器是 Version6&#xff0c;他就不兼容老的代码&#xff0c;就很抽象。 所以必须要更换编译器。 可以去官网下载编译器 Downloads - Arm Developer &#xff0c;也可以自己找资源哈&#xff…

    PCIe体系结构学习入门——PCI总线概述(二)PCI总线的桥和配置

    这里写目录标题 序言存储器域和 PCI 总线域HOST 主桥PCI 桥和 PCI 设备配置空间PCI 桥PCI 设备配置空间PCI 总线的配置非透明 PCI 桥序言 接续前章内容,本章继续讲述 PCI 总线概述的第二部分——PCI 总线的桥和配置。 如果需要进一步了解前一章节内容,可以访问:PCIe体系结构…

    浔川代码编辑器v2.0(测试版)更新公告

    浔川代码编辑器v2.0(测试版)更新公告 发布日期&#xff1a;** 2023年4月30日 我们很高兴地宣布浔川代码编辑器v2.0测试版即将上线&#xff01;本次更新带来了多项功能改进和问题修复&#xff0c;旨在为用户提供更稳定、更强大的编程体验。 主要更新内容 1. **Bug修复与稳定性提…

    微信小程序 tabbar底部导航栏

    官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#tabBar 一、常规菜单格式 在app.json 文件中配置&#xff0c;其他关键点详见官方文档&#xff0c;后续更新不规则图标的写法

    Spring 中@Autowired,@Resource,@Inject 注解实现原理

    使用案例 前置条件&#xff1a; 现在有一个 Vehicle 接口&#xff0c;它有两个实现类 Bus 和 Car &#xff0c;现在还有一个类 VehicleService 需要注入一个 Vehicle 类型的 Bean&#xff1a; public interface Vehicle {}Component public class Car implements Vehicle {}C…

    【Rust结构体】Rust结构体详解:从基础到高级应用

    ✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

    《LightLLM:开启大语言模型推理新时代》

    《LightLLM:开启大语言模型推理新时代》 大语言模型推理的困境与挑战 在当今人工智能飞速发展的时代,大语言模型(LLMs)无疑是最为耀眼的明星技术之一。从 OpenAI 的 GPT 系列到谷歌的 BERT,再到国内如百度文心一言、阿里通义千问等,大语言模型以其强大的语言理解和生成能…

    【Python Web开发】02-Socket网络编程02

    文章目录 1. 服务器端1.1 socket.socket()1.2 socket.bind()1.3 socket.listen()1.4 socket.accept()1.5 socket.recv()1.6 socket.send() 和 socket.sendall()1.7 socket.close() 2. 客户端2.1 socket.socket()2.2 socket.connect()2.3 socket.send() 和 socket.sendall()2.4 …

    Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化?

    Flutter 在全新 Platform 和 UI 线程合并后&#xff0c;出现了什么大坑和变化&#xff1f; 在两个月前&#xff0c;我们就聊过 3.29 上《Platform 和 UI 线程合并》的具体原因和实现方式&#xff0c;而事实上 Platform 和 UI 线程合并&#xff0c;确实为后续原生语言和 Dart 的…

    蓝桥杯 1. 四平方和

    四平方和 原题目链接 题目描述 四平方和定理&#xff08;又称拉格朗日定理&#xff09;指出&#xff1a; 每个正整数都可以表示为 至多 4 个正整数的平方和。 如果将 0 包括进去&#xff0c;则每个正整数都可以恰好表示为 4 个非负整数的平方和。 例如&#xff1a; 5 0 …

    开发并发布一个属于自己的包(npm)

    一、CommonJS规范导入require 创建一个npm包涉及几个步骤&#xff0c;包括设置你的项目结构、编写代码、编写文档、测试你的代码&#xff0c;以及发布到npm仓库。以下是一个基本的指南&#xff0c;帮助你从头开始创建一个npm包。 步骤 1: 初始化npm项目 创建项目文件夹&#x…

    CRTP(Curiously Recurring Template Pattern)

    C 中的 CRTP&#xff08;奇异递归模板模式&#xff09; CRTP&#xff08;Curiously Recurring Template Pattern&#xff09;是一种利用模板继承实现 静态多态&#xff08;Static Polymorphism&#xff09; 的设计模式。通过基类模板以派生类作为模板参数&#xff0c;CRTP 允许…

    小白工具视频转MPG, 功能丰富齐全,无需下载软件,在线使用,超实用

    在视频格式转换需求日益多样的今天&#xff0c;小白工具网的在线视频转 MPG 功能https://www.xiaobaitool.net/videos/convert-to-mpg/ &#xff09;脱颖而出&#xff0c;凭借其出色特性&#xff0c;成为众多用户处理视频格式转换的优质选择。 从格式兼容性来看&#xff0c;它支…

    银河麒麟系统离线安装nodejs

    本篇文章我们介绍如何通过nvm(node版本管理工具)来实现离线安装nodejs 第一步&#xff1a;下载nvm https://github.com/nvm-sh/nvm/releases/tag/v0.40.1 在页面找到【Source code(tar.gz)】下载 第二步&#xff1a;安装nvm 将下载好的tar.gz拷贝到银河麒麟系统文件夹下(加…

    Go语言中包导入下划线的作用解析

    在Go语言的代码中&#xff0c;有时会看到类似以下的导入语句&#xff1a; import _ "github.com/mattn/go-sqlite3"这种以下划线_开头的导入方式&#xff0c;显得有些特别&#xff0c;尤其是对于新手来说&#xff0c;可能会感到困惑&#xff0c;为什么要这样写&…