diff --git a/e2e/cases/cli/no-env/.env b/e2e/cases/cli/no-env/.env
new file mode 100644
index 0000000000..c6c63c8ac3
--- /dev/null
+++ b/e2e/cases/cli/no-env/.env
@@ -0,0 +1 @@
+PUBLIC_NAME=jack
diff --git a/e2e/cases/cli/no-env/index.test.ts b/e2e/cases/cli/no-env/index.test.ts
new file mode 100644
index 0000000000..1056bab3c4
--- /dev/null
+++ b/e2e/cases/cli/no-env/index.test.ts
@@ -0,0 +1,17 @@
+import { execSync } from 'node:child_process';
+import fs from 'node:fs';
+import path from 'node:path';
+import { rspackOnlyTest } from '@e2e/helper';
+import { expect } from '@playwright/test';
+
+rspackOnlyTest('should allow to disable loading env files', async () => {
+ execSync('npx rsbuild build --no-env', {
+ cwd: __dirname,
+ });
+ const content = fs.readFileSync(
+ path.join(__dirname, 'dist/static/js/index.js'),
+ 'utf-8',
+ );
+ expect(content).toContain('process.env.PUBLIC_NAME');
+ expect(content).not.toContain('jack');
+});
diff --git a/e2e/cases/cli/no-env/rsbuild.config.ts b/e2e/cases/cli/no-env/rsbuild.config.ts
new file mode 100644
index 0000000000..17398ef7ac
--- /dev/null
+++ b/e2e/cases/cli/no-env/rsbuild.config.ts
@@ -0,0 +1,12 @@
+import { defineConfig, loadEnv } from '@rsbuild/core';
+
+const { publicVars } = loadEnv({ prefixes: ['REACT_APP_'] });
+
+export default defineConfig({
+ source: {
+ define: publicVars,
+ },
+ output: {
+ filenameHash: false,
+ },
+});
diff --git a/e2e/cases/cli/no-env/src/index.js b/e2e/cases/cli/no-env/src/index.js
new file mode 100644
index 0000000000..063dab75c2
--- /dev/null
+++ b/e2e/cases/cli/no-env/src/index.js
@@ -0,0 +1 @@
+console.log(process.env.PUBLIC_NAME);
diff --git a/packages/core/src/cli/commands.ts b/packages/core/src/cli/commands.ts
index 492ab75a0e..6629fc2be7 100644
--- a/packages/core/src/cli/commands.ts
+++ b/packages/core/src/cli/commands.ts
@@ -12,6 +12,7 @@ export type CommonOptions = {
mode?: RsbuildMode;
config?: string;
configLoader?: ConfigLoader;
+ env?: boolean;
envDir?: string;
envMode?: string;
open?: boolean | string;
@@ -68,7 +69,8 @@ const applyCommonOptions = (cli: CAC) => {
default: [],
},
)
- .option('--env-dir
', 'specify the directory to load `.env` files');
+ .option('--env-dir ', 'specify the directory to load `.env` files')
+ .option('--no-env', 'Disable loading `.env` files');
};
const applyServerOptions = (command: Command) => {
diff --git a/packages/core/src/cli/init.ts b/packages/core/src/cli/init.ts
index e10bc26c29..437033fc91 100644
--- a/packages/core/src/cli/init.ts
+++ b/packages/core/src/cli/init.ts
@@ -92,10 +92,13 @@ export async function init({
cwd: root,
rsbuildConfig: () => loadConfig(root),
environment: commonOpts.environment,
- loadEnv: {
- cwd: getEnvDir(root, commonOpts.envDir),
- mode: commonOpts.envMode,
- },
+ loadEnv:
+ commonOpts.env === false
+ ? false
+ : {
+ cwd: getEnvDir(root, commonOpts.envDir),
+ mode: commonOpts.envMode,
+ },
});
rsbuild.onBeforeCreateCompiler(() => {
diff --git a/scripts/dictionary.txt b/scripts/dictionary.txt
index 803c85271b..40a7e8b5e6 100644
--- a/scripts/dictionary.txt
+++ b/scripts/dictionary.txt
@@ -27,6 +27,7 @@ darkgrey
datauri
deepmerge
docgen
+dotenvx
dppx
envinfo
estree
diff --git a/website/docs/en/guide/advanced/env-vars.mdx b/website/docs/en/guide/advanced/env-vars.mdx
index d8dd2c9094..3701b6f57f 100644
--- a/website/docs/en/guide/advanced/env-vars.mdx
+++ b/website/docs/en/guide/advanced/env-vars.mdx
@@ -293,6 +293,16 @@ const mergedConfig = mergeRsbuildConfig(
);
```
+### Disable loading
+
+You can disable loading `.env` files by using the `--no-env` flag in the CLI.
+
+```bash
+npx rsbuild dev --no-env
+```
+
+When using the `--no-env` flag, Rsbuild CLI will not read any `.env` files, and you can manage environment variables using other tools like [dotenvx](https://dotenvx.com/).
+
## Public variables
All env variables starting with `PUBLIC_` can be accessed in client code. For example, if the following variables are defined:
diff --git a/website/docs/en/guide/basic/cli.mdx b/website/docs/en/guide/basic/cli.mdx
index df9a7714c9..4d7b3b868f 100644
--- a/website/docs/en/guide/basic/cli.mdx
+++ b/website/docs/en/guide/basic/cli.mdx
@@ -37,6 +37,7 @@ Rsbuild CLI provides several common flags that can be used with all commands:
| `--environment ` | Specify the name of environment to build, see [Build specified environment](/guide/advanced/environments#build-specified-environment) |
| `-h, --help` | Display help for command |
| `-m, --mode ` | Specify the build mode (`development`, `production` or `none`), see [mode](/config/mode) |
+| `--no-env` | Disable loading `.env` files |
| `-r, --root ` | Specify the project root directory |
## rsbuild dev
diff --git a/website/docs/zh/guide/advanced/env-vars.mdx b/website/docs/zh/guide/advanced/env-vars.mdx
index c2acdeb07b..c5e7a9ba50 100644
--- a/website/docs/zh/guide/advanced/env-vars.mdx
+++ b/website/docs/zh/guide/advanced/env-vars.mdx
@@ -293,6 +293,16 @@ const mergedConfig = mergeRsbuildConfig(
);
```
+### 禁用加载
+
+你可以通过 CLI 的 `--no-env` 选项来禁用加载 `.env` 文件。
+
+```bash
+npx rsbuild dev --no-env
+```
+
+在使用 `--no-env` 选项时,Rsbuild CLI 不会读取任何 `.env` 文件,你可以自行使用其他工具来管理环境变量,例如 [dotenvx](https://dotenvx.com/)。
+
## public 变量
所有以 `PUBLIC_` 开头的环境变量可以在 client 代码中访问,比如定义了以下变量:
diff --git a/website/docs/zh/guide/basic/cli.mdx b/website/docs/zh/guide/basic/cli.mdx
index 7a6557ae22..13baef745d 100644
--- a/website/docs/zh/guide/basic/cli.mdx
+++ b/website/docs/zh/guide/basic/cli.mdx
@@ -37,6 +37,7 @@ Rsbuild CLI 提供了一些公共选项,可以用于所有命令:
| `--environment ` | 指定需要构建的 environment 名称,详见 [构建指定环境](/guide/advanced/environments#构建指定环境) |
| `-h, --help` | 显示命令帮助 |
| `-m, --mode ` | 指定构建模式,可以是 `development`,`production` 或 `none`,详见 [mode](/config/mode) |
+| `--no-env` | 禁用 `.env` 文件的加载 |
| `-r, --root ` | 指定项目根目录,可以是绝对路径或者相对于 cwd 的路径 |
## rsbuild dev