如何使用 Antd/Less 和 Sass/CSS 模块配置 Next.js

Jus*_*tTB 20 sass less css-modules next.js antd

我想将Next.js与 Sass 和 CSS 模块一起使用,但也想使用Ant Design并想使用 Less 样式来缩小建筑尺寸。

我可以启用 CSS 模块或 Less 加载程序,但不能同时启用。Next.js 中的示例并没有帮助我完成这个问题。

Jus*_*tTB 36

经过几个小时的研究,我现在终于找到了正确的解决方案,并想分享它:

.babelrc (这里没有魔法)

{
  "presets": ["next/babel"],
  "plugins": [
    [
      "import",
      {
        "libraryName": "antd",
        "style": true
      }
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

next.config.js

/* eslint-disable */
const withLess = require('@zeit/next-less');
const withSass = require('@zeit/next-sass');
const lessToJS = require('less-vars-to-js');
const fs = require('fs');
const path = require('path');

// Where your antd-custom.less file lives
const themeVariables = lessToJS(
  fs.readFileSync(path.resolve(__dirname, './assets/antd-custom.less'), 'utf8')
);

module.exports = withSass({
  cssModules: true,
  ...withLess({
    lessLoaderOptions: {
      javascriptEnabled: true,
      modifyVars: themeVariables, // make your antd custom effective
      importLoaders: 0
    },
    cssLoaderOptions: {
      importLoaders: 3,
      localIdentName: '[local]___[hash:base64:5]'
    },
    webpack: (config, { isServer }) => {
      //Make Ant styles work with less
      if (isServer) {
        const antStyles = /antd\/.*?\/style.*?/;
        const origExternals = [...config.externals];
        config.externals = [
          (context, request, callback) => {
            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;
    }
  })
});
Run Code Online (Sandbox Code Playgroud)

最后提示如何编写withSass withLess使用和把cssModules: true外物从该评论是在这里

虽然我已经在尝试从之前的例子中得出的不同组合: next+ant+less next+sass

为了在这里完成我的依赖项package.json

...
"dependencies": {
    "@zeit/next-less": "^1.0.1",
    "@zeit/next-sass": "^1.0.1",
    "antd": "^4.1.3",
    "babel-plugin-import": "^1.13.0",
    "less": "^3.11.1",
    "less-vars-to-js": "^1.3.0",
    "next": "^9.3.4",
    "node-sass": "^4.13.1",
    "null-loader": "^3.0.0",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "sass": "^1.26.3"
  }
...
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助其他人更快地找到这个解决方案。:)

  • 我们有机会使用“sass”而不是“@zeit/next-sass”。我想使用 NextJs 9.3 附带的内置 sass 支持,并且少用 antd。当我们在 webpack 配置中使用外部 css 加载器时,内置的 sass 支持将被禁用。 (2认同)

Phi*_*ews 9

虽然上述答案可能适用于低于 11 的 NextJS 版本,但不适用于 11+ 版本。我发现以下插件取得了巨大的成功......

https://github.com/SolidZORO/next-plugin-antd-less

  • 感谢您的回答,但最新的 NextJS 版本也已弃用它,例如版本“12.1.6”。因为NextJS已经适配了SWC的使用。我还需要一些有关 NextJS 和 antd 的 SWC 配置的帮助。如果有人可以提供帮助那就太好了。 (2认同)

ela*_*ado 7

@zeit/next-less已弃用并禁用 Next 的内置 CSS 支持。它还使用了非常旧版本的lessless-loader

我创建了一个包,通过复制 SASS 规则并将它们设置为 Less 文件和less-loader. 它与webpack5标志一起使用。

https://github.com/elado/next-with-less

https://www.npmjs.com/package/next-with-less

  • 这就是我编写包(webpack5 支持)的主要原因。此外,它还保留了 Next 错误和文件加载器的确切行为。这也不是 Ant 特有的。 (2认同)