我尝试从 .env 文件加载一个秘密,该文件是条带可发布密钥
import * as dotenv from 'dotenv'
dotenv.config()
导入此文件时出现错误:
Uncaught (in promise) ReferenceError: process is not defined
我目前正在使用 astrojs 框架,我一直在使用
import.meta.env
,但这似乎在生产构建中不起作用,我在 docker-compose 文件中设置了键值,但看不到该值。是undefined
。使用 docker-compose 和 import.meta.env
解决或解决 dotenv 都可以。如果我们存储条带可发布密钥,什么最适合?
这实际上取决于您在生产中运行代码的方式。如果您在节点环境中使用服务器端渲染运行代码,则可以使用 process.env
如果您有疑问,请查看文件 astro.config.mjs
这是来自文档的使用节点适配器和服务器端渲染的示例:
import { defineConfig } from 'astro/config';
import node from '@astrojs/node';
export default defineConfig({
output: 'server',
adapter: node({
mode: 'standalone'
}),
});
如果您的 astro.config.mjs 看起来像这样,您可能会通过以下方式获取环境变量:
const value = import.meta.env.PUBLIC_VALUE ?? process.env.PUBLIC_VALUE
上述策略优先通过 import.meta.env 获取值(如果设置)。但如果未定义,则使用 process.env。
对我来说,这个策略在本地运行代码和通过 docker 运行代码时都有效。
变量名称以
PUBLIC_
开头很重要,这是因为只有 PUBLIC_
变量在服务器端可用,如此处所述
要在
astro.config.mjs
中使用环境变量,您可以使用以下方法:
import { loadEnv } from "vite";
// Load the environment variables
const { MY_ENV } = loadEnv(import.meta.env.MODE, process.cwd(), "");
// Export the Astro configuration
export default defineConfig({
site: 'https://www.example.com',
integrations: [
mdx(),
sitemap(),
react(),
...(MY_ENV === "true" ? [plugin()] : []) // Conditionally add the plugin based on MY_ENV
],
});