Problem resolving path to svg
NickWoodward opened this issue ยท 0 comments
Current behaviour ๐ฃ
Webpack is emitting my spritesheet, having been loaded by svg-sprite-loader
and then extracted, but it cannot be resolved. This has happened since upgrading, both webpack from 4 to 5, and html-webpack-plugin
to the latest version.
An answer to a stackoverflow question suggested that it's related to how it tries to resolve xlink:href="svg/spritesheet.svg#logo"
in the html. Specifically <svg><use xlink:href="svg/spritesheet.svg#logo"></svg>
I think it's trying to resolve it from the filesystem before it actually exists
I still don't understand why html-webpack-plugin tries to resolve the path, though. It's probably treating the path as an entry and likely it was a breaking change in their 5.0 which you can work around somehow
The spritesheet is emitted, but I get the error:
Error: Child compilation failed:
Module not found: Error: Can't resolve './svg/spritesheet.svg'
Expected behaviour โ๏ธ
For html-webpack-plugin to treat the asset as it did in older versions
Reproduction Example ๐พ
Repo
Will leave the problem on the master branch
webpack.config.js from repo:
const path = require("path");
const HtmlWebpackPlugin = require('html-webpack-plugin');
const SpriteLoaderPlugin = require("svg-sprite-loader/plugin");
module.exports = {
entry: {index: "./src/index.ts"},
mode: "development",
devServer: {
static: {
directory: path.resolve(__dirname, 'dist'),
},
port: 3000,
open: {
app: {
name: 'chrome',
},
},
hot: true,
compress: true,
historyApiFallback: true,
watchFiles: ["src/**/*"]
},
module: {
rules: [
{
test: /\.tsx?$/,
use: "ts-loader",
exclude: /node_modules/,
},
{
test: /\.css$/i,
include: path.resolve(__dirname, "src"),
use: ["style-loader", "css-loader", "postcss-loader"]
},
{
test: /\.(png|jpg|jpeg|gif)$/i,
type: 'asset/resource'
},
{
test: /\.svg$/,
use: [
{
loader: 'svg-sprite-loader',
options: {
extract: true,
spriteFilename: 'svg/spritesheet.svg'
},
},
'svgo-loader',
]
},
{
test: /\.html$/,
use: 'html-loader'
},
],
},
resolve: {
extensions: [".tsx", ".ts", ".js"],
},
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "dist"),
},
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html',
template: './src/index.html',
chunks: ['index'],
// publicPath: true
}),
new SpriteLoaderPlugin()
]
}
Asset in html:
<svg class="mx-auto my-16"><use xlink:href="svg/spritesheet.svg#logo"></svg>
Asset import in index.ts:
import './images/logo.svg';
Environment ๐ฅ
Node.js v16.14.0
win32 10.0.19044
npm 8.10.0
npm ls webpack:
webpacktypescripttailwind@1.0.0 C:\Users\Nick\Tutorials\Tailwind\Projects\clipboard-website
โโโฌ css-loader@6.7.1
โ โโโ webpack@5.74.0 deduped
โโโฌ html-loader@4.1.0
โ โโโ webpack@5.74.0 deduped
โโโฌ html-webpack-plugin@5.5.0
โ โโโ webpack@5.74.0 deduped
โโโฌ postcss-loader@7.0.1
โ โโโ webpack@5.74.0 deduped
โโโฌ style-loader@3.3.1
โ โโโ webpack@5.74.0 deduped
โโโฌ ts-loader@9.3.1
โ โโโ webpack@5.74.0 deduped
โโโฌ webpack-cli@4.10.0
โ โโโฌ @webpack-cli/configtest@1.2.0
โ โ โโโ webpack@5.74.0 deduped
โ โโโ webpack@5.74.0 deduped
โโโฌ webpack-dev-server@4.10.0
โ โโโฌ webpack-dev-middleware@5.3.3
โ โ โโโ webpack@5.74.0 deduped
โ โโโ webpack@5.74.0 deduped
โโโฌ webpack@5.74.0
โโโฌ terser-webpack-plugin@5.3.5
โโโ webpack@5.74.0 deduped
npm ls html-webpack-plugin
webpacktypescripttailwind@1.0.0 C:\Users\Nick\Tutorials\Tailwind\Projects\clipboard-website
โโโ html-webpack-plugin@5.5.0
Juho in that SO question suggested using his plugin as a fix, which I'm grateful for, and it does work, but I'm more familiar with yours, and I thought this might be of interest? For the time being I'll probably use his or lazy load the svgs in image tags as he suggests.
Apologies for the wall of text!