您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

Node.js 终于原生支持 .env 文件了!

时间:2023-08-29 12:51:03  来源:微信公众号  作者:前端充电宝

近日,Node.js 团队核心成员 Ulises Gascón 在社交平台表示,Node.js 20.6 版本将原生支持 .env 文件,该版本计划于 8 月 28 日发布。下面就来看看 .env 文件是什么,有什么作用,如果在浏览器环境中使用 .env.

Node.js 原生支持 .env

从 Node.js v20.6.0 开始,Node.js 支持使用 .env 文件来配置环境变量。配置文件应遵循 INI 文件格式,每一行都包含一个环境变量的键值对。通过这个新的特性,就无需再使用第三方模块来加载 .env 中的环境变量了。

要使用预定义的配置初始化 Node.js 应用,请使用以下 CLI 命令:

node --env-file=config.env index.js。

例如,当应用初始化时,可以使用 process.env.PASSword 访问以下环境变量:

PASSWORD=nodejs

除了环境变量,这个更改还允许在 .env 文件中直接定义 NODE_OPTIONS环境变量,无需将其包含在 package.json 中。

.env

.env 文件用于配置环境变量。环境变量是在运行应用程序时向操作系统或应用传递的值,用于控制应用的行为和设置。.env 文件通常包含敏感信息(如数据库连接字符串、API 密钥等),因此它们被排除在代码版本控制系统之外,以保护这些敏感数据。

.env 文件使用键值对的格式,每一行都是一个环境变量的定义。例如:

DB_HOST=localhost
DB_USER=root
DB_PASSWORD=123456
API_KEY=abcdef123456

在 Node.js 中有一个 process全局变量,其中的env属性可以访问系统中的环境变量。

在应用中,Node.js 无法自行维护本地环境变量,需要借助第三方库(如dotenv,它是一个零依赖的模块)来加载.env文件,并将其中的环境变量注入到 process.env 对象中。通过这种方式,可以轻松地从程序中访问这些环境变量,而不需要显式地硬编码它们。

要通过 dotenv来加载 .env 文件,需要先安装 dotenv:

npm i -S dotenv

以下是使用 dotenv 库加载 .env 文件的示例代码:

require('dotenv').config(); // 加载 .env 文件

console.log(process.env.DB_HOST); // 访问环境变量
console.log(process.env.API_KEY);

这里,dotenv 库的 config() 方法会读取.env文件,并将其中的环境变量加载到 process.env 对象中。然后,可以通过 process.env 对象访问这些环境变量的值。

使用 .env 文件的好处是,可以根据不同的环境(开发、测试、预发、生产环境等)设置不同的配置值,而不需要直接修改代码。这样做可以使应用更加灵活和可移植。

浏览器环境

在 Node.js 环境中,可以使用 process.env 来获取环境变量的值。但是,在浏览器环境下,process.env 是不可用的,无法直接在浏览器中获取环境变量的值。

幸运的是,通过使用打包工具,可以将环境变量暴露给浏览器运行时环境。下面我们来看一下如何在 Vite 和 webpack 中实现这一目标。

Vite

Vite 通过 import.meta.env 对象来暴露一组预定义的变量:

  • import.meta.env.MODE:值为 'development' 或 'production'。
  • import.meta.env.PROD:在生产模式下为 true。
  • import.meta.env.DEV:在开发模式下为 true。
  • import.meta.env.SSR:一个布尔值,表示应用是否在服务端运行。
  • import.meta.env.BASE_URL:基础 URL。

此外,Vite 还可以从 .env 文件中加载变量。在内部,Vite 也是使用 dotenv 来实现这一功能。但不需要手动调用与 dotenv 相关的东西:Vite 会自动完成所有操作。

例如,如果有一个如下所示的 .env 文件:

VITE_MY_VAR=value

那么可以在浏览器中通过 import.meta.env.VITE_MY_VAR 来访问这个值,它的结果将是 'value'。

注意,Vite 只会公开以 VITE_ 前缀开头的变量(但这可以进行配置)。

Vite 在如何访问环境变量方面有一个详细的指南:https://cn.vitejs.dev/guide/env-and-mode.html

Webpack

Webpack 中内置的 EnvironmentPlugin 插件可以用来暴露环境变量。

例如,要暴露 NODE_ENV 环境变量,可以使用以下配置:

// webpack.config.js
const { EnvironmentPlugin } = require('webpack');

module.exports = {
  // ...
  plugins: [
    // ...
    new EnvironmentPlugin(['NODE_ENV'])
  ]
}

如果环境中没有 NODE_ENV 变量,该插件将抛出错误。但可以使用一个普通的 JAVAScript 对象作为配置对象(默认值为该对象的值)来为变量分配一个默认值:

