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

2023年 8月 29日 65.5k 0

近日,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/。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论