回顾前端项目打包时--脚本引入时机与环境类型的判断问题

上线环境

基本来讲,我们前端的项目无非就是基本的三个环境,开发/测试/生产,今天就简单说下打包时引入脚本的时机问题。

为什么不能 "运行时根据网址判断"?

如果想让项目发布后,根据访问的网址(shengchan.com/test.com)动态切换环境(比如自动识别网址并设置 API_URL),需要额外写 "运行时判断逻辑":

ini 复制代码
// 在 main.js 或全局工具文件中,根据当前网址动态设置 API
let API_URL;
if (window.location.hostname === 'shengchan.com') {
  API_URL = 'https://prod-api.example.com';
} else if (window.location.hostname === 'test.com') {
  API_URL = 'https://test-api.example.com';
}
window.API_URL = API_URL;

其实这样一看没啥问题,页面在加载后也能够进行不同环境的判断,一点毛病没有,但是还是不推荐。

为啥呢?

因为这种方式有个缺点就是:无法提前在 index.html 中使用(比如动态引入统计脚本),通常不如 "构建时区分环境" 灵活可靠。

以实际项目为例

  1. 比如说性能的监控插件之类的

这种插件是要在你初始化之前就已经注入的,不可能在加载后才会去运行记录,比如插件要去监控页面的白屏时间和最大元素的绘制时间等

2.另外的插件比如是在节点加载之后进行的,像埋点这种

这种类型的插件需要在实例完成后,进行交互的,可以不用在初始化就去运行,但是还是不建议利用地址名称进行判断

3.胳膊拗不过大腿,你非要用地址进行判断,最好是多处业务有用到,只能说这种方式大家易看懂是生产还是测试吧,

因为在main.js中使用window.xxx的方式记录在刷新后丢失,所以还是用local进行存储下环境类型吧,也方便后续的业务用到。

回顾环境的判断

以vue为例,常规的环境判断如下:

  1. 创建环境文件在项目根目录创建对应文件,定义环境变量:

    env

    ini 复制代码
    // .env.development
    VITE_BASE_URL = 'http://dev.api.com'  // 开发环境接口地址
    VITE_DEBUG = true                     // 开发环境开启调试模式

    env

    ini 复制代码
    // .env.production
    VITE_BASE_URL = 'http://prod.api.com' // 生产环境接口地址
    VITE_DEBUG = false                    // 生产环境关闭调试模式
  2. 在代码中使用 直接通过 import.meta.env 访问变量(不同工具语法略有差异):

    javascript

    运行

    arduino 复制代码
    // 接口地址自动适配环境
    axios.defaults.baseURL = import.meta.env.VITE_BASE_URL;
    
    // 仅在开发环境打印调试信息
    if (import.meta.env.VITE_DEBUG) {
      console.log('当前环境:', import.meta.env.MODE); // 输出 "development" 或 "production"
    }
  3. 通过命令指定环境package.json 中定义脚本,通过 --mode 指定环境(自动加载对应 .env 文件):

    json

    json 复制代码
    {
      "scripts": {
        "dev": "vite", // 默认开发环境,加载 .env.development
        "build:test": "vite build --mode test", // 测试环境,加载 .env.test
        "build": "vite build" // 默认生产环境,加载 .env.production
      }
    }

三、不同工具的差异

工具 环境变量前缀(必填) 访问方式 备注
Vite VITE_ import.meta.env.变量名 import.meta.env.VITE_BASE_URL
Create React App REACT_APP_ process.env.变量名 process.env.REACT_APP_BASE_URL
Vue CLI VUE_APP_ process.env.变量名 process.env.VUE_APP_BASE_URL

注意:

上面的演示获取环境变量的结果是在常规的js或者.vue文件中进行,如果是在初始化的index.html文件中使用,要按照如下写法去进行,否则你的判断将会不生效。

例如测试环境的配置:

.env.test

VUE_APP_ENV=test

public中index.html获取环境类型需要以如下方式获取:

cosnt env ='<%= env.VUE_APP_ENV %>';

相关推荐
少年姜太公2 小时前
什么?还不知道git cherry pick?
前端·javascript·git
白兰地空瓶3 小时前
🏒 前端 AI 应用实战:用 Vue3 + Coze,把宠物一键变成冰球运动员!
前端·vue.js·coze
Liu.7744 小时前
vue3使用vue3-print-nb打印
前端·javascript·vue.js
踏浪无痕5 小时前
JobFlow 实战:无锁调度是怎么做到的
后端·面试·架构
松涛和鸣5 小时前
Linux Makefile : From Basic Syntax to Multi-File Project Compilation
linux·运维·服务器·前端·windows·哈希算法
dly_blog5 小时前
Vue 逻辑复用的多种方案对比!
前端·javascript·vue.js
万少5 小时前
HarmonyOS6 接入分享,原来也是三分钟的事情
前端·harmonyos
烛阴5 小时前
C# 正则表达式:量词与锚点——从“.*”到精确匹配
前端·正则表达式·c#
wyzqhhhh6 小时前
京东啊啊啊啊啊
开发语言·前端·javascript
JIngJaneIL6 小时前
基于java+ vue助农电商系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端