// webpack.config.js
const { EnvironmentPlugin } = require('webpack');

module.exports = {
  // ...
  plugins: [
    // ...
    new EnvironmentPlugin({
      NODE_ENV: 'development'
    })
  ]
}

使用上述配置,如果未设置 NODE_ENV 变量,Webpack 会将 process.env.NODE_ENV 默认设置为 'development'。

如果想要在使用 Webpack 打包的项目中使用.env文件,还是需要借助第三方插件 dotenv,安装之后,在 webpack.config.js 中进行如下配置:

const path = require("path");
const webpack = require('webpack');

// 使用 dotenv 从项目根目录读取 .env 文件。
const dotenv = require('dotenv').config( {
  path: path.join(__dirname, '.env')
} );

module.exports = {
  entry: "./src/App.js",
  output: {
    path: path.resolve(__dirname, "public"),
    filename: "app.js",
  },
  module: {
    rules: [
      {
        test: /.js?$/,
        exclude: /(node_modules)/,
        include: path.resolve(__dirname, "src"),
        use: {
          loader: "babel-loader"
        }
      },
    ]
  },
  plugins: [
    new webpack.DefinePlugin( {
      "process.env": dotenv.parsed
    } ),
  ],
};

通过使用webpack.DefinePlugin,解析并注入整个.env文件的内容,.env 文件中的内容被转换为 JavaScript 对象并分配给变量process.env。

除此之外,有一个名为 dotenv-webpack 的 webpack 插件,用于加载 .env 文件并将其中定义的环境变量注入到应用中。这样,就可以在代码中使用 process.env.VARIABLE_NAME 来访问这些环境变量的值。要使用 dotenv-webpack 插件,需要按照以下步骤进行设置:

首先,在项目中安装 dotenv-webpack。可以使用 npm 或者 yarn 进行安装:

npm install dotenv-webpack

在 webpack 的配置文件中添加以下代码:

const DotenvWebpack = require('dotenv-webpack');

module.exports = {
  // ...其他的 webpack 配置

  plugins: [
    // 添加 DotenvWebpack 插件
    new DotenvWebpack()
  ]
}

这样,当运行 webpack 构建时,dotenv-webpack 插件会自动加载 .env 文件并将其中定义的环境变量注入到应序中。可以在项目的不同文件中使用 process.env 访问这些变量的值。

Webpack 在如何访问环境变量方面有一个详细的指南:https://webpack.js.org/plugins/environment-plugin/。



