无法在customAxios.js导入Redux Store,出现初始化前访问错误
解决Redux Store导入到customAxios时的"Cannot access 'WEBPACK_DEFAULT_EXPORT' before initialization"错误
这是循环导入导致的问题:你的store.js(或其依赖的rootReducer内的切片)间接导入了customAxios.js,而customAxios.js又直接导入store.js,导致模块初始化顺序混乱,Webpack无法正确解析导出项。
推荐解决方案:延迟设置Axios拦截器
不要在模块顶部直接导入store,而是将拦截器逻辑封装成函数,在Store初始化完成后再执行:
修改customAxios.js
import axios from "axios"; import { BASE_URL } from "./apiUrls"; export const customAxios = axios.create({ baseURL: BASE_URL }); // 封装拦截器设置函数,接收store作为参数 export const setupAxiosInterceptors = (store) => { customAxios.interceptors.request.use((config) => { // 根据你的Redux state结构调整token的获取路径 const token = store.getState().auth.token; if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }); };
在index.js中初始化拦截器
import { createRoot } from "react-dom/client"; import App from "./App"; import { Provider } from "react-redux"; import { BrowserRouter } from "react-router-dom"; import store from "./redux/store"; import { setupAxiosInterceptors } from "./customAxios"; // 先完成store初始化,再设置Axios拦截器 setupAxiosInterceptors(store); const rootElement = document.getElementById("root"); const root = createRoot(rootElement); root.render( <Provider store={store}> <BrowserRouter> <App /> </BrowserRouter> </Provider> );
备选方案:消除循环依赖
如果你的rootReducer内的切片(如auth切片)导入了customAxios做API请求,会形成store.js→rootReducer→切片文件→customAxios.js→store.js的循环链。
可以通过以下方式解决:
- 将API请求逻辑从切片中抽离,避免切片直接依赖
customAxios - 使用Redux Toolkit的RTK Query(推荐),它会自动处理请求头,无需手动维护Axios实例:
之后将该API切片加入Store的reducer即可。import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; import { BASE_URL } from './apiUrls'; export const apiSlice = createApi({ reducerPath: 'api', baseQuery: fetchBaseQuery({ baseUrl: BASE_URL, prepareHeaders: (headers, { getState }) => { const token = getState().auth.token; if (token) { headers.set('Authorization', `Bearer ${token}`); } return headers; }, }), endpoints: (builder) => ({ // 定义你的API端点 }), });
内容的提问来源于stack exchange,提问作者Abdus Samad 03
相关产品推荐
相关产品推荐

