不同打包工具下的环境变量配置方式对比

这篇具有很好参考价值的文章主要介绍了不同打包工具下的环境变量配置方式对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文作者为 360 奇舞团前端开发工程师 天明

前言

在现代的JavaScript应用程序开发中,环境变量的配置是至关重要的。不同的应用场景和部署环境可能需要不同的配置,例如开发、测试和生产环境。最常见的需求是根据不同的环境,配置如是否开启sourceMapAPI请求地址的切换、是否压缩代码等逻辑。本文主要介绍利用不同的工具:WebpackViteRollup打包项目的环境变量的配置方式。

process.env.NODE_ENV

process.env.NODE_ENV应该是我们最熟悉的环境变量了,我们知道在Node环境中process是一个全局变量,无需require引入。process.env属性返回一个包含用户环境信息的对象,当我们打印process.env时,发现它并没有NODE_ENV这一个属性。实际上process.env.NODE_ENV是在package.jsonscripts命令中注入的,可以通过以下方式进行设置:

{
  "scripts": {
    "dev": "NODE_ENV=development webpack --config webpack.dev.config.js",
    "prod": "NODE_ENV=production webpack --config webpack.prod.config.js"
  }
}

当运行npm run devnpm run prod命令时,设置了NODE_ENV的不同值,项目中访问到的process.env.NODE_ENV值也会根据执行脚本的不同而分别取值:developmentproduction. 我们可以根据这个值的不同而分别进行不同的配置,这就是配置环境变量的基本逻辑.

Webpack项目环境变量配置方式
使用DefinePlugin插件

前面提到,在scripts命令中注入的NODE_ENV只能被Webpack的构建脚本访问,而被Webpack打包的源码中是无法访问到的,此时可以借助WebpackDefinePlugin插件,创建全局变量。

const webpack = require('webpack');

module.exports = {
  //.....其他配置
  plugins: [
    new webpack.DefinePlugin({
      'process.env.API_URL': JSON.stringify('https://api.example.com'),
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
    }),
  ],
};

在上面的示例中,我们定义了两个环境变量:API_URLNODE_ENV,并且使用JSON.stringify将值转换为字符串。这样就可以在代码中使用process.env.API_URLprocess.env.NODE_ENV来访问这两个环境变量的值了。

Windows平台配置的注意点

Windows平台下直接设置NODE_ENV =XXX是会报错的, 解决办法也很简单,可以使用cross-env这个npm包来进行配置,cross-env能够提供一个设置环境变量的scripts,这样我们就能够以unix方式设置环境变量,然后在windows上也能够兼容

  • 安装

npm install cross-env --save
  • 使用

"scripts": {
  "dev": "cross-env NODE_ENV=development webpack",
  "prod": "cross-env NODE_ENV=production webpack"
}

可以看到直接在NODE_ENV=XXX前面添加cross-env就可以了。

使用dotenv插件

假如我们项目的环境变量有很多,全部设置plugins中既不美观也不容易维护,此时将环境变量配置在.env文件中,然后使用dotenv插件来加载.env配置文件。

  • 安装

npm install dotenv-webpack --save-dev
  • 创建环境变量文件 在项目根目录下创建一个.env文件,如果有多种不同的环境,可以针对不同的环境创建不同的配置文件,例如可以使用.env.development.env.test.env.production在文件来分别表示:开发、测试、生产环境的环境变量。在文件中配置每个环境对应的变量:

// .env.development
API_URL=http://development.example.com
DEBUG=true
// .env.test
API_URL=http://test.example.com
DEBUG=true
// .env.production
API_URL=http://production.example.com
DEBUG=false
  • 加载.env配置 在webpack.config.js加载.env配置:

require('dotenv').config({ path: path.resolve(__dirname, '.env.' + process.env.NODE_ENV) })
  • 设置scriptsscripts命令中设置NODE_ENV

"scripts": {
  "dev": "cross-env NODE_ENV=development webpack",
  "dev": "cross-env NODE_ENV=test webpack",
  "prod": "cross-env NODE_ENV=production webpack"
}
Rollup项目环境变量配置方式

Rollup是一个现代化的JavaScript模块打包工具,专注于构建JavaScript库和组件。下面是Rollup中配置环境变量的几种常见方式:

使用rollup-plugin-replace

Rolluprollup-plugin-replace插件允许我们在打包过程中替换代码中的字符串。我们常用该插件来定义环境变量。

  • 安装:

npm install rollup-plugin-replace --save-dev
  • rollup.config.js中配置

