嵌套页面不使用 HOC 加载静态文件

Nested pages not loading static files using HOC

通过使用 NextJS 我遇到了静态导出命令 next build && next export 的问题。

我添加了 HOC - Layout.js 以使用导航栏和页脚包装页面。 我还有浅页 /pages/*.js 和嵌套页 /pages/products/*.js.

我的问题是 Navbar 和 Footer 中的图像只加载到浅页上,但导航到 /pages/products/test.js 会破坏图像,它们不会显示。

只有在导出和提供静态服务时才会发生这种情况 HTML。使用 npm run dev 进行开发时,所有图像都已正确加载。

components/Layout.js

const withLayout = Content => {
  return () => (
    <Container>
      <Navbar active={Content.displayName} />
      <Content />
      <Footer />
    </Container>
  );
};

export default withLayout;

pages/index.js


  // IMAGES WILL LOAD HERE (i.e. Logo in Navbar)
const Home = () => {
  render() {
    return (
      <p>Test</p>
    );
  }
}

Home.displayName = "Home";
export default withLayout(Home);

pages/products/test.js


  // IMAGES SET IN Layout.js WILL NOT BE LOADED
  // test.jpg WILL BE LOADED
const Test = () => {
  render() {
    return (
      <img src={"../../static/test.jpg"} />
    );
  }
}

Home.displayName = "Home";
export default withLayout(Test);

我通过创建并覆盖文件 ./pages/_app.js 解决了这个问题。 Layout 现在存在于那里并且不会在重定向时重新呈现。

import React from "react";
import App, { Container } from "next/app";
import Navbar from "../components/Navbar";
import Footer from "../components/Footer";

class MyApp extends App {
  static async getInitialProps({ Component, ctx }) {
    let pageProps = {};

    if (Component.getInitialProps) {
      pageProps = await Component.getInitialProps(ctx);
    }

    return { pageProps };
  }

  render() {
    const { Component, pageProps } = this.props;

    return (
      <Container>
        <Navbar active={Component.displayName} />
        <Component {...pageProps} />
        <Footer />
        <style jsx global>{`
          html,
          body,
          #__next {
            height: 100%;
            width: 100%;
            margin: 0;
            font-family: "Catamaran", sans-serif;
            overflow-x: hidden;
          }

          body {
            position: relative;
          }
        `}</style>
      </Container>
    );
  }
}

export default MyApp;