1. 程式人生 > >React專案 fetch 本地json檔案 404問題

React專案 fetch 本地json檔案 404問題

  今天在搞專案的時候,想要在React專案中fetch本地的json檔案卻一直報404

  網上的解決方案,差不多說地址都是相對於首頁index.html而言,所以將json資料放在相對index.html上就好了。

  可是鼓搗了個把小時還是沒有解決問題。據我觀察,網上的解決方案都是基於 create-react-app 的專案,而我的專案是自己整合的環境。

  為了驗證網上的解決方案的可行性,不多說新建一個 create-react-app 構建的demo開擼~

####create-react-app 專案
APP.js 中 加入 fetch 的函式,比如就放在 componentWillMount

這個函式裡好了

  componentWillMount = () => {
    fetch("./data.json")
     .then(res => res.json())
     .then(json => console.log(json))
  }

然後,在 public 資料夾下,新建一個 data.json 檔案看看能不能取到資料。

{
  "test1": 1,
  "test2": 2,
  "test3": 3
}

重新整理下頁面,發現很輕鬆地就取到了資料,證明網上的解決方案都靠譜,不過都是基於 create-react-app 這個腳手架構建的專案是這樣引的。

這裡寫圖片描述

檔案路徑是這樣的:

####尋找原因
為什麼我自己整合的環境會遇到BUG呢?好吧,直接忽略找的過程(雖然確實鼓搗了好久,還把專案移植到了 create-react-app 環境下),Webpack 中的 devServer 配置項就是引起這一切問題的原因,它的功能大概是這樣:

  • 在開發環境下,DevServer 提供虛擬伺服器,讓我們進行開發和除錯;
  • 提供實時重新載入。簡直美滋滋。大大減少開發時間。

然而罪魁禍首是 contentBase 這個屬性。(有興趣的可以去了解,我這裡給出BUG解決方案)

####解決方案
webpack.config.js 中(或者是 webpack.dev.config.js

之類的,package.json start 命令跑的是什麼檔案就是哪個)

const path = require("path")
module.exports = {
    //其他配置不寫了
    ...,
    devServer: {
        contentBase: path.join(__dirname, 'public')
    }
}

然後再新建 public 資料夾,在把 json 檔案和 index.html(因為它也是靜態檔案)都丟進去,最後終於拿到了我想要的資料~

####再看 create-react-app
  那麼 create-react-app 肯定也在哪裡設定了 contentBase 這個屬性。

  在 package.json 中,我們發現在 create-react-app 構建的專案 npm start,跑的是 react-scripts start,在 node_modules 資料夾中找到 react-scripts 資料夾,在裡面搜尋 contentBase 屬性,果然我們在 react-scripts/config/webpackDevServer.config.js 檔案中找到了

contentBase: paths.appPublic

  paths.appPublic 是在別處的封裝,但我們可以知道就是這條配置起的作用。

  那麼,之前網上找的答案給出的結論也是片面的,檔案不是關於 index.html 的相對位置,是對於 public 資料夾的相對位置,並且只能讀取 public 資料夾中的靜態檔案,所以對於 public 的同級上級是取不到的,就把靜態檔案放到 public 資料夾中吧,這也是一個很好的編碼規範。

相關推薦

React專案 fetch 本地json檔案 404問題

  今天在搞專案的時候,想要在React專案中fetch本地的json檔案卻一直報404。   網上的解決方案,差不多說地址都是相對於首頁index.html而言,所以將json資料放在相對index.html上就好了。   可是鼓搗了個把小時還是沒有解決問題。

React-Native 訪問本地 json 檔案微技巧

一、使用場景 相信大多開發人員平時私下裡也做一些自己的專案或者練習的 demo,有時候要用到網路資料,但是,對於像我這樣不太懂後臺的開發,同時又懶得搭建 TomCat 的人,絕殺技無非就是在本地建立一個 json 檔案,然後在訪問網路的時候 URL 寫

VUE小專案問題之用axios外掛取本地json檔案,報404錯誤。

