在前端项目中使用自定义的环境变量

在前端项目中使用webpack的环境变量

最近在折腾项目中,有时候会需要在前端项目中使用环境变量,比如在webpack.prod.js或者webpack.dev.js中使用。找了一些解决办法,最后有了这篇文章。

定义环境变量

在根目录下创建.env文件

base.env

env 复制代码
#基础配置,不管开发或者测试环境都用得到,使用CUSTOMIZE前缀,和node的环境变量区分

CUSTOMIZE_APP_TITLE=一个系统

dev.env

env 复制代码
#测试开发环境信息

CUSTOMIZE_PORT=8081

CUSTOMIZE_SERVER_URL='http://localhost:8000'

CUSTOMIZE_MODE='development'

prod.env

env 复制代码
#正式环境信息

CUSTOMIZE_MODE='production'

CUSTOMIZE_PORT=80

CUSTOMIZE_SERVER_URL='~api'

使用环境变量

在webpack中使用

使用dotenv插件直接帮我们加入变量到process.env,同时可以引入多个,并且可以覆盖,详细文档dotenv

js 复制代码
    // webpack.prod.js or webpack.dev.js

    // 省略些代码

    const dotenv = require('dotenv');// 引入插件

    dotenv.config({ path: ['dev.env', 'base.env'], override: true });// 加载.env文件,并且覆盖,

    console.log(process.env.CUSTOMIZE_APP_TITLE);// 一个系统

    // 省略些代码

在前端页面中使用

相对直接在webpack中使用,我们要保证页面编译通过;就需要使用到webpack.DefinePlugin,一个插件把变量注入到全局;

dotenv.config()会返回一个处理好的对象
js 复制代码
// 省略些代码

 const _dotenv = dotenv.config({ path: ['dev.env', 'base.env'], override: true })

 console.log(_dotenv)

 // 省略些代码

 /*{

    parse:{ CUSTOMIZE_APP_TITLE: '一个系统', CUSTOMIZE_MODE: 'development', CUSTOMIZE_PORT: '8081', CUSTOMIZE_SERVER_URL: 'http://localhost:8000' }

 }*/
webpack.DefinePlugin使用方式

webpack.dev.js 里配置

js 复制代码
// 省略些代码

module.exports = {

  plugins: [

    new webpack.DefinePlugin({

      'process.env.CUSTOMIZE_MODE': JSON.stringify('CUSTOMIZE_MODE')

    })

  ]

}

// 省略些代码

在页面中使用

js 复制代码
baseURL: process.env.CUSTOMIZE_MODE === 'production' ? process.env.CUSTOMIZE_SERVER_URL : '/api',
总结一下页面使用

配置

js 复制代码
 // webpack.prod.js or webpack.dev.js

    // 省略

    const dotenv = require('dotenv');// 引入插件

    const _dotenv = dotenv.config({ path: ['dev.env', 'base.env'], override: true });// 加载.env文件,并且覆盖,

    console.log(process.env.CUSTOMIZE_APP_TITLE);// 一个系统

    module.exports = {

        plugins: [

            new webpack.DefinePlugin(generateEnv(_dotenv.parse))

        ]

    }

    /**

     * 根据提供的解析数据生成环境对象。

     *

     * @param {Object} parsed - 解析数据对象。

     * @return {Object} 生成的环境对象。

     */

    function generateEnv(parsed) {

        const env = {};

        Object.keys(parsed).forEach(key => {

            const value = parsed[key];

            if (value && value !== null) {

                env[`process.env.${key}`] = JSON.stringify(value);

            }

        });

        return env;

    }

    // 省略些代码

使用

tsx 复制代码
import { FC } from 'react';

import { Outlet } from 'react-router-dom';

import './index.scss';

  


const User: FC = () => {

    return (

        <div className="user-main">

            <div className="user-container">

                <div className="title">{process.env.CUSTOMIZE_APP_TITLE}</div>

                <Outlet />

            </div>

        </div>

    );

};

export default User;

注意:如果使用了ts,可能会出现报错 process is not defined

定义一下全局ts类型

ts 复制代码
declare const process: {

    env: {

        [key: string]: string;

    };

    [key: string]: unknown;

};

谢谢观看🙂️

相关推荐
拾光拾趣录1 天前
Webpack 打包中的 Hash 生成机制
前端·webpack·前端工程化
abigale0311 天前
webpack+vite前端构建工具 - 8 代码分割
前端·webpack·node.js
abigale0311 天前
webpack+vite前端构建工具 - 9 webpack技巧性配置
前端·webpack·node.js
Hilaku11 天前
你以为的 tree shaking,其实根本没生效
前端·javascript·webpack
暴怒的代码13 天前
解决Vue2官网Webpack源码泄露漏洞
前端·webpack·node.js
abigale0313 天前
webpack+vite前端构建工具 -4webpack处理css & 5webpack处理资源文件
前端·css·webpack
code_YuJun13 天前
19. plugin
webpack
风吹一夏v14 天前
webpack到vite的改造之路
webpack·vue·vite
EndingCoder14 天前
性能优化中的工程化实践:从 Vite 到 Webpack 的最佳配置方案
webpack·性能优化·vite·devops·工程化实践
码蚂14 天前
Webpack打包"Conflicting order"报错解决:从mini-css-extract-plugin源码到模块化CSS实践
webpack