const isProduction = process.env.NODE_ENV === 'production';
export default [
    {
         //.....其他配置
        plugins: [
            replace({
                'process.env.API_URL': JSON.stringify(isProduction ? 'https://prod.example.cn' : 'https://dev.example.cn')
                'process.env.NODE_ENV': JSON.stringify(isProduction? 'production' : 'development')

            })
        ]
    }
]

在上面的例子中,我们首先获取到当前组件库的环境变量,并根据它的值设置不同的API_URLNODE_ENV.

之所以在组件库中使用rollup-plugin-replace 替换 process.env.NODE_ENV 的原因是为了在打包时,将代码中的环境变量替换为实际的值,以便在不同的环境中正确地运行组件库。这样就避免了宿主工程中的环境变量process.env.NODE_ENV,对组件库环境变量的影响。

Rollup使用dotenv插件

Webpack类似,在Rollup中使用dotenv插件进行环境变量的配置,可以按照以下步骤进行:

  • 安装dotenvrollup-plugin-replace

npm install dotenv rollup-plugin-replace --save-dev
  • 创建环境变量文件 与上面的Webpack创建环境变量文件类似,这里也可以创建多个环境配置文件.env.development.env.test.env.production

  • rollup.config.js加载.env配置

import { config } from 'dotenv'
config({ path: ".env."+ process.env.NODE_ENV }).parsed
export default {
  // ...
  plugins: [
    replace({
      process.env.API_URL: JSON.stringify(process.env.API_URL),
      process.env.DEBUG: JSON.stringify(process.env.DEBUG),
    }),
    // ...
  ],
};

在上例中,我们首先通过dotenv.config()方法来加载.env文件中的环境变量。然后,使用@rollup/plugin-replace插件的replace方法,将环境变量注入到代码中。

  • package.json中设置scripts

"scripts": {
    "build:dev": "cross-env NODE_ENV=development rollup -c",
    "build:prod": "cross-env NODE_ENV=production rollup -c",
    "build:test": "cross-env NODE_ENV=test rollup -c",
    "dev": "cross-env NODE_ENV=development rollup -c -w",
  }

执行对应的脚本命令后,在你的代码中,你可以通过process.env.XXX来访问已配置的环境变量.

Vite项目环境变量配置方式

与使用Webpack或是Rollup项目配置环境变量相比,Vite项目配置环境变量较为简单。

内建变量

Vite在一个特殊的import.meta.env对象上暴露环境变量

  • import.meta.env.MODE: 应用运行的模式。

  • import.meta.env.BASE_URL:部署应用时的基本 URL。他由base 配置项决定。

  • import.meta.env.PROD:应用是否运行在生产环境。

  • import.meta.env.DEV:应用是否运行在开发环境 (永远与 import.meta.env.PROD相反)。

  • import.meta.env.SSR:应用是否运行在 server 上。 这些变量可以直接在代码中访问

.env文件

同样在项目的根目录下,根据环境的不同创建不同的配置文件,不过文件的命名有些特殊性:

.env                # 所有情况下都会加载
.env.local          # 所有情况下都会加载,但会被 git 忽略
.env.[mode]         # 只在指定模式下加载
.env.[mode].local   # 只在指定模式下加载,但会被 git 忽略

加载的环境变量也会通过 import.meta.env 以字符串形式暴露给客户端源码。

注意:为了防止意外地将一些环境变量泄漏到客户端,只有以VITE_为前缀的变量才会暴露给经过vite处理的代码。

模式

默认情况下,开发服务器 dev命令 运行在 development模式,而build命令则运行在production模式。这意味着当执行vite build 时,它会自动加载.env.production中可能存在的环境变量.在某些情况下,若想在vite build时运行不同的模式,你可以通过传递 --mode 选项标志来覆盖命令使用的默认模式。

vite build --mode development

此时vite会使用.env.development文件下环境变量进行构建。

总结

通过对比发现虽然打包工具不同,但是配置环境变量的方式都大同小异,合理的使用环境变量,能够提高我们代码的灵活性、安全性、可维护性,并且将配置信息与代码分离是一种良好的开发实践,可以使应用程序更易于维护和管理。

参考:

https://cn.vitejs.dev/guide/env-and-mode.html

https://webpack.docschina.org/plugins/define-plugin/

https://cn.rollupjs.org/faqs/

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

不同打包工具下的环境变量配置方式对比文章来源地址https://www.toymoban.com/news/detail-796582.html

