由于next.js仅支持sass,而antd又是用less开发,官方的next-less一直停留在1.01版本,next.js升级到11.0以后的版本默认支持webpack5以上的版本,所以用下面的方法来实现支持webpack5。
next.config.js:
const fs = require('fs');
const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const lessToJS = require('less-vars-to-js');
const themeVariables = lessToJS(fs.readFileSync(path.resolve(__dirname, './antd-custom.less'), 'utf8'));
module.exports = {
useFileSystemPublicRoutes: false,
poweredByHeader: false,
webpack: (config, { isServer }) => {
if (isServer) {
const antStyles = /antd\/.*?\/style.*?/;
const origExternals = [...config.externals];
config.externals = [
(ctx, callback) => {
if (ctx.request.match(antStyles)) return callback();
if (typeof origExternals[0] === 'function') {
return origExternals[0](ctx, callback);
} else {
return callback();
}
},
...(typeof origExternals[0] === 'function' ? [] : origExternals),
];
config.module.rules.unshift({
test: antStyles,
use: 'null-loader',
});
}
config.module.rules.push({
test: /\.less$/i,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
importLoaders: 1,
modules: {
mode: 'local',
auto: /\.module\.less/i,
localIdentName: '__[hash:base64:6]',
},
},
},
{
loader: 'less-loader',
options: {
lessOptions: {
javascriptEnabled: true,
modifyVars: themeVariables,
},
},
},
],
});
config.plugins.push(
new MiniCssExtractPlugin({
experimentalUseImportModule: true,
ignoreOrder: true,
filename: 'static/css/[name].[contenthash].css',
chunkFilename: 'static/css/[name].[contenthash].chunk.css',
})
);
config.optimization.minimizer.push(new CssMinimizerPlugin());
return config;
},
};