Nuxt.js 静态生成中的跨域问题解决方案

当您运行 npm run generate 生成静态页面时,Vite 的代理服务器确实无法使用,因为生成阶段是在 Node.js 环境中执行的构建过程。但别担心,我将为您提供一套完整的解决方案来处理构建阶段的跨域问题。

核心解决方案


1. 构建阶段:使用服务端中转 API(推荐)

在构建阶段通过 Nuxt 的 server 路由中转请求,避开跨域限制:

// server/api/products.ts
export default defineEventHandler(async (event) => {// 从环境变量获取API地址const apiBase = useRuntimeConfig().public.apiBase// 构建阶段直接调用API(无跨域问题)return await $fetch(`${apiBase}/products`, {headers: {'Authorization': `Bearer ${process.env.API_TOKEN}`}}).catch(() => ([])) // 添加错误处理
})

为什么 server/api/products.ts是服务端中转 API?

文件位于 server/api 目录下,这是 Nuxt 3 中定义服务器端 API 的标准位置。
文件名为 products.ts,表示它处理的是与 /api/products 路径相关的请求

在这个处理函数中,它接收来自客户端的请求(在构建阶段,这个请求来自 Nuxt 的构建进程),然后它自己作为客户端去请求另一个后端服务(${apiBase}/products)。
这个后端服务可能是你真正的业务 API,可能运行在另一个域名或端口上(比如 http://localhost:3001 或 https://api.example.com)。

在构建阶段(npm run generate),Nuxt 是在 Node.js 环境中运行的,所以它直接发起 HTTP 请求(使用 $fetch)到后端服务,这不存在浏览器的同源策略限制(跨域问题只存在于浏览器中)。
在开发阶段,我们通过 Vite 的代理配置(在 nuxt.config.ts 中)将客户端对 /api/products 的请求代理到真正的后端服务,同样避免了浏览器的跨域问题。


2. 页面组件中调用中转 API
<!-- pages/products.vue -->
<script setup>
// 构建时调用的中转API(不存在跨域问题)
const { data: products } = await useAsyncData('products',() => $fetch('/api/products')
)
</script>

​当 Nuxt.js 执行 $fetch('/api/products') 时,它会自动匹配并调用 server/api/products.ts 中定义的中转 API 处理程序​​。这是一个 Nuxt.js 的核心约定机制。

详细的路径匹配规则:
​​目录结构映射​​:

  • 所有放在 server/api/ 目录下的 .ts 文件都会自动注册为 API 端点
  • 文件路径直接对应路由路径:

​​具体匹配过程​​:

文件路径

对应的API路由

server/api/products.ts/api/products
server/api/products/index.ts/api/products
server/api/products/[id].ts  /api/products/:id
server/api/categories/featured.ts /api/categories/featured

​​在页面中调用​​:
// 调用以下路径的API:

$fetch('/api/products')server/api/products.ts
$fetch('/api/products/123')server/api/products/[id].ts
$fetch('/api/categories/featured')

server/api/categories/featured.ts

  1. 处理函数约定​​:

    • 每个文件必须导出 default defineEventHandler 作为请求处理函数
    • Nuxt 自动将请求路由到对应的处理程序
// server/api/products.ts 
export default defineEventHandler(async (event) => { // 所有对 /api/products 的请求都会到达这里 
})

3. 配置环境变量
# .env.production
NUXT_PUBLIC_API_BASE=https://production-api.com
API_TOKEN=your_prod_token# .env.development
NUXT_PUBLIC_API_BASE=http://localhost:3000

4,开发环境 Vite 代理配置
// nuxt.config.ts
export default defineNuxtConfig({vite: {server: {proxy: {// 开发环境代理配置'/api/': {target: process.env.NUXT_PUBLIC_API_BASE || 'http://localhost:3000',changeOrigin: true,rewrite: path => path.replace(/^\/api\//, '')}}}},// 通用配置runtimeConfig: {public: {apiBase: process.env.NUXT_PUBLIC_API_BASE}}
})

5.构建阶段工作流程详解
构建流程 (npm run generate)│├─ 1. 加载 nuxt.config.ts│     读取 runtimeConfig.public.apiBase│├─ 2. 扫描 pages/ 目录│     识别出需要使用数据的页面│├─ 3. 执行页面中的 useAsyncData/useFetch│     → 调用 /api/products│        ↓├─ 4. 路由到 server/api/products.ts│     → 使用 $fetch 访问外部 API│        ↓├─ 5. 获取数据 → 渲染页面 → 生成静态HTML│└─ 6. 输出静态文件到 .output/public
6.创建统一的 API 代理层​​:

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

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

相关文章

【AI总结】Git vs GitHub vs GitLab:深度解析三者联系与核心区别

目录1 Git&#xff1a;版本控制的核心引擎1.1 Git的核心架构与工作原理1.2 Git的工作流程与区域划分1.3 Git的核心能力2 GitHub vs GitLab&#xff1a;云端双雄的差异化定位2.1 核心定位与市场策略2.2 技术架构深度对比2.2.1 核心功能差异2.2.2 AI能力演进路线&#xff08;2025…

使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索

使用 C/Faiss 加速海量 MFCC 特征的相似性搜索 引言 在现代音频处理应用中&#xff0c;例如大规模声纹识别 (Speaker Recognition)、音乐信息检索 (Music Information Retrieval) 或音频事件检测 (Audio Event Detection)&#xff0c;我们通常需要从海量的音频库中快速找到与…

大倾斜视角航拍图像像素级定位

第一步对图像进行读取&#xff1a;研究数据集&#xff1a;在ARCGIS上观察倾斜程度&#xff1a;PIL 对路径的支持更友好&#xff1a;PIL 在处理文件路径&#xff08;尤其是包含中文字符的路径&#xff09;时通常更加健壮。OpenCV 在某些版本或特定环境下可能会对非英文路径处理不…

Redis 缓存进阶篇,缓存真实数据和缓存文件指针最佳实现?如何选择?

目录 一. 场景再现、具体分析 二. 常见实现方案及方案分析 2.1 数据库字段最大存储理论分析 2.2 最佳实践方式分析 三. 接口选择、接口分析 四. 数据库设计 4.1 接口缓存表设计 4.1.1 建表SQL 4.1.2 查询接口设计 4.2 调用日志记录表设计 4.2.1 建表SQL 4.2.2 查询…

Redis常用数据结构以及多并发场景下的使用分析:Hash类型

文章目录前言hash 对比 String简单存储对象【秒杀系统】- 商品库存管理【用户会话管理】- 分布式Session存储【信息预热】- 首页信息预热降级策略总结前言 上文我们分析了String类型 在多并发下的应用 本文该轮到 Hash了&#xff0c;期不期待 兄弟们 hhh Redis常用数据结构以…

双因子认证(2FA)是什么?从零设计一个安全的双因子登录接口

前言在信息系统逐渐走向数字化、云端化的今天&#xff0c;账号密码登录已不再是足够安全的手段。数据泄露、撞库攻击、社工手段频发&#xff0c;仅靠「你知道的密码」已不足以保证账户安全。因此&#xff0c;双因子认证&#xff08;2FA, Two-Factor Authentication&#xff09;…

stack栈练习

为了你&#xff0c;我变成狼人模样&#xff1b; 为了你&#xff0c;染上了疯狂~ 目录stack栈练习栈括号的分数单调栈模板框架小结下一个更大元素 I&#xff08;单调栈哈希&#xff09;接雨水stack栈练习 栈 一种先进后出的线性数据结构 具体用法可参考往期文章或者维基介绍i…

详细页智能解析算法:洞悉海量页面数据的核心技术

详细页智能解析算法&#xff1a;突破网页数据提取瓶颈的核心技术剖析引言&#xff1a;数字时代的数据采集革命在当今数据驱动的商业环境中&#xff0c;详细页数据已成为企业决策的黄金资源。无论是电商商品详情、金融公告还是新闻资讯&#xff0c;​​有效提取结构化信息​​直…

ubuntu环境如何安装matlab2016

一、下载安装文件&#xff08;里面包含激活包CRACK&#xff09;可从度盘下载&#xff1a;链接:https://pan.baidu.com/s/1wxmVMzXiSY4RIT0dyKkjZg?pwd26h6 复制这段内容打开「百度网盘APP 即可获取」注&#xff1a;这里面包含三个文件&#xff0c;其中ISO包含安装文件&#x…

Mybits-plus 表关联查询,嵌套查询,子查询示例演示

在 MyBatis-Plus 中实现表关联查询、嵌套查询和子查询&#xff0c;通常需要结合 XML 映射文件或 Select 注解编写自定义 SQL。以下是具体示例演示&#xff1a;示例场景 假设有两张表&#xff1a; 用户表 userCREATE TABLE user (id BIGINT PRIMARY KEY,name VARCHAR(50),age IN…

Stable Diffusion Web 环境搭建

默认你的系统Ubuntu、CUDA、Conda等都存在&#xff0c;即具备运行深度学习模型的基础环境 本人&#xff1a;Ubuntu22.04、CUDA11.8环境搭建 克隆项目并且创建环境 https://github.com/AUTOMATIC1111/stable-diffusion-webui conda create -n sd python3.10运行过程自动安装依赖…

嵌入式系统中实现串口重定向

在嵌入式系统中实现串口重定向&#xff08;将标准输出如 printf 函数输出重定向到串口&#xff09;通常有以下几种常用方法&#xff0c;下面结合具体代码示例和适用场景进行说明&#xff1a; 1. 重写 fputc 函数&#xff08;最常见、最基础的方法&#xff09; 通过重写标准库中…

static补充知识点-代码

public class Student {private static int age;//静态的变量private double score;//非静态的方法public void run(){}public static void go(){}public static void main(String[] args) {new Student().run();Student.go();} } public class Person {//2 &#xff1a; 赋初始…

使用泛型<T>,模块化,反射思想进行多表数据推送

需求&#xff1a;有13个表&#xff0c;其中一个主表和12细表&#xff0c;主表用来记录推送状态&#xff0c;细表记录12种病例的详细信息&#xff0c;现在需要把这12张病例表数据进行数据推送&#xff1b;普通方法需要写12个方法分别去推送数据然后修改状态&#xff1b;现在可以…

光流 | RAFT光流算法如何改进提升

RAFT(Recurrent All-Pairs Field Transforms)作为ECCV 2020最佳论文,已成为光流估计领域的标杆模型。其通过构建4D相关体金字塔和GRU迭代优化机制,在精度与泛化性上实现了突破。但针对其计算效率、大位移处理、跨场景泛化等问题,研究者提出了多维度改进方案,核心方向可系…

linux/ubuntu日志管理--/dev/log 的本质与作用

文章目录 **一、基本概念****二、技术细节:UNIX域套接字****三、在不同日志系统中的角色****四、应用程序如何使用 `dev/log`****五、查看和验证 `/dev/log`****六、总结 `/dev/log` 的核心作用**一、基本概念 /dev/log 是一个 UNIX域套接字(Unix Domain Socket),是Linux系…

EMC整改案例之(1):汽车NFC进入模块BCI整改

EMC整改案例(1):汽车NFC进入模块BCI整改 在汽车电子系统中,NFC(Near Field Communication)进入模块用于实现无钥匙进入功能,但它在电磁兼容(EMC)测试中常面临挑战。本案例聚焦于BCI(Bulk Current Injection)测试整改,该测试模拟大电流注入对设备的影响。以下是基于…

2025年INS SCI2区,灵活交叉变异灰狼算法GWO_C/M+集群任务调度,深度解析+性能实测

目录1.摘要2.灰狼算法GWO原理3.灵活交叉变异灰狼算法GWO_C/M4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流1.摘要 随着云计算的快速发展&#xff0c;受自然现象启发的任务调度算法逐渐成为研究的热点。灰狼算法&#xff08;GWO&#xff09;因其强大的收敛性和易于…

Java常用加密算法详解与实战代码 - 附可直接运行的测试示例

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

2025开发者工具链革命:AI赋能的效率跃迁

目录引言&#xff1a;效率焦虑下的开发者生存现状一、智能代码编辑器&#xff1a;从辅助到主导的进化1.1 GitHub Copilot&#xff1a;全能型AI助手1.2 Cursor Pro&#xff1a;极致编码体验1.3 飞算JavaAI&#xff1a;垂直领域颠覆者二、版本控制革命&#xff1a;Git的AI进化论2…