前端环境变量的使用与原理

一、环境区分

为了避免忘记或错误配置环境,导致项目上线后接口无法访问,所以需要使用环境变量。

  1. 开发环境:可能是公司局域网服务器,能用就行。
  2. 生产环境:公网服务器,用户需要访问。
  3. 测试环境:供测试同学测试,但一般情况下是打包成dist给测试同学换包。

二、常见的项目环境变量的使用

总则-使用.env.环境名字文件去定义,运行命令时指定某一个环境。

1. Vite+vue3

  • 存:VITE_变量名=xxx
  • 取:import.meta.env.VITE_变量名

创建文件如【.env】:

js 复制代码
VITE_GLOBAL=global

【.env.development】:

js 复制代码
VITE_BASE_URL=192
  • 【.env.production】:
js 复制代码
VITE_BASE_URL=112
  • 取出环境变量比如在【main.js】中,就可以取出这个对象。:
js 复制代码
console.log(import.meta.env);
js 复制代码
BASE_URL: "/"
DEV:true
NODE:development
PROD:false
SSR:false
VITE_BASE_URL:"192"
BITE_GLOBAL: "global"
  • 如果此时执行打包,则为生产模式:
js 复制代码
npm run build

打包结果的js文件中可以搜索到"112"、"production",但搜不到"192"因为打包后的是生产环境。

2. vue-cli(Webpack+vue2)

  • 存: VUE_APP_变量名=xxx
  • 取: process.env.VUE_APP_变量名 创建文件如【.env】:
js 复制代码
VUE_APP_ABE=llll

创建文件【.env.development】:

js 复制代码
VUE_APP_BASE_URL=192

【.env.production】:

js 复制代码
VUE_APP_BASE_URL=112

在【main.js】中取出,注意这是一个整体变量,而不是【对象.属性】:

js 复制代码
console.log(process.env);

可以得到这个对象:

js 复制代码
BASE_URL: "/"
NODE_ENV: "development"
VUE_APP_ABE: "llll"
VUE_APP_BASE_URL: "192"

3. 纯粹webpack打包

存: 通过definePlugins自己定义到全局环境

vue-cli项目中npm run serve是基于webpack封装了一个vue-cli-service命令,无论是webpack还是vite打包,本质都是执行一段node代码,node代码拿到当前环境是什么,比如创建一个test.js并执行"node test.js":

js 复制代码
    console.log(process.env);

会得到一个大对象,里边比如APPDATA属性,数据放在哪,但并没有代码表明当前运行这段代码时,环境是什么,所以我们需要忘【process.env】中加入变量。

比如package.json中,设置NODE_ENV这个变量到process.env中,它的值是development,然后运行"node test.js":

js 复制代码
"scripts": {
    "dev": "set NODE_ENV=development&&node test.js"
}

此时test.js修改,然后执行"npm run dev",会得到development:

js 复制代码
    console.log(process.env.NODE_ENV);

但这种方式运行存在问题,node根据不同的系统,很多的指令会有变化,比如win下才是set,mac下是export,所以需要引入【cross-env】这个库,来弥补不同平台之间的差距,删除"&&"符号:

js 复制代码
"scripts": {
    "dev": "cross-env NODE_ENV=development node test.js"
}

创建文件如【.env】:

js 复制代码
dotin=123

要读取.env文件,需要【dotenv】库来支持,在webpack.config.js中配置如下,执行"npm run build"就可以打印出production和123:

js 复制代码
require("dotenv").config()
console.log(process.env.NODE_ENV)
console.log(process.env.dotin);
module.exports = {
    mode: "development",
    entry: {
        app: "./app.js"
    },
    output: {
        filename: "./bundle.js"
    }
}

而环境变量相关的内容,只有在打包时才能拿到,业务代码如app.js中是拿不到的,但在vite和cli中都可以拿到,这也需要插件支持,在webpack.config.js中引入,是webpack自带的插件,不需要额外去安装:

webpack.config.js:

js 复制代码
require("dotenv").config()
console.log(process.env.NODE_ENV)
console.log(process.env.dotin);
const webpack = require("webpack");
module.exports = {
    mode: "development",
    entry: {
        app: "./app.js"
    },
    output: {
        filename: "./bundle.js"
    },
    // 给插件传一个对象,这个对象内所有内容会传入到业务代码中。
    plugins: [
        new webpack.DefinePlugin({
            a: 999
        })
    ]
}

然后在app.js中打印即可拿到,执行"npm run build",可以在dist下的bundle.js中看到"console.log(999);",此时就实现了本来只能在node环境读取的内容,现在在业务中也可以读取到。

app.js:

js 复制代码
console.log(a);

vite项目中环境变量必须VITE开头,vue-cli项目中必须以VUE_APP开头,这个是如何实现的?

我现在在.env中,有变量webpacktest,那我希望只有变量以webapck开头的才可以注入到process.env中,没有以webapck开头的,就不能加入到aap.js中,当然变量a还是可以在打包代码中完全拿得到,避免透露给客户端看到我们不想给他们看到的信息。

.env:

js 复制代码
webpacktest = 1111
a = 123

webpack.config.js:

js 复制代码
require("dotenv").config()
console.log(process.env.NODE_ENV)
console.log(process.env.dotin);
// 创建一个对象用于存储以webpack开头的环境变量,并打印出来
let obj = {}
Object.keys(process.env).forEach((key) => {
    if(key.indexOf('webpack')! = -1) {
        obj[key] = process.env[key];
    }
})
console.log(obj)
const webpack = require("webpack");
module.exports = {
    mode: "development",
    entry: {
        app: "./app.js"
    },
    output: {
        filename: "./bundle.js"
    },
    // 给插件传一个对象,这个对象内所有内容会传入到业务代码中。
    plugins: [
        new webpack.DefinePlugin({
            a: 999
        })
    ]
}

然后执行npm run build,可以看到:

js 复制代码
production
1111
{ webpacktest: '1111' }

然后把这个对象通过DefinePlugin传给业务代码:

js 复制代码
    plugins: [
        new webpack.DefinePlugin({
            "process.env": obj
        })

然后再一次执行npm run build,在dist下的bundle.js中可以看到如下,经过这样的配置,此时的webpack已经达到了和vue-cli一样的效果,vite同理,但不需要cross-env:

bundle.js:

js 复制代码
    console.log(1);console.log({webpacktest:1111}),console.log(a);

vite.config.js:

js 复制代码
    export default defineConfig({
        define: {
            a: 1234
        },
        plugins: [
        
        ],
        resolve: {
        
        }
    })

然后在业务代码中,就可以通过"console.log(import.meta.env.a);"拿到。

相关推荐
恋猫de小郭2 小时前
Flutter 3.35 发布,快来看看有什么更新吧
android·前端·flutter
chinahcp20083 小时前
CSS保持元素宽高比,固定元素宽高比
前端·css·html·css3·html5
gnip4 小时前
浏览器跨标签页通信方案详解
前端·javascript
gnip5 小时前
运行时模块批量导入
前端·javascript
hyy27952276845 小时前
企业级WEB应用服务器TOMCAT
java·前端·tomcat
逆风优雅5 小时前
vue实现模拟 ai 对话功能
前端·javascript·html
若梦plus5 小时前
http基于websocket协议通信分析
前端·网络协议
不羁。。6 小时前
【web站点安全开发】任务3:网页开发的骨架HTML与美容术CSS
前端·css·html
这是个栗子6 小时前
【问题解决】Vue调试工具Vue Devtools插件安装后不显示
前端·javascript·vue.js
姑苏洛言6 小时前
待办事项小程序开发
前端·javascript