Nuxt3环境变量配置

news2024/12/25 12:28:45

Nuxt3 正式发布还不到半年,在投入生产环境使用后,遇到了不少问题,很难找到合适的解决方案,其中环境变量配置就是其中一个,之前一直未能解决,最近要上持续集成,无法绕过这个问题,所以花了点时间研究了一下,最终找到了解决方案,记录一下。

官方文档#

面对一个新框架,我们自然是希望官方文档能够详细地说明使用方式,最初开始使用的时候,并没有关于环境变量配置的说明,甚至可能没有相关功能,不过随着版本的更新,文档中添加了相关的内容,但是安装文档的说明进行配置后并没有生效,后来发现有些是理解偏差,另外还有一些问题我仍然没有解决,不过目前的配置方式已经满足我们的需求,所以这里记录一下研究配置的过程。

关于配置的官网文档: Runtime Config

用于持续集成的命令: nuxi build

环境变量文件的说明: .env

配置文件说明: Nuxt Config

基础变量配置#

最开始我按照官方文档的说明将环境变量配置在了 nuxt.config.ts 文件中,使用起来还是很简单的。

// nuxt.config.ts
runtimeConfig: {
  apiKey: ""; // Default to an empty string, automatically set at runtime using process.env.NUXT_API_KEY
  public: {
    baseURL: ""; // Exposed to the frontend as well.
  }
}

// 使用
const config = useRuntimeConfig();
const baseUrl = config.public.baseUrl;

需要暴露在前端的变量写在 public 中,不需要暴露的直接写在 runtimeConfig 下,调用也很方便,但是作为环境变量,仅满足一种环境肯定是不行的,最初我是通过 process.env.NODE_ENV 来判断当前环境,然后根据环境来配置不同的变量,然而上线之后遇到了一个问题,测试环境和正式环境的 NODE_ENV 都是 production ,这样就导致了无法区分环境,所以在很长一段时间内,我都是通过手动修改 nuxt.config.ts 文件来切换环境,这样的方式肯定是不行的,所以我开始寻找解决方案。

.env 文件配置#

参考 Vue Cli 项目,每次执行 run build 的时候,自动读取对应的 .env 文件中的变量进行编译,这样就是我的理想情况,而且我发现官方的文档中后来确实新增了相关的内容,我就想当然地进行了配置,结果却没有生效。

"scripts": {
  "build": "nuxi build --dotenv .env.production",
  "test": "nuxi build --dotenv .env.test",
  "dev": "nuxi dev --dotenv .env.development -p 3001",
  "generate": "nuxi generate",
  "preview": "nuxi preview",
  "start": "node .output/server/index.mjs"
},

在这里提前说明一下,这个其实就是最终的解决方案,这种写法现在可以生效,早期版本的时候并不支持。

最开始因为文档不完善,使用的人也不多,我只能在官方 GitHub 的 Issues 中寻找有没有类似的问题,因为毕竟是个很常见的需求,当时找到了一些和我有同样困惑的例子。

--dotenv config doesn’t work in production environment

Deployment Nuxt Application on Linux KO

按照作者的回答,我的理解是 .env 文件并不能在 build 环境生效,这一功能是针对 dev 和 preview的,经过我的测试,dev 环境确实没有问题。

根据这两个 issue,我推论环境变量要在启动项目时添加环境变量,于是我根据文档配置 pm2,使用 source .env && node .output/server/index.mjs 启动,结果仍然无法读取环境变量。

pm2 配置#

这里稍微跑个题,虽然没能通过 pm2 成功配置环境变量,但是看到了 pm2 的环境变量配置相关的一些文档,顺便对项目中的配置进行了一些优化。

module.exports = {
  apps: [
    {
      name: "xxx",
      exec_mode: "cluster",
      instances: "max", // Or a number of instances
      script: "npm",
      args: "start",
      error: "/root/.pm2/logs/xxx-error.log", // 放在系统盘下面-错误日志路径如果不想使用日志 "/root/null"
      output: "/root/.pm2/logs/xxx-out.log", // 放在系统盘下面-正常日志路径如果不想使用日志 "/root/null"
      combine_logs: false,
      merge_logs: false,
      log_date_format: "YYYY-MM-DD HH:mm Z", // 指定日志文件的时间格式
      env: {
        NODE_ENV: "production",
        PORT: 3001,
        FRONTEND_VERSION: "v1.0.0",
        FRONTEND_CLIENTID: "xxx",
      },
      env_production: {
        NODE_ENV: "development",
        PORT: 3000,
        FRONTEND_VERSION: "v1.0.0",
        FRONTEND_CLIENTID: "xxx",
      },
    },
  ],
};

环境变量#

一开始我以为 pm2 配置中的 env 是项目中环境变量,设置值之后测试仍然没有效果,仔细查看文档后发现 env 中的字段是固定的,主要是用于启动进程的配置,可以配置不同环境的启动端口和 node 的环境值等。详情可以看文档 环境变量

日志#

