Search code examples
reactjsnext.jsantdreact-dom

How to configure nextjs 9 and ant design less compatibility?


After upgrading react,react-dom and nextjs this error happens :

Build error occurred /home/lenovo/.../node_modules/antd/lib/style/index.css:7 body { ^

SyntaxError: Unexpected token { at Module._compile (internal/modules/cjs/loader.js:720:22)

at Object.Module._extensions..js (internal/modules/cjs/loader.js:788:10) at Module.load (internal/modules/cjs/loader.js:643:32) { type: 'SyntaxError', '$error': '$error' } events.js:180 throw er; // Unhandled 'error' event ^ Error: write EPIPE ... at processTicksAndRejections (internal/process/task_queues.js:77:11) Emitted 'error' event at: at internal/child_process.js:810:39 at processTicksAndRejections (internal/process/task_queues.js:75:11) { errno: 'EPIPE', code: 'EPIPE', syscall: 'write' } error Command failed with exit code 1. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

This is my next.config.js:

const nextConfig = {
    distDir: '_next',

    onDemandEntries: {
        maxInactiveAge: 1000 * 60 * 60,
        pagesBufferLength: 5,
    },

    webpack: (config, { dev }) => {
        !dev &&
        config.plugins.push(
            new BrotliPlugin({
                asset: '[path].br[query]',
                test: /\.js$|\.css$|\.html$/,
                threshold: 10240,
                minRatio: 0.7,
            }),
        );

        !dev &&
        config.plugins.push(
            new CompressionPlugin({
                filename: '[path].gz[query]',
                algorithm: 'gzip',
                test: /\.js$|\.css$|\.html$/,
                threshold: 10240,
                minRatio: 0.7,
            }),
        );
        return config;
    },
};

module.exports = withPlugins(
    [
        [withImages],
        [withCss],
        [
            withSass,
            {
                cssModules: true,
                cssLoaderOptions: {
                    localIdentName: '[path]___[local]___[hash:base64:5]',
                },
            },
        ],
        [withBundleAnalyzer],
    ],
    nextConfig,
);

Do you know what is wrong with this?

Edit

It seems there is a compatibility problem with ant design and I found some sources but not get it though!


Solution

  • Based on this example in the Next.js repository https://github.com/zeit/next.js/tree/canary/examples/with-ant-design

    To resolve this problem, add these lines to your next.config.js:

    const nextConfig = {
      webpack: (config, { isServer }) => {
        if (isServer) {
          const antStyles = /antd\/.*?\/style\/css.*?/;
          const origExternals = [...config.externals];
          config.externals = [ // eslint-disable-line
            (context, request, callback) => { // eslint-disable-line
              if (request.match(antStyles)) return callback();
              if (typeof origExternals[0] === 'function') {
                origExternals[0](context, request, callback);
              } else {
                callback();
              }
            },
            ...(typeof origExternals[0] === 'function' ? [] : origExternals),
          ];
    
          config.module.rules.unshift({
            test: antStyles,
            use: 'null-loader',
          });
        }
        return config;
      },
    };
    

    An example of what the next.config.js file would look like:

    const withPlugins = require('next-compose-plugins');
    const withCss = require('@zeit/next-css');
    const withSass = require('@zeit/next-sass');
    
    if (typeof require !== 'undefined') {
      require.extensions['.css'] = file => {};
    }
    
    const nextConfig = {
      webpack: (config, { isServer }) => {
        if (isServer) {
          const antStyles = /antd\/.*?\/style\/css.*?/;
          const origExternals = [...config.externals];
          config.externals = [ // eslint-disable-line
            (context, request, callback) => { // eslint-disable-line
              if (request.match(antStyles)) return callback();
              if (typeof origExternals[0] === 'function') {
                origExternals[0](context, request, callback);
              } else {
                callback();
              }
            },
            ...(typeof origExternals[0] === 'function' ? [] : origExternals),
          ];
    
          config.module.rules.unshift({
            test: antStyles,
            use: 'null-loader',
          });
        }
        return config;
      },
    };
    
    module.exports = withPlugins(
      [
        [withCss],
        [
          withSass,
          {
            cssModules: true,
            cssLoaderOptions: {
              localIdentName: '[path]___[local]___[hash:base64:5]',
            },
          },
        ],
      ],
      nextConfig,
    );