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

webpack+vite前端构建工具 -答疑

webpack答疑

1 输入webpack命令,执行的是全局版本还是本地版本的webpack

当在命令行窗口输入webpack命令时,其执行优先级可通过以下步骤明确判断:


1.1 【全局安装优先机制】

  • 执行原理:系统会按照环境变量PATH的顺序逐级查找可执行文件

  • 路径比对

    • 全局安装路径:npm install -g webpack会安装在类似/usr/local/bin(Mac/Linux)或C:\Users\用户名\AppData\Roaming\npm(Windows)的路径
      • 补充:如果已经全局安装了 Webpack,则可以简单地运行命令——webpack (依赖系统path,全局路径需在系统path中配置)
    • 本地安装路径:npm install webpack会安装在项目目录的./node_modules/.bin/webpack
  • 判定方式

    • 直接运行 webpack,系统按 PATH 顺序查找可执行文件。
    • 如果全局安装路径(如 /usr/local/bin)在 PATH 中靠前 → 执行全局版本
    • 如果本地路径 ./node_modules/.bin 被手动加入 PATH 并靠前 → 执行本地版本

1.2 【本地版本特殊调用场景】

  • 必须满足以下任一条件才会使用本地安装:
    • (1) 通过npx webpack显式调用(原理:npx会自动检索当前目录node_modules
    • (2) 在package.json的scripts中配置了"build": "webpack"后通过npm run build执行(原理:npm会将本地node_modules/.bin临时加入PATH)
    • (3) 显式指定相对路径执行:./node_modules/.bin/webpack

1.3 【项目规范建议方案】

  • 推荐做法:所有项目均应在本地安装特定版本
  • 操作步骤
    1. 项目根目录执行:npm install webpack webpack-cli --save-dev
    2. package.json的scripts中配置:
      "scripts": {"build": "webpack --config webpack.config.js"
      }
      
    3. 通过npm run build触发构建
  • 优势:确保团队成员和部署环境都使用完全一致的webpack版本,规避全局版本差异引发的构建问题

1.4 【主动验证方式】

通过whichwhere命令精确定位实际调用的webpack:

# Mac/Linux
which webpack# Windows
where webpack

若输出路径包含node_modules则为本地版本,包含npm全局目录则为全局版本

where webpack有误,渴直接运行命令查看版本

# 查看当前调用的版本
webpack --version
  • 逻辑判断
    • 若版本号与项目的 package.json 中的 webpack 版本一致 → 本地版本被正确调用
    • 若版本号与全局安装的 webpack -g 版本一致 → 使用了全局版本

1.5 异常场景说明:

若同时存在全局和本地安装时出现版本冲突,建议:

  1. 删除全局安装:npm uninstall -g webpack webpack-cli
  2. 强制限制本地调用(推荐通过npxnpm scripts
  3. 使用版本锁:在package.json中指定"webpack": "^5.76.0"等固定版本号

通过这种结构化控制,能有效避免日常开发中70%以上的构建环境相关故障。

2 补充:package.json的scripts

参考https://blog.csdn.net/Triumph_light/article/details/135636652?spm=1001.2014.3001.5506

2.1 什么是npm script

在package.json里面定义的scripts字段就是,它的每一个属性都对于一段脚本。

{// ..."scripts": {"build": "node build.js"}
}

其中build命令对应的脚本就是node build.js,使用npm run命令,就可以执行。

$ npm run build

等同于执行

$ node build.js

2.2 npm run的原理

  • 我们在项目当中运行npm run xxx,主要分为以下几步:
    1. 从package.json当中读取scrips对象。
    2. 以传给npm run命令的第一个参数作为键,在scripts对象当中找到对应的值作为接下来要执行的命令,没有找到会报错。
    3. 执行npm run,就会立马自动创建一个shell,其中只要是shell可以运行的命令,就可以写在npm script当中。
    4. 将当前目录下的node_modules/.bin这个子目录加入PATH变量(这就意味着,当前目录的node_modules/.bin子目录里的所有脚本,都可以直接用脚本名调用,而不需要加路径)
"test": "mocha test"
// 而不用写成这样
"test": "./node_modules/.bin/mocha test"
  1. 在这个shell上执行上述命令

npm 脚本的唯一要求就是可以在 Shell 执行,因此它不一定是 Node 脚本,任何可执行文件都可以写在里面。 npm 脚本的退出码,也遵守 Shell 脚本规则。如果退出码不是0,npm 就认为这个脚本执行失败。

3 补充:npm安装命令

3.1 npm install webpacknpm install webpack --save-devnpm install webpack -g

3.1.1 对比
命令安装位置作用域适用场景
npm install webpack -g全局目录(如 /usr/local/bin%APPDATA%\npm所有项目可用1. 不推荐,易导致版本冲突;2. 不会修改任何项目的 package.json ;3. 其他开发者或部署环境无法自动获取此依赖(需手动安装)
npm install webpack项目内 node_modules仅当前项目默认写入 dependencies(1. ×,Webpack 应归类为开发依赖;2. 这样在项目发布时会将 Webpack 打包到生产环境(无意义且增大体积))
npm install webpack --save-dev项目内 node_modules仅当前项目1. 推荐,归类到 devDependencies(构建工具应在此类,npm install --production 时自动排除开发依赖devDependencies,精简生产环境)

npm install # 同时安装 dependencies + devDependencies

3.1.2 安装位置决策树
是否要在任何目录直接运行命令? → 是 → ❌ 依然不要全局安装,改用 npx webpack
是否要与其他开发者共享配置? → 是 → ✅ 必须 --save-dev + 提交 package.json
是否要部署到服务器? → 是 → ✅ 本地安装 + devDependencies 确保环境一致

3.2 --save和–save-dev区别

3.2.1 --save
  • 作用:将安装的包信息写入 package.jsondependencies 字段。
  • 本质
    用于标记 生产环境依赖(应用运行时必须的依赖包)。
  • 典型依赖
    • 框架库:如 react, vue, lodash
    • 工具运行时:如 axios, moment
    • 业务核心依赖:如 redux, express
3.2.2 --save-dev--dev 的完整写法)
  • 作用:将包信息写入 package.jsondevDependencies 字段。
  • 本质
    用于标记 开发环境依赖(仅在开发、构建或测试阶段需要的工具)。
  • 典型依赖
    • 构建工具:如 webpack, vite, babel
    • 测试框架:如 jest, mocha
    • 代码检查工具:如 eslint, prettier
    • 类型定义:如 @types/node

3.3 --save和无–save的区别

npm>=5的版本,完全相同。

命令npm ≥5 的行为(2017年后)npm ≤4 的行为(已淘汰)package.json 的影响
npm install xxx自动将包写入 dependencies不保存到任何依赖字段现代版本:✅ 更新 dependencies
npm install xxx --save完全等同于 npm install xxx强制写入 dependencies旧版中必须加此参数才能保存

相关文章:

  • kubernetes部署3节点高可用elasticsearch v8.14.3
  • 【数学基础】复杂度理论
  • Python异步编程深度解析
  • 基于Spring Boot的网上购物平台设计与实现
  • AD22以上的基础操作
  • C++算法学习专题:双指针
  • 编译安装交叉工具链 riscv-gnu-toolchain
  • RGB+EVS视觉融合相机:事件相机的革命性突破​
  • 微机系统 第九章 人机接口 (包含了第四章的题)
  • MCPA2APPT:基于 A2A+MCP+ADK 的多智能体流式并发高质量 PPT 智能生成系统
  • 《自动控制原理 》- 第 1 章 自动控制的基本原理与方式
  • 分布式电源采集控制装置:江苏光伏电站的“智能调度中枢
  • java nio 所有影响 plc 的方法一览表
  • TCP 和 UDP 是什么?
  • 计算机操作系统(十七)内存管理
  • 暑假复习篇之运算与逻辑
  • 【软考--软件设计师】11 关系型数据库
  • lambda、function基础/响应式编程基础
  • 路由器对不同数据帧的处理
  • 一分钟了解思路链提示词(Chain-of-thought Prompting)