pm2 的日志默认是合在一起的,时间久或者访问量大的情况下,日志会非常大,不方便查看,我们可以将日志分开,这样会更方便通过日志查看项目的启动情况。

  1. 安装 pm2-logrotate
$ pm2 install pm2-logrotate
  1. 配置 pm2-logrotate
// 设置日志文件的最大大小,超过这个大小就会进行分割
pm2 set pm2-logrotate:max_size 4M
// 设置压缩日志文件
pm2 set pm2-logrotate:compress true

通过各种配置可以把日志调整到满足我们需求的形式,详情可以看文档 pm2-logrotate

正确的配置#

多次尝试以失败告终之后,我暂时搁置了环境变量的配置问题,但是最近要做持续集成,肯定要通过指令而不是人为修改来完成,所以我又针对环境变量配置进行了测试,最终找到了正确的配置方式。

正如上面 .env 文件配置 一节所说,最终的解决方案就是在 package.json 中配置 run build 的时候指定 .env 文件,这样就可以在编译的时候读取对应的环境变量。不确定是不是最近 nuxt 的版本更新了,这个功能才生效,还是说之前的版本我没有配置正确,总之现在是可以用了。

完整的配置如下:

// package.json
"scripts": {
  "build": "nuxi build --dotenv .env.production",
  "test": "nuxi build --dotenv .env.test",
  "dev": "nuxi dev --dotenv .env.development -p 3001",
  "generate": "nuxi generate",
  "preview": "nuxi preview",
  "start": "node .output/server/index.mjs"
},
// .env.production
NUXT_API_KEY=https://xxx
NUXT_PUBLIC_BASE_URL=https://xxx
// nuxt.config.ts
runtimeConfig: {
  apiKey: process.env.NUXT_API_KEY; // Default to an empty string, automatically set at runtime using process.env.NUXT_API_KEY
  public: {
    baseURL: process.env.NUXT_PUBLIC_BASE_URL; // Exposed to the frontend as well.
  }
}

// 使用
const config = useRuntimeConfig();
const baseUrl = config.public.baseUrl;

但是,问题并没有完全解决,还存在一个问题和一个疑点。

先说问题,Nuxt 的环境变量是在服务端运行的,在客户端并不能获取到环境变量,我这里主要是用于判断环境使用不同的 key 值,process.env.NUXT_PUBLIC_PAGE_WWW 前面还是 process.env,我的理解是这个值的获取是基于 node 的,客户端无法正确读取,所以我在 .env 文件中增加了一个新的变量 VITE_NUXT_ENV=test 用于判断环境,这样就可以在客户端通过 import.meta.env.VITE_NUXT_ENV 获取到环境变量。

感觉上这样的思路存在一些问题,如果有更好的解决方案,欢迎指教或讨论。 

而疑点就在注释里,前面应该也有人注意到,官网文档的注释里写到:

Default to an empty string, automatically set at runtime using process.env.NUXT_API_KEY

意思应该是如果在 runtimeConfig 设置了环境变量,也会自动添加到对应的 process.env 变量中,但是经过我的测试,这个功能并没有生效,不知道是不是哪里有错,如果有人知道,希望能告诉我。

总结#

新框架总是有很多坑,在开发过程中我遇到了很多问题,但是都一一解决了,虽然过程很痛苦,但是收获也很大,希望这篇文章能帮助到和我遇到同样问题的人,也为自己做一个记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/921029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Connect-The-Dots靶场

靶场下载 https://www.vulnhub.com/entry/connect-the-dots-1,384/ 一、信息收集 探测存活主机 netdiscover -r 192.168.16.161/24nmap -sP 192.168.16.161/24端口操作系统扫描 nmap -sV -sC -A -p 1-65535 192.168.16.159扫描发现开放端口有 21 ftp 80 http 20…

labelImg的安装及其使用注意事项

一、安装labelImg 在低版本python的安装方法 1. 新建及激活进去虚拟环境 conda create --namelabelImg python3.9 conda activate labelImg注释:新建的虚拟环境的python版本不能超过3.9版本 2.安装相应的包 pip install pyqt5 pip install labelImg3.使用label…

Friend.tech爆火!Web3社交领域还有哪些项目值得关注?

要说Web3圈子里的“当红炸子鸡”,那必然是Friend.tech无疑了。 2023年8月10日,链上社交应用Friend.tech正式上线,短时间内便在Web3圈子里掀起了惊波澜,上线短短24小时,交易量便已超过810万美元。 FFriend.tech是一款建…

数据库——Redis 单线程模型详解

