ValidationError:无效的配置对象。 Webpack 已使用与 API 架构不匹配的配置对象进行初始化。 Next.js

Posted

技术标签:

【中文标题】ValidationError:无效的配置对象。 Webpack 已使用与 API 架构不匹配的配置对象进行初始化。 Next.js【英文标题】:ValidationError: Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. Next.js 【发布时间】:2021-09-03 09:20:14 【问题描述】:

我使用create-next-app 创建了我的 next.js 项目样板。但是一旦我运行npm run dev 我就会得到错误:

ValidationError: Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema.
 - configuration[0].node should be one of these:
   false | object  __dirname?, __filename?, global? 
   -> Include polyfills or mocks for various node stuff.
   Details:
    * configuration[0].node has an unknown property 'fs'. These properties are valid:
      object  __dirname?, __filename?, global? 
      -> Options object for node compatibility features.
    * configuration[0].node has an unknown property 'devServer'. These properties are valid:
      object  __dirname?, __filename?, global? 
      -> Options object for node compatibility features.
 - configuration[1].node should be one of these:
   false | object  __dirname?, __filename?, global? 
   -> Include polyfills or mocks for various node stuff.
   Details:
    * configuration[1].node has an unknown property 'fs'. These properties are valid:
      object  __dirname?, __filename?, global? 
      -> Options object for node compatibility features.
    * configuration[1].node has an unknown property 'devServer'. These properties are valid:
      object  __dirname?, __filename?, global? 
      -> Options object for node compatibility features.
    at validate (C:\Users\crisp\OneDrive\Documents\Next.js\next-startup\nextflix\node_modules\next\dist\compiled\schema-utils3\index.js:1:153657)
    at validateSchema (C:\Users\crisp\OneDrive\Documents\Next.js\next-startup\nextflix\node_modules\next\dist\compiled\webpack\bundle5.js:137945:2)
    at create (C:\Users\crisp\OneDrive\Documents\Next.js\next-startup\nextflix\node_modules\next\dist\compiled\webpack\bundle5.js:141384:24)
    at webpack (C:\Users\crisp\OneDrive\Documents\Next.js\next-startup\nextflix\node_modules\next\dist\compiled\webpack\bundle5.js:141426:32)
    at f (C:\Users\crisp\OneDrive\Documents\Next.js\next-startup\nextflix\node_modules\next\dist\compiled\webpack\bundle5.js:98978:16)
    at HotReloader.start (C:\Users\crisp\OneDrive\Documents\Next.js\next-startup\nextflix\node_modules\next\dist\server\hot-reloader.js:18:415)
    at async DevServer.prepare (C:\Users\crisp\OneDrive\Documents\Next.js\next-startup\nextflix\node_modules\next\dist\server\next-dev-server.js:16:453)
    at async C:\Users\crisp\OneDrive\Documents\Next.js\next-startup\nextflix\node_modules\next\dist\cli\next-dev.js:22:1 
  errors: [
    
      keyword: 'anyOf',
      dataPath: '[0].node',
      schemaPath: '#/anyOf',
      params: ,
      message: 'should match some schema in anyOf',
      schema: [Array],
      parentSchema: [Object],
      data: [Object],
      children: [Array]
.....

我的next.config.js 如下所示。

module.exports = 
  webpack: (config) => 
    config.node = 
      fs: 'empty'
    
    return config
  
;

什么都没有改变。这是默认设置。请您解释一下为什么会出现此错误。

任何帮助输入将不胜感激。

【问题讨论】:

【参考方案1】:

您正在运行 webpack 5、which only supports__dirname__filenameglobal

您的配置假定使用 webpack 4,它支持更多属性 including Node core libraries。

您需要选择要运行的 webpack 版本并确保您的配置匹配。

【讨论】:

感谢您的回答,它给了我明确的提示。但是我找不到配置 webpack 5 的方法,如果你可以请发布与 webpack 5 一起使用的next.config.js【参考方案2】:

JDB 的回答之后,我有了明确的提示。在阅读了this 之后,我将我的next.js 应用程序配置为使用webpack4。这是我的新next.cofig.js

module.exports = 
  webpack5: false,
  webpack: (config) => 
    config.node = 
      dns: "mock",
      fs: "empty",
      path: true,
      url: false,
    ;
    return config;
  ,
;

【讨论】:

【参考方案3】:

Next.js has now webpack-5 enabled by default.

如果您不想切换回webpack-4(对于obvious reasons),您的配置应如下所示:

module.exports = 
  webpack: (config,  isServer ) => 
    if (!isServer) config.resolve.fallback.fs = false;
    return config;
  
;

我看到你发布的答案,你也在配置pathurl。但是您实际上不需要手动配置它们,因为 Next.js 会为您处理。

对于dns,你可以这样做:

module.exports = 
  webpack: (config,  isServer ) => 
    if (!isServer) 
      const fallback = config.resolve.fallback;
      fallback.fs = false;

      fallback.dns = function () 
        if (!arguments.length) return;
        const callback = arguments[arguments.length - 1];
        if (callback && typeof callback === 'function') callback(null, '0.0.0.0');
      ;
      // or after installing `node-libs-browser`
      // fallback.dns = require.resolve('node-libs-browser/dns');
    
    return config;
  ,
;

参考:

To v5 from v4 | webpack

Automatic Node.js Polyfills Removed

resolve.fallback

next/build/webpack-config.ts

Webpack 5 Adoption

【讨论】:

它没有用。不过谢谢你的回答【参考方案4】:

您能否检查 Nextjs 11 上的任何依赖项是否需要更新。 在我的情况下,将next-transpile-modules 更新为版本:^8.0.0 解决了这个问题。

【讨论】:

【参考方案5】:

只需更新节点版本。当我尝试创建一个新的 next.js 应用程序时,我也收到了这个错误。我安装了节点版本 14.16,但 Next 似乎需要 ^14.17.0。更新到 14.18.0 后,我创建了一个新的下一个应用程序,它使用默认的 next.config 文件运行良好。

【讨论】:

以上是关于ValidationError:无效的配置对象。 Webpack 已使用与 API 架构不匹配的配置对象进行初始化。 Next.js的主要内容,如果未能解决你的问题,请参考以下文章

ValidationError:无效的选项对象。已使用与 API 架构不匹配的选项对象初始化开发中间件

django.core.exceptions.ValidationError: [u"'' 值无效

Vue 3 和 Vuetify 3 Alpha:ValidationError:进度插件无效选项

Django绑定表单无效,但未引发ValidationError

Mac连接以太网 报无效的服务器地址 BasicIPv6ValidationError

Mac连接以太网 报无效的服务器地址 BasicIPv6ValidationError