Tags:Node.js   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
理解 Node.js 中的事件循环
你已经使用 Node.js 一段时间了,构建了一些应用程序,尝试了不同的模块,甚至对异步编程感到很舒适。但是有些事情一直在困扰着你——事件循环(Event Loop)。如果你像我...【详细内容】
2024-01-05  Search: Node.js  点击:(111)  评论:(0)  加入收藏
让Node.js加速你的网络应用开发之旅
Node.js 是一个基于Chrome V8 引擎的JavaScript运行时,用于构建高性能、可伸缩的网络应用。它的出现在很大程度上改变了后端开发的方式,并成为了现代Web开发中不可或缺的一部...【详细内容】
2023-12-13  Search: Node.js  点击:(169)  评论:(0)  加入收藏
告别Node.js版本困扰,轻松切换开发环境!
最近,在下载别人的开源项目进行学习的时候,总是因为 Node 环境问题导致没法依赖无法正常安装,因为人家开源项目限制了一定要高于某个版本,差点劝退了我。Node版本限制因为平时偶...【详细内容】
2023-11-08  Search: Node.js  点击:(275)  评论:(0)  加入收藏
19 种常见的 JavaScript 和 Node.js 错误
译者 | 刘汪洋审校 | 重楼速度、性能和响应性在 Web 开发中起着至关重要的作用,尤其是在使用 JavaScript 和 Node.js 开发时尤为重要。如果一个网站响应缓慢或界面卡顿,就会让...【详细内容】
2023-11-03  Search: Node.js  点击:(192)  评论:(0)  加入收藏
通过这个技术,浏览器可以运行Node.js、Rust、Python、PHP、C++、Java代码了!
近日,WebContainers 发布重要更新,WASI(WebAssembly 系统接口)已全面集成到 WebContainers 中。这是一个重要里程碑,它扩大了可以使用浏览器执行的操作,是 Web 开发的全新范例,允许...【详细内容】
2023-10-13  Search: Node.js  点击:(276)  评论:(0)  加入收藏
为什么Node.js 是后端开发的规则改变者
作者丨P. Rehan编译丨诺亚“Node.js有危险了!”“任何能够自救的开发人员都应该尽快迁移到另一个后端环境!”JavaScript的仇恨者说。不用理会这些言论。Node.js将继续存在,并...【详细内容】
2023-09-09  Search: Node.js  点击:(248)  评论:(0)  加入收藏
Node.js 终于原生支持 .env 文件了!
近日,Node.js 团队核心成员 Ulises Gascón 在社交平台表示,Node.js 20.6 版本将原生支持 .env 文件,该版本计划于 8 月 28 日发布。下面就来看看 .env 文件是什么,有什么...【详细内容】
2023-08-29  Search: Node.js  点击:(385)  评论:(0)  加入收藏
将 Node.js 应用程序容器化的七种方法
本文列出了七种容器化 node.js 应用程序的方法,让我们简要地看一下它们。在过去的五年里,Node.js 一直是严肃程序员的最爱。最大吞吐量的 JavaScript 运行时环境是一个免费的...【详细内容】
2023-03-24  Search: Node.js  点击:(261)  评论:(0)  加入收藏
十个优质的基于Node.js的CMS 内容管理平台
内容管理系统 (「CMS」) 使没有强大技术背景的人也能够轻松发布内容。我们可以使用 「CMS」 来管理我们的内容和交付。市面上有不同类型的 「CMS」,它们执行不同的目的并具有...【详细内容】
2023-03-03  Search: Node.js  点击:(278)  评论:(0)  加入收藏
Node.js 是如何跑起来的
本文为来自 字节跳动-国际化电商-S 项目团队 成员的文章,已授权 ELab 发布。一个 TCP 连接的案例​TCP 服务端​const net = require('net');const server = new net...【详细内容】
2023-03-03  Search: Node.js  点击:(162)  评论:(0)  加入收藏
▌简易百科推荐
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  前端新世界  微信公众号  Tags:JavaScript   点击:(4)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践——如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  前端新世界  微信公众号  Tags:JavaScript   点击:(25)  评论:(0)  加入收藏
又出新JS运行时了!JS运行时大盘点
Node.js是基于Google V8引擎的JavaScript运行时,以非阻塞I/O和事件驱动架构为特色,实现全栈开发。它跨平台且拥有丰富的生态系统,但也面临安全性、TypeScript支持和性能等挑战...【详细内容】
2024-03-21  前端充电宝  微信公众号  Tags:JS   点击:(23)  评论:(0)  加入收藏
构建一个通用灵活的JavaScript插件系统?看完你也会!
在软件开发中,插件系统为应用程序提供了巨大的灵活性和可扩展性。它们允许开发者在不修改核心代码的情况下扩展和定制应用程序的功能。本文将详细介绍如何构建一个灵活的Java...【详细内容】
2024-03-20  前端历险记  微信公众号  Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  WangLiwen    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
跨端轻量JavaScript引擎的实现与探索
一、JavaScript 1.JavaScript语言JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。ECMAScript发展史: 2.JavaScript...【详细内容】
2024-03-12  京东云开发者    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
面向AI工程的五大JavaScript工具
令许多人惊讶的是,一向在Web开发领域中大放异彩的JavaScript在开发使用大语言模型(LLM)的应用程序方面同样大有价值。我们在本文中将介绍面向AI工程的五大工具,并为希望将LLM...【详细内容】
2024-02-06    51CTO  Tags:JavaScript   点击:(52)  评论:(0)  加入收藏
JS小知识,使用这6个小技巧,避免过多的使用 if 语句
最近在重构我的代码时,我注意到早期的代码使用了太多的 if 语句,达到了我以前从未见过的程度。这就是为什么我认为分享这些可以帮助我们避免使用过多 if 语句的简单技巧很重要...【详细内容】
2024-01-30  前端达人  今日头条  Tags:JS   点击:(56)  评论:(0)  加入收藏
18个JavaScript技巧:编写简洁高效的代码
本文翻译自 18 JavaScript Tips : You Should Know for Clean and Efficient Code,作者:Shefali, 略有删改。在这篇文章中,我将分享18个JavaScript技巧,以及一些你应该知道的示例...【详细内容】
2024-01-30  南城大前端  微信公众号  Tags:JavaScript   点击:(65)  评论:(0)  加入收藏
使用 JavaScript 清理我的 200GB iCloud,有了一个意外发现!
本文作者在综合成本因素之下,决定用 Java 脚本来清理一下自己的 iCloud,结果却有了一个意外发现,即在 iCloud 中上传同一个视频和删除此视频之后,iCloud 的空间并不一致,这到底是...【详细内容】
2024-01-11    CSDN  Tags:JavaScript   点击:(97)  评论:(0)  加入收藏
站内最新
站内热门
站内头条