文章目录 Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型 (Netty 的线程模型也基于 Reactor 模式,Reactor 模式不愧是高性能 IO 的基石),这套事件处理模型对应的是 Redis 中的文件事件处理器(file …

python提取文件夹指定文件以及删除指定文件

在做项目的过程中,往往需要提取文件夹中的指定文件至其他文件夹,或者要删除文件夹中的指定文件,如下图所示,当我需要将图片按照命名的尾数进行分类提取或者删除,依靠人工筛选是很麻烦的。 下面提供一个代码进行分类 i…

【DC-DC的原理图及Layout设计要点】

文章目录 前言1.DC-DC的环流2.PCB布局要点3.输入电容器的布局4.续流二极管的布局5.热焊盘 前言 在开关电源的设计中,PCB布局设计与电路设计同样重要。合理的布局可以避免电源电路引起的各种问题。不合理的布局可能导致输出和开关信号叠加引起噪声增加、调节性能恶化…

医学图像融合的深度学习方法综述

文章目录 Deep learning methods for medical image fusion: A review摘要引言非端到端的融合方法基于深度学习的决策映射基于深度学习的特征提取 端到端图像融合方法基于卷积神经网络(CNN)的图像融合方法单级特征融合方法多级特征融合基于残差神经网络的图像融合方法基于密集神…

中央重磅文件发布,成都民营企业家极米钟波:更加坚定发展信心决心

7月19日,《中共中央 国务院关于促进民营经济发展壮大的意见》发布。意见指出:民营经济是推动中国式现代化的生力军,是高质量发展的重要基础,是推动我国全面建成社会主义现代化强国、实现第二个百年奋斗目标的重要力量。 《意见》…

创建R包-2.2:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)

目录 4-添加C函数 5-编辑元数据 6-启用Roxygen,执行文档化。 7-单元测试 8-在自己的计算机上安装R包: 9-程序发布 参考: 为什么要写这篇文章的更新日期?因为R语言发展很快,很多函数或者方式,现在可以使…

哲讯科技携手无锡华启动SCM定制化项目,共谋数字化转型之路

无锡华光座椅弹簧有限公司启动SCM定制化项目 近日,无锡华光座椅弹簧有限公司顺利举行了SCM定制化项目的启动会。本次启动会作为该项目实施的重要里程碑,吸引了双方项目组核心成员的共同参与,并见证了项目的正式启动。 无锡华光座椅弹簧有限公…

opencv-全景图像拼接

运行环境 python3.6 opencv 3.4.1.15 stitcher.py import numpy as np import cv2class Stitcher:#拼接函数def stitch(self, images, ratio0.75, reprojThresh4.0,showMatchesFalse):#获取输入图片(imageB, imageA) images#检测A、B图片的SIFT关键特征点,并计算…

控制台的启动日志消失了?关键在于这些步骤!

linux学习视频 每次我们启动系统的时候,控制台都会显⽰出⼀⼤堆的启动⽇志。 有时候出于保密的考虑,不希望启动⽇志直接显⽰在控制台上。⽐如⼀些安全⼚商提供的基于 Linux 的硬件设备,⾥⾯可能有⼀些内容不希望⽤⼾看到。 这时候&#xff…

胖小酱之文思泉涌

小编认为是灵感! 灵感,也叫灵感思维,指文艺、科技活动中瞬间产生的富有创造性的突发思维状态。释义:灵验;灵应。不用平常的感觉器官而能使精神互相交通,亦称远隔知觉。或指无意识中突然兴起的神妙能力。通常搞创作的学者或科学家…

Matplotlib画多幅子图重叠问题

fig.tight_layout()函数:使得子图横纵坐标更加紧凑,主要用于自动调整图区的大小以及间距,使所有的绘图及其标题、坐标轴标签等都可以不重叠的完整显示在画布上。 pad:用于设置绘图区边缘与画布边缘的距离大小w_pad:用于设置绘图区之间的水平…

【王道-第四章-文件管理】

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 初识文件管理No.2 文件的逻辑结构No.3 文件目录No.4 文件的物理结构No.5 逻辑结构VS物理结构No.6 文件存储空间管理No.7 文件的基本操作No.8 文件共享No.9 文件保护No.10 文件系统的层次结构No.11 文件系统的全局结构&a…

数字孪生交通是数字化技术与交通的创新融合

摘要:数字孪生交通数字孪生交通(digitaltwintransportation)是一种新兴的技术概念,指通过大数据分析和处理,将这些数据与数字孪生交通模型相结合,实现对交通系统的全面仿真。 数字孪生交通&#xff0…

海外ios应用商店优化排名因素之视频预览与截图

当我们找到感兴趣的应用程序并转到该应用程序的页面时,首先引起注意的是预览视频。视频旨在以更具吸引力的方式展示应用程序的用户体验和UI。视频长度最多为30秒,其中前5秒最为重要,一定要让它尽可能引人注目。 1、关于优化预览视频的提示。…

2023-08-24 LeetCode每日一题(统计参与通信的服务器)

2023-08-24每日一题 一、题目编号 1267. 统计参与通信的服务器二、题目链接 点击跳转到题目位置 三、题目描述 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。 如果两台…

Eagle for Mac图片素材管理工具

Eagle for Mac是专门为mac用户设计的一款非常专业的图片素材管理软件,支持藏网页图片,网页截屏,屏幕截图和标注,自动标签和筛选等功能,让设计师方便存储需要的素材和查找,提供工作效率。 使用 Eagle 强大的…

Unity 类Scene窗口相机控制

类Scene窗口相机控制 🍔效果 🍔效果 传送门👈