Next.js:_next/webpack-hmr 请求 404

Posted

技术标签:

【中文标题】Next.js:_next/webpack-hmr 请求 404【英文标题】:Next.js:_next/webpack-hmr request 404 【发布时间】:2019-02-11 05:03:47 【问题描述】:

本期demo repo为https://github.com/hh54188/happy-server/tree/issue-demo

我尝试将 Next.js 与 Hapi.js 作为插件集成。这是我的 next.js 插件项目文件夹主要结构:

--plugins
   |--app
        |--pages
            |--app
                |--a.js
        |--handlers
        |--public
             |--dist
        |--index.js
        |--next.config.js

这里是 index.js 的主要内容,主要用于路由注册

const nextRenderService = next(
  dir: path.join(__dirname)
);

module.exports = 
  name: "AppService",
  version: "0.0.1",
  register: async function(server, options) 
    await nextRenderService.prepare();

    server.route(
      method: "GET",
      path: `/app/$assetPrefix/_next/webpack-hmr`,
      handler: nextHandlerWrapper(nextRenderService)
    );

    server.route(
      method: "GET",
      path: "/app/param*",
      handler: defaultHandler(nextRenderService)
    );

    server.route(
      method: "GET",
      path: `/app/$assetPrefix/_next/on-demand-entries-ping`,
      handler: nextHandlerWrapper(nextRenderService)
    );

    server.route(
      method: "GET",
      path: `/app/$assetPrefix/_next/-/page/param*`,
      handler: 
        directory: 
          path: path.join(__dirname, pagesPath),
          listing: true
        
      
    );

    server.route(
      method: "GET",
      path: `/app/$assetPrefix/_next/param*`,
      handler: 
        directory: 
          path: path.join(__dirname, distPath),
          listing: true
        
      
    );
  
;

但是,当我运行服务器并访问http://127.0.0.1:4000/app/a 时,页面可以渲染成功,并且大多数脚本文件都可以加载成功。但是_next/webpack-hmr_next/on-demand-entries-ping 的请求状态是404。我注意到 404 状态来自 Next.js,而不是 Hapi.js

那么我的代码有什么问题?我该如何解决这个问题?

【问题讨论】:

为什么要处理下一个请求?您只需要定义应用程序的路由,所有 else 请求都必须由 next.js 默认处理程序处理。 【参考方案1】:

assetPrefix 配置仅用于使用 CDN,对 NextJs (documentation) 是全局的。您不想将其设置为其他内容,例如修改 NextJs 路由器路径。如果您不打算使用 CDN,请忽略此设置。

// in constants/index.js
const assetPrefix = process.env.NODE_ENV === "production" 
    ? "https://cdn.mydomain.com" 
    : "";

您也不想列出所有 NextJs 内部路由并使用 NextJs 请求处理程序来处理所有调用:

// index.js
const next = require("next");
const path = require("path");

const nextRenderService = next(
  dir: path.join(__dirname),
  dev: process.env.NODE_ENV !== "production"
);

const  defaultHandler, nextHandlerWrapper  = require("./hanlders");

module.exports = 
  name: "AppService",
  version: "0.0.1",
  register: async function(server, options) 
    // https://github.com/zeit/next.js/blob/master/examples/custom-server-hapi/server.js
    await nextRenderService.prepare();

    // handle NextJs application requests
    const handler = nextRenderService.getRequestHandler();
    server.route(
      method: "GET",
      path: "/app/p*",
      handler: async ( raw, url , h) => 
        await handler(raw.req, raw.res, url);
        return h.close;
      
    );

    // handle NextJs private routes
    server.route(
      method: "GET",
      path: "/_next/p*" /* next specific routes */,
      handler: nextHandlerWrapper(nextRenderService)
    );

    // Other routes
    server.route(
      method: "GET",
      path: "/p*" /* catch all route */,
      handler: defaultHandler(nextRenderService)
    );
  
;

【讨论】:

但是,我想在单个 Hapi.js 服务器上运行多个 next.js 实例。所以我必须在_next/ 中添加一些前缀来区分来自不同Next.js 实例的_next 请求 好吧,我不明白。那么你应该使用 2 个单独的服务器。【参考方案2】:

在升级 nextjs 11 > 12 之后就出现了这个问题。

这对我有帮助:

npm install webpack-dev-server -g

来源:https://***.com/a/31627310/

【讨论】:

以上是关于Next.js:_next/webpack-hmr 请求 404的主要内容,如果未能解决你的问题,请参考以下文章

页面加载时与 _next/webpack-hmr 的连接中断

Next.js:如何在特定页面上更改根 div __next 的 css?

在 Next.js 中,为啥要静态渲染? _document.js 包括 getInitialProps

Next.js 不会在 _app.tsx 中传递用户属性

Next.js - 页面没有让 GetServerSideProps 进入页面组件道具(使用自定义 _app.js)

如何在 Next.js 中将路径名从 _document 传递到 _app