Как исправить Uncaught DOMException: не удалось выполнить «pushState» в «Истории»

У меня есть это маленькое приложение, которое отлично работает в режиме разработки с webpack-dev-server, но когда я использую связанные файлы из папки dist, созданные в рабочем режиме, все, что я получаю в браузере, это эта ошибка:

Uncaught DOMException: Failed to execute 'pushState' on 'History': A history state object with URL 'file:///C:/' cannot be created in a document with origin 'null' and URL 'file:///C:/Users/cristi/work/react_test_ground/dist/index.html'.

Как я могу решить эту проблему с pushState?

Сначала я пытался разделить код с помощью React.lazy и Suspense, так как webpack выдавал эту ошибку:

WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
This can impact web performance.
Assets:
  2c7b7b6becb423b8f2ae.bundle.js (413 KiB)

WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
Entrypoints:
  main (413 KiB)
      2c7b7b6becb423b8f2ae.bundle.js


WARNING in webpack performance recommendations:
You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of
your application.

Но проблема сохраняется.

Вы можете увидеть код и полный репозиторий здесь: https://github.com/cristiAndreiTarasi/temporary

App.js

import React, { Fragment, Suspense, lazy } from 'react';
import { BrowserRouter, Route, Link, Switch } from 'react-router-dom';

const Home = lazy(() => import('./Home'));
const Blog = lazy(() => import('./Blog'));
const Contact = lazy(() => import('./Contact'));

export default () => (
    <BrowserRouter>
        <div>
            <ul>
                <li><Link to='/'>Home</Link></li>
                <li><Link to='/blog'>Blog</Link></li>
                <li><Link to='/contact'>Contact</Link></li>
            </ul>

            <Suspense fallback = {<p>Loading...</p>}>
                <Switch>
                    <Route exact path='/' component = {Home} />
                    <Route path='/blog' component = {Blog} />
                    <Route path='/contact' component = {Contact} />
                </Switch>
            </Suspense>
        </div>
    </BrowserRouter>   
);

Формат других компонентов таков:

import React from 'react';

export default () => (
    <div>
        <h1>Hello from the Blog</h1>
        <img src='../images/landscape-art_large.jpg' />
    </div>
);

Я хочу получить тот же результат, что и в режиме разработки, из связанных файлов, созданных в режиме производства.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
11
0
17 816
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы должны открывать свои файлы через веб-сервер. Поскольку вы не можете изменить историю местоположений в файле://api.

Мне удалось заставить его работать с XAMPP на локальном хосте, но после того, как я загрузил те же файлы на public_html с помощью FileZilla, у меня возникла та же проблема. Есть ли у вас какие-либо предложения о том, как я могу заставить его работать на моем веб-сайте портфолио на сервере хостинг-провайдера? Я с JustHost. Спасибо.

Tarasi Cristi Andrei 29.04.2019 22:07

Вы открывали страницу по протоколу ftp://? Потому что вы должны открыть страницу напрямую. http://пример.tld

Nicolai Kamphenkel 01.05.2019 04:14

Вы можете использовать HashRouter или ПамятьМаршрутизатор вместо BrowserRouter.

Просто замените эту строку:

import { BrowserRouter, Route, Link, Switch } from 'react-router-dom';

с участием:

import { HashRouter, Route, Link, Switch } from 'react-router-dom';

или с:

import { MemoryRouter, Route, Link, Switch } from 'react-router-dom';

Затем откройте в браузере созданный вами файл index.html, и все должно работать, как при использовании сервера localhost/dev.

У меня была эта ошибка (независимо от моего приложения для реагирования), потому что я предоставил вместо searchParams URL, я поместил весь URL-адрес в history.pushState http://localhost:9090/admin/model-type?PageNumber=2 но поисковый запрос ожидается ?PageNumber=2

history.pushState(
        {[paramKey]: paramValue},
        'page title',
        url
      )

Это сработало для меня и имеет большой смысл, если подумать

joehanna 21.11.2021 23:30

Другие вопросы по теме