我们在写样式的时候会用图片作为背景 ,例如下面的用法
background: url("../images/login-background.png") no-repeat 0 -50px;
在webpack进行构建的时候 我们会用url-loader 来处理,但是在nextjs中,直接使用是不行的 ,因为nextjs的静态文件夹是public 只有这个文件夹下的文件才能被访问到。我们从网上查找解决方案,大多是用的next-images 这个包去处理的。一般来说 这么用就行了,但是有些特殊情况 ,比如我们要用antd的icon,自定义icon的时候需要自己去加载svg文件,这个时候svg这种模式就需要单独处理了。所以我们还是需要自己来配置,我们从源码可以看到,实现还是用url-loader来做的。那么我们自己调整下即可。
let rules = [
{
test: /\.(png|jpe?g)/,
use:[
{ loader: 'url-loader' ,options: {
limit: config.inlineImageLimit,
fallback: 'file-loader',
publicPath: `${config.assetPrefix || '/_next/static/images/'}`,
outputPath: `${options.isServer ? "../" : ""}static/images/`,
name: "[name]-[hash].[ext]",
esModule: false
}}
]
},
{
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
use: [
{
loader: 'babel-loader',
},
{
loader: '@svgr/webpack',
options: {
babel: false,
icon: true,
},
},
],
}
];
config.module.rules = _.concat(config.module.rules,rules);
核心思路就是把静态文件打包到static文件夹下。