nextjs中处理css图片引用的问题
next.js

我们在写样式的时候会用图片作为背景 ,例如下面的用法

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文件夹下。

暂无评论