JavaScript 点符号在 process.env 中不起作用

JavaScript dot notation does not work in process.env

为什么不能用点号访问process.env.TEST,这里的点号和括号号有什么区别?

.env:

TEST=123

src/routes/index.苗条:

<script>
import '$lib/test';
</script>

src/lib/test.js:

import dotenv from 'dotenv';
dotenv.config();

console.log(process.env.TEST, process.env['TEST']); // undefined 123

(我在一个新的SvelteKit项目中写了代码,除了上面的代码我没有改变任何其他东西)

SvelteKit 使用 Vite 进行打包,对吧?似乎 Vite 对 env 变量进行了“生产替换”:https://vitejs.dev/guide/env-and-mode.html

下面是 import.meta.env 变量的替换方式:

During production, these env variables are statically replaced. It is therefore necessary to always reference them using the full static string. For example, dynamic key access like import.meta.env[key] will not work.

而且对 process.env 的普通访问似乎也得到了处理。例如这个源文件:

console.log('dot access', process.env.XDG_DATA_HOME);
console.log('indexing env', process['env'].XDG_DATA_HOME);
console.log('indexing var', process.env['XDG_DATA_HOME']);

...将被Vite改造为:

console.log("dot access", {}.XDG_DATA_HOME);
console.log("indexing env", process["env"].XDG_DATA_HOME);
console.log("indexing var", process.env["XDG_DATA_HOME"]);

如您所见,第一行已转换。如果您想将环境变量用于 parametrize/customize 网络脚本,这是有意义的,但如果您 运行 NodeJS 中的捆绑脚本则没有意义。

解决方法是使用方括号访问 env 或变量。

这是 Vite 中的一个跟踪问题:https://github.com/vitejs/vite/issues/3229