到了这里,关于不同打包工具下的环境变量配置方式对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue启动配置npm run serve,动态环境变量,根据不同环境访问不同域名

    首先创建不同环境的配置文件,比如域名和一些常量,创建一个env文件,先看看文件目录 env.dev就是dev环境的域名,.test就是test环境域名,其他同理,然后配置package.json文件 scripts里面就是我们的运行配置,当我们执行npm run dev的时候就会读取env.dev文件里面的配置,其他同理,

    2024年02月12日
    浏览(34)
  • uniapp 小程序不同环境下编译的变量配置

    官网地址:概述 | uni-app官网 uni-app 通过在 package.json 文件中增加 uni-app 扩展节点,实现自定义条件编译,例如要发行最新的小程序,可能需要手动修改一些生产与开发环境的不同ip地址等,通过此配置条件,实现自动编译  在json文件中新增一项  uni-app 这里将环境变量设置为两个

    2024年02月13日
    浏览(35)
  • Node-v14.20.0 Windows下的环境变量配置

    1. Node.js 下载与安装 1.1 下载 Node.js 并一路默认安装到 D:DevEnvnodejs 中 1.2 环境变量配置 1.3 淘宝镜像加速

    2024年02月07日
    浏览(37)
  • Gin框架: 使用go-ini配置参数与不同环境下的配置部署

    关于 INI 配置文件与go-ini 1 )概述 在INI配置文件中可以处理各种数据的配置 INI文件是一种简单的文本格式,常用于配置软件的各种参数 go-ini 是地表 最强大、最方便 和 最流行 的 Go 语言 INI 文件操作库 Github 地址:https://github.com/go-ini/ini 官方文档: https://ini.unknwon.io/ 使用示例

    2024年02月22日
    浏览(32)
  • vue-cli4 配置不同开发环境打包命令

    为什么会需要配置多种环境变量? 在一个产品的开发过程中,一般来说都是会经历这么一个过程: 本地开发 → 测试版部署 → 测试 → 预上线 → 正式上线 。对应的每一个环节中的服务器地址,接口地址...都会不一样。那么我们需要怎么去处理这种情况。 #1. 创建文件 在

    2024年02月16日
    浏览(47)
  • vue项目(vue-cli)配置环境变量和打包时区分开发、测试、生产环境

    在自定义配置Vue-cli 的过程中,想分别通过.env.development .env.test .env.production 来代表开发、测试、生产环境。 本来想使用上面三种配置来区分三个环境,但是发现使用test来打包后在测试环境会报错,报错信息: Uncaught ReferenceError: exports is not defined 本来以为真的是程序出现什么

    2023年04月08日
    浏览(41)
  • docker使用环境变量的方式动态配置nginx

    使用docker部署nginx时,由于nginx配置文件里面的一些ip和端口是随着环境变化而改变的,即在 不同的环境 里,使用的 ip和端口都不一样 。这就导致每次部署到新环境时,都要重新编写配置文件,再制作成新的镜像,比较繁琐。 所以我想要制作一个通用的镜像,将ip和端口设置

    2024年02月09日
    浏览(28)
  • 同时安装多个JDK的环境变量配置及切换方式

    前言 我们在日常的java开发过程中,JDK的配置永远是绕不开的问题。假设你是一个学生,你在电脑上安装配置了一个1.6版本jdk,然后因为下载的其他软件导致版本不兼容或者其他的原因需要你将jdk的版本换成1.8,但你又不想删除之前的1.6版本;又或者你是一名刚入职的员工,

    2023年04月14日
    浏览(40)
  • 【Vue3实践】(六)Vue3使用vite处理环境变量、打包部署、nginx配置

    由于在日常开发中会有一部分前端的开发任务,会涉及到Vue的项目的搭建、迭代、构建发布等操作,所以想系统的学习一下Vue相关的知识点,本专题会依照Vue的搭建、开发基础实践、进阶用法、打包部署的顺序进行记录。 历史文章链接如下: 《Vue3搭建、路由配置与基本语法

    2023年04月08日
    浏览(41)
  • 关于克拉美罗下界(CRLB)-及不同DOA估计算法下的方差(性能)对比

        参数估计 在科研、工程乃至生活中都有广泛的应用。参数估计要解决的问题简单来说就是:基于一组观测数据,通过某种方法来获得我们想要的,与观测数据相关的一个或多个参数。     克拉美-罗界(Cramr-Rao Bound, CRB) 是 无偏估计 里我们常用的且十分重要的 一种对不同

    2024年04月13日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包