如何在现代前端项目中正确加载本地 JSON 文件(React/Vite 环境)

浅枫酱_5050

浅枫酱_5050

2026-09-09

326人浏览

原创

如何在现代前端项目中正确加载本地 JSON 文件(React/Vite 环境)

本文详解在 React(尤其是 Vite 构建环境)中通过 fetch() 加载本地 JSON 文件的完整方案,涵盖路径配置、public 目录规范、构建行为适配及常见 404/CORS 错误的根源与解决方法。

本文详解在 react(尤其是 vite 构建环境)中通过 fetch() 加载本地 json 文件的完整方案,涵盖路径配置、public 目录规范、构建行为适配及常见 404/cors 错误的根源与解决方法。

在现代前端开发中,直接使用 fetch('./assets/stationData.json') 或 fetch('../assets/stationData.json') 加载本地 JSON 文件失败,是高频痛点。从你提供的文件结构图和错误截图可见:浏览器实际发起请求的 URL 是类似 http://localhost:5173/assets/stationData.json,但该路径返回 404 —— 这并非代码写错,而是构建工具对静态资源的处理逻辑与开发者预期存在偏差。

✅ 正确做法:将 JSON 文件置于 public/ 目录下

Vite(及 Create React App、Webpack DevServer)约定:public/ 目录下的所有文件会原样复制到构建输出根目录(如 dist/)中,且可通过绝对路径直接访问,无需模块导入或打包处理。这是专为“运行时需动态读取、又不希望被编译/哈希/内联”的静态资源(如 JSON 配置、图标、robots.txt)设计的机制。

✅ 正确操作步骤:

  1. 将 stationData.json 移至项目根目录下的 public/ 文件夹中(例如:public/assets/stationData.json);
  2. 在 React 组件中使用 以 / 开头的绝对路径(相对于站点根目录)发起请求:
import { useEffect } from 'react';

const ExploreRivers = () => {
  useEffect(() => {
    // ✅ 正确:路径以 / 开头,对应 public/ 下的子路径
    fetch('/assets/stationData.json')
      .then((response) => {
        if (!response.ok) {
          throw new Error(`HTTP ${response.status}: ${response.statusText}`);
        }
        return response.json();
      })
      .then((data) => {
        console.log('Loaded stations:', data); // data 是解析后的数组
      })
      .catch((err) => {
        console.error('Failed to load station data:', err);
      });
  }, []);

  return <div>Exploring rivers...</div>;
};

export default ExploreRivers;

? 关键说明:/assets/stationData.json 中的 / 表示从 Web 服务器根路径开始查找,Vite 开发服务器会自动将 public/assets/ 映射至此路径,生产构建后也保持相同语义。

Dagre React Flow
Dagre React Flow

使用 dagre 与 React Flow (@xyflow/react) 实现自动图布局。适用于自动布局、层级布局、树形结构或节点排列等场景。

下载

⚠️ 为什么相对路径 ../assets/... 会失败?

  • fetch('../assets/stationData.json') 的解析基于当前 HTML 页面的 URL 路径,而非源码文件位置;
  • 在 Vite 中,你的组件通常由 src/ 下的 .tsx 文件编写,但最终渲染的 HTML 是 index.html(位于 public/ 或由 Vite 自动生成),其 URL 是 http://localhost:5173/;
  • 因此 ../assets/... 实际尝试请求的是 http://localhost:5173/assets/... —— 若 assets/ 不在 public/ 内,则必然 404;
  • 更重要的是:src/assets/ 下的 JSON 不会自动暴露为可被 fetch 访问的 HTTP 资源,它仅在构建时可能被当作模块导入(如 import data from '@/assets/stationData.json'),但该方式会在构建时将 JSON 内容硬编码进 JS 包,失去运行时更新能力。

?️ 进阶:自定义 Vite 的静态资源基础路径(可选)

若项目需部署到子路径(如 https://example.com/my-app/),需配置 Vite 的 base 选项(vite.config.ts):

export default defineConfig({
  base: '/my-app/', // 所有静态资源路径前缀
  // ...
});

此时 fetch('/assets/stationData.json') 将请求 https://example.com/my-app/assets/stationData.json,确保前后端路径一致。

? 注意事项与最佳实践

  • JSON 格式必须严格合法:禁止尾随逗号、单引号、注释;推荐用 VS Code 安装 “JSON Tools” 插件校验;
  • 编码必须为 UTF-8 无 BOM:BOM 字符会导致 Unexpected token 解析错误;
  • 避免 file:// 协议直接双击打开 HTML:这会触发浏览器 CORS 策略,fetch 必然失败;务必使用 vite dev 或 Live Server 启动 HTTP 服务;
  • 生产环境验证:运行 npm run build && npm run preview,确认 dist/assets/stationData.json 存在且可通过 http://localhost:4173/assets/stationData.json 直接访问;
  • 替代方案对比:
    • ✅ public/ + fetch():适合需运行时更新、体积较大、非敏感配置类 JSON;
    • ⚠️ import data from './assets/data.json':适合小而固定的数据,构建时内联,无法热更新;
    • ❌ fs.readFile / Node.js API:浏览器环境不可用,仅限服务端。

遵循以上方案,你的 stationData.json 将稳定、可靠、跨环境地被 React 组件加载,彻底规避路径 404 与协议限制问题。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

react js 前端 json vite

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2303

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4943

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6030

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5538

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

783

5

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

4566

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1129

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

4484

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

900

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 12.1万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习