一、問題 在用axios獲取本地json資料時,總是報404錯誤。 百思不得其解。 二、經過 看網友們都是把本地json檔案放在static檔案中。 我寫的專案存放在assets中,恍然大悟,應該是檔案位置。 三、結果 檔案改存為static axios({

HTML5實現本地JSON檔案的讀寫

參考: 使用HTML5來實現本地檔案讀取和寫入  (FileReader讀取json檔案,FileSaver.js儲存json檔案) w3school <input>標籤   FileReader WebAPI介面 FileSaver.js下載地址 File

vue使用本地json檔案資料

static目錄中新增res目錄, res目錄中放入json檔案 vue檔案的mount或其他函式中呼叫axios.get this.axios.get( 'static/res/address.json' ).then(res=>{ con

載入本地json檔案,並利用批處理呼叫Chrome顯示html

載入本地json檔案 1.載入本地json檔案 為了除錯儲存在本地的json資料,需要進行讀入。一般使用jQuery來進行,但需要對瀏覽器進行一點設定。 Chrome瀏覽器中有一個啟動選項--allow-file-access-from-files,在啟動的時候需要設定一下。

react 使用fetch 上傳檔案 寫法

第一,使用原生input的type=”file” <input type="file" name="file" onChange={this.onChange} style={{display:'none'}} ref={this.inputRef}/> 第二, 用它的o

谷歌通過ajax獲取本地JSON檔案,為什麼會提示跨域?(轉載)

  https://blog.csdn.net/jiaoshuaiai/article/details/78417683 在本地寫了一段JSON程式碼,然後用ajax讀取後,在瀏覽器開啟,發現谷歌提示涉及到跨域問題, 但是跨域是由於協議,域名,埠中有一個不同,才會跨域,我在本地訪問自己的檔

js讀取本地json檔案

js程式碼: // 獲取api的ip部分             var mJson=$.ajax({url:"api.json",async:false});      

通過http服務請求本地json檔案

<!DOCTYPE html> <html>     <!--         數量的加減  給一個ng-model就可以了        -->

chrome非同步載入本地json檔案報錯:cross origin request are only supported for HTTP

定義了一個data.json檔案儲存學生相關資訊,在index.html中想通過$.getJSON("data.json" , function(data){...})方法獲取並顯示json檔案中的內容。 結果執行後chrome報錯如下:Cross origin reque

jquery通過ajax方法獲取本地json檔案不執行success回撥

//a.json { list:{ createtime:"2018/11/05 16:45:22", status: 0, name: "aa", price: "188.00", num: "2", img: "1.jpg" } }

React Native 之讀取JSON 檔案

一:建立json 檔案  放在  ./data/目錄下 {     "employees": [         {             "FamilyName": "張",             "giveName": "三",             "salar

谷歌通過ajax獲取本地JSON檔案,為什麼會提示跨域?

在本地寫了一段JSON程式碼,然後用ajax讀取後,在瀏覽器開啟,發現谷歌提示涉及到跨域問題, 但是跨域是由於協議,域名,埠中有一個不同,才會跨域,我在本地訪問自己的檔案,怎麼和跨域扯上關係了?? 下

jquary訪問本地json檔案之報跨域問題

小夥伴們在瞭解jquary時,想用ajax訪問本地的json檔案,常常會報 Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension,

解析本地json檔案,模擬網路請求

/** * Demo class * * @author yyd * @date 2017/11/15 */ public class ParseLocalJsonUtil { /** * 從asset路徑下讀取對應檔案轉String輸出 * <p&

android 之 讀取本地json檔案返回string

public static String getJson(String fileName, Context context){ StringBuilder stringBuilder

Springboot 讀取專案下的Json檔案成物件

文章目錄 Springboot 讀取專案下的Json檔案成物件 1、建立Json檔案 2、建立讀取工具類 3、讀取 4、輸出

31.Elasticsearch批量匯入本地Json檔案Java實現(ES檔案同步)

題記產品開發需要,我們需要將網際網路採集的資料儲存到ES中,以實現資料的全文檢索。網際網路採集的資料,往往格式雜亂,需要先進行資料清洗操作。而ES支援的入庫格式,json格式資料會相對方便些。本文主要介紹,如何將格式化的Json檔案批量插入到ES中。1、需提前做的工作1)設計

flutter讀取專案中的json檔案資料

前言 網上有很多讀取的,但對於小白的我來說(剛接觸flutter一週,dart完全不懂),從專案中讀取 xxx.json檔案,並將檔案中的json內容轉換為string物件是困難的,話不多說直接上程式碼 環境準備 由於我是在自己專案中實現的,有環境,及依賴需要引入,就全部都貼出來