在package.json中scripts这个配置的命令是什么意思

"dev": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",

"serve": "vue-cli-service serve",

"serve:dev": "vue-cli-service serve --mode dev",

"serve:test": "vue-cli-service serve --mode test",

"serve:smi": "vue-cli-service serve --mode smi",

serve和"serve:test"的区别是什么,为什么要做这些区分,为什么要有这些命令,这些命令是什么意思

我会从命令含义核心区别设计目的三个维度,用通俗易懂的方式帮你讲清楚这些 npm 脚本的作用和背后的逻辑。

一、先拆解每个命令的核心含义

首先明确:这些都是基于 vue-cli-service(Vue 脚手架核心工具)的启动命令,先逐个解析:

命令 完整写法 核心含义
serve vue-cli-service serve 默认模式启动 Vue 项目的开发服务器(热更新、本地调试)
serve:dev vue-cli-service serve --mode dev dev(开发)模式启动项目
serve:test vue-cli-service serve --mode test test(测试)模式启动项目
serve:smi vue-cli-service serve --mode smi smi(可能是预发布/生产小流量)模式启动项目
dev SET NODE_OPTIONS=... && vue-cli-service serve 先设置 Node 兼容参数(解决老版本 OpenSSL 问题),再以默认模式启动
关键参数解释:
  • vue-cli-service serve:Vue 脚手架的核心启动命令,作用是启动一个本地开发服务器,支持热更新、代码编译,默认监听 8080 端口,供开发调试使用。
  • --mode xxx:指定项目的运行模式,Vue CLI 会根据这个模式加载对应的环境变量配置文件(核心!)。
  • SET NODE_OPTIONS=--openssl-legacy-provider:仅 Windows 系统有效,解决 Node.js 17+ 版本因 OpenSSL 版本升级导致的兼容问题(老项目依赖的包可能用了旧版 OpenSSL 接口)。

二、serveserve:test 的核心区别

1. 最核心的区别:加载的环境变量不同

Vue CLI 约定:项目根目录下的 .env 系列文件会根据 --mode 自动加载,这是区分不同环境的核心逻辑:

  • serve(无 --mode):默认加载 .env + .env.development(Vue CLI 内置默认模式是 development)。
  • serve:test(--mode test):加载 .env + .env.test

举个实际例子(项目中常见的配置):

复制代码
# .env.development(dev 模式)
VUE_APP_BASE_API = 'http://dev-api.xxx.com'  # 开发环境接口地址
VUE_APP_TITLE = 'XX系统-开发环境'

# .env.test(test 模式)
VUE_APP_BASE_API = 'http://test-api.xxx.com'  # 测试环境接口地址
VUE_APP_TITLE = 'XX系统-测试环境'

# .env.smi(smi 模式)
VUE_APP_BASE_API = 'http://smi-api.xxx.com'   # 预发布环境接口地址
VUE_APP_TITLE = 'XX系统-预发布环境'

当你执行 npm run serve 时,项目会调用开发环境 的接口;执行 npm run serve:test 时,会自动切换到测试环境的接口,无需手动改代码。

2. 次要区别:可定制的编译/运行行为

除了环境变量,不同模式还可以定制其他行为:

  • 比如 test 模式可以开启更严格的代码检查(ESLint);
  • smi 模式可以模拟生产环境的打包压缩(但仍保留开发服务器);
  • dev 模式可以关闭部分性能监控,提升开发速度。

三、为什么要做这些区分?(核心设计目的)

这些命令的存在,本质是为了解决不同环境下的开发/测试需求,核心价值有 3 点:

1. 避免手动修改配置,降低出错风险

如果没有这些模式区分,开发者要切换接口地址,需要手动改代码里的 baseURL,容易出现:

  • 忘记改回开发地址,把测试/生产地址提交到代码库;
  • 多人协作时,每个人的本地配置不一致,导致接口调用失败。

通过 --mode 切换模式,只需执行不同的 npm 命令,自动加载对应环境的配置,零手动修改。

2. 适配不同环境的业务逻辑

不同环境的需求不同:

  • 开发环境(dev):接口地址是本地/开发服务器,日志更详细,方便调试;
  • 测试环境(test):接口地址是测试服务器,数据是测试数据,供测试人员验证功能;
  • 预发布环境(smi):接口地址接近生产,数据是真实小流量,验证生产兼容性。

比如测试环境需要开启 Mock 数据,开发环境不需要;生产预发布环境需要校验权限,开发环境可以跳过------这些都能通过环境变量控制。

3. 统一团队操作规范

团队成员只需执行 npm run serve:test 就能快速切换到测试环境,无需关心背后的配置细节,避免"我本地能跑,测试环境跑不了"的协作问题。

四、补充:命令设计的最佳实践

  1. dev 命令的特殊作用:
    SET NODE_OPTIONS=--openssl-legacy-provider 是因为 Node.js 17+ 版本默认使用 OpenSSL 3.0,而部分老的 npm 包依赖 OpenSSL 1.1 的 API,会导致启动报错。这个参数是临时兼容方案,让老项目能在新 Node 版本下运行。

  2. 命名规范:
    通常 serve 对应默认开发环境,serve:xxx 对应自定义环境(test/smi/prod 等),语义清晰,团队易理解。

  3. 跨平台兼容:
    SET NODE_OPTIONS 是 Windows 命令,Linux/Mac 下需要用 export NODE_OPTIONS=--openssl-legacy-provider,如果要跨平台,可安装 cross-env 包:

    json 复制代码
    "dev": "cross-env NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve"

总结

  1. 核心区别serve 用默认(development)模式加载 .env.developmentserve:test 用 test 模式加载 .env.test,本质是加载不同的环境变量(如接口地址)。
  2. 设计目的:避免手动改配置、适配不同环境的业务需求、统一团队操作规范,提升开发/测试效率。
  3. 命令含义vue-cli-service serve 是核心启动命令,--mode xxx 指定环境模式,SET NODE_OPTIONS 是 Node 兼容配置。
相关推荐
C澒2 小时前
前端跨业务线代码复用标准化体系构建与实践
前端·架构
big_rabbit05022 小时前
[算法][力扣242]有效的字母异位词
java·前端·leetcode
A923A2 小时前
【Vue3大事件 | 项目笔记】第一天
前端·vue.js·笔记·前端框架
IT_陈寒2 小时前
SpringBoot自动配置揭秘:90%开发者不知道的核心原理
前端·人工智能·后端
huangyiyi666662 小时前
webpack + Vite
前端·webpack·node.js
im_AMBER2 小时前
订阅模式实现字符数统计
前端·typescript·前端框架·编辑器
北寻北爱2 小时前
axios
开发语言·前端·javascript
Nuopiane2 小时前
Mypal3(9)
前端·javascript·数据库
筱璦2 小时前
期货软件开发 - 交易报表
前端·windows·microsoft·报表·期货