React-router在刷新时不为嵌套页面加载css

Posted

技术标签:

【中文标题】React-router在刷新时不为嵌套页面加载css【英文标题】:React-router not loading css for nested pages on refresh 【发布时间】:2017-03-18 11:37:44 【问题描述】:

我正在尝试为我的第一个 React webapp 设置 react-router,它似乎可以正常工作,只是刷新页面时我的嵌套页面没有加载 css。

但是它只适用于一个级别,例如/dashboard,但 /components/timer 的 css 不会加载

这是我的index.jsx 文件的样子

import './assets/plugins/morris/morris.css';
import './assets/css/bootstrap.min.css';
import './assets/css/core.css';
import './assets/css/components.css';
import './assets/css/icons.css';
import './assets/css/pages.css';
import './assets/css/menu.css';
import './assets/css/responsive.css';

render(
  <Router history=browserHistory>
    <Route path="/" component=Dashboard/>
    <Route path="/components/:name" component=WidgetComponent/>
    <Route path="*" component=Dashboard/>
  </Router>,
  document.getElementById('root')
);

知道为什么吗?

【问题讨论】:

当您重新加载时,这些 .css 文件是否会出现 404 错误?您的 Web 服务器是否将所有 //components/:name 指向您加载 react 和所有相关文件的 index.js? @JorgeObregon 得到 404,它尝试将 css 和脚本加载为 http://localhost:3000/components/assets/js/jquery.slimscroll.js 而不是 http://localhost:3000/assets/js/jquery.slimscroll.js @JorgeObregon 如何将我的网络服务器指向/components/:name 这取决于您使用的网络服务器。 Apache 使用 .htaccess 文件来获得漂亮的链接,而 ExpressJS 使用 RegExp 来匹配您的路线 @AdetiloyePhilipKehinde 你是怎么解决这个问题的? 【参考方案1】:

我知道这很奇怪,但是如果您使用 history@5.0.0 ,请将其删除并安装 history@4.10.1 react-router 与历史版本 5 有许多不兼容之处。 对我来说它有效。

【讨论】:

【参考方案2】:

最简单的解决方案在这里(只需要更改 index.html

只需在每个 CSS 或 JS 文件之前使用%PUBLIC_URL%

如果您通过create-react-app 创建了react 应用程序,您可以在index.html 文件中查看%PUBLIC_URL% 的示例。

<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">

有一点是必须的:你的 CSS 文件和 js 文件应该在公共目录下。

【讨论】:

【参考方案3】:

我加了

<base href="/" /> <!-- for local host -->

到我的 index.html 头

它已经解决了。

【讨论】:

【参考方案4】:

我知道它有点旧线程,但我在这里分享我的解决方案。它是使用webpack 而不是create-react-app 的设置解决方案。

我发现所有其他解决方案都建议更改 html 文件中的 &lt;link 路径。但就像我的情况一样,webpack 处理资产链接。

我今天遇到了同样的问题。像/some_route 这样的路由可以工作,但 - /some_route/second_level 不能,在控制台中留下一条消息说明 -

Refused to apply style from 'http://localhost:8080/some_route/some_style.css'

我通过更新我的 webpack.config.js 文件解决了这个问题

output: 
    filename: 'build.js',
    path: path.join(__dirname, '/dist'),
    publicPath: '/',         ////// <-- By adding this line

希望它可以帮助某人。谢谢!

【讨论】:

我没有看到 webpack,config.js 抱歉,这是webpack.config.jsoutput 配置部分。 webpack.config.js 的其余部分不是主题【参考方案5】:

如果您使用的是 create-react-app 工作流程,请将资产放在 public 文件夹下并使用特殊变量 PUBLIC_URL。

在 index.html 中使用 %PUBLIC_URL%:

&lt;link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico"&gt;

在 JS/JSX 文件中使用 process.env.PUBLIC_URL:

render() // Note: this is an escape hatch and should be used sparingly! // Normally we recommend using import for getting asset URLs // as described in “Adding Images and Fonts” above this section. return <img src=process.env.PUBLIC_URL + '/img/logo.png' />;

推荐方法: 通过将其与 src 文件放在一起,从 javascript 中导入样式表、图像和字体。

import React from 'react';
import logo from './logo.png'; // Tell Webpack this JS file uses this image

console.log(logo); // /logo.84287d09.png

function Header() 
   // Import result is the URL of your image
   return <img src=logo  />;


export default Header;

Adding assets to public folder

When to use public folder

【讨论】:

【参考方案6】:

我也遇到了这个问题,我的应用没有加载样式表等。但是,我将我的资产直接导入到我的 index.html 入口点。

通过将链接替换为this documentation 中的绝对路径,我的问题得到了解决。

对我来说,这意味着改变

<head>
    <link rel="stylesheet" href="./style.css" ></link>
</head>

到这里:

<head>
    <link rel="stylesheet" href="/style.css" ></link>
</head>

我不确定同样的方法是否适用于您的导入语句,但值得一试。

仅供参考,我正在使用来自 create-react-app 的项目布局。

【讨论】:

感谢 sonarforte,对于那些使用带有 html webpack plugin 的 Webpack 来生成 index.html 文件的人,我能够通过告诉 Webpack 在我的配置文件中放置输出文件的位置来解决这个问题。该对象看起来像这样:output: publicPath: "/" 为我工作!这一切都是为了删除路径前的点......【参考方案7】:

找到了!

添加 HTML 元素:

<base href="/" /> <!-- for local host -->

到您的索引页面为您的 URL 设置基本情况,以便其他所有内容都遵循。

【讨论】:

截至 2020 年 10 月为我工作 nextjs 或任何文件夹结构架构的完美解决方案【参考方案8】:

由于 404 错误,您的脚本未加载您的 CSS。您的网络服务器没有将所有 /components/* 请求重定向到索引文件,然后通过反应路由到您的视图。

但是现在,特别是关于解决您的 css 问题...过去,我一直在为 jsx 文件中的 css 导入而苦苦挣扎,所以您并不孤单 :) 相反,我选择使用 SASS 或 LESS使用 grunt 或 gulp 将我的 css 编译为 bundle.css 文件。然后将bundle.css 直接加载到我的index.html 文件中。使用 css 编译器的一个巧妙技巧是,每次您更改 .scss 或 .less 文件时,您的 bundle.css 都会更新。

希望我为您指明了正确的方向。

干杯,

【讨论】:

感谢 Jorge,但加载 bundle.css 并不能解决网络服务器没有将 /components/* 重定向到索引文件的问题?

以上是关于React-router在刷新时不为嵌套页面加载css的主要内容,如果未能解决你的问题,请参考以下文章

react-router browserHistory刷新页面404问题解决方法

带有 BrowserRouter / browserHistory 的 React-router 在刷新时不起作用

带有 BrowserRouter / browserHistory 的 React-router 在刷新时不起作用

页面在刷新时不加载 - react-router-dom

Rails:嵌套的远程表单在页面加载时不起作用

YDN-DB - 删除数据库,然后在页面加载/重新加载时重新创建和加载,但在刷新时不加载