Skip to content

Conversation

azat-io
Copy link

@azat-io azat-io commented May 31, 2025

Changes

  • Added svg.optimize and svg.svgoConfig configuration options
  • Integrated SVGO optimization in the SVG processing pipeline
  • Updated type definitions and config schema
  • Added error handling with fallback to original SVG content

Testing

Added unit tests.

Benefits

  • Reduces SVG file sizes automatically during build
  • Configurable optimization with full SVGO plugin support
  • Backward compatible - optimization is opt-in
  • Graceful error handling with fallback

Astro planned to add SVGO earlier:
#12067

Docs

I'll create another PR to docs.

@github-actions github-actions bot added pkg: astro Related to the core `astro` package (scope) docs pr labels May 31, 2025
Copy link

codspeed-hq bot commented May 31, 2025

CodSpeed Performance Report

Merging #13880 will not alter performance

Comparing azat-io:feat/svgo (d8a9173) with main (1e5b72c)

Summary

✅ 6 untouched

Copy link

changeset-bot bot commented May 31, 2025

🦋 Changeset detected

Latest commit: d8a9173

The changes in this PR will be included in the next version bump.

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@ascorbic
Copy link
Contributor

ascorbic commented Jun 4, 2025

Thanks! This is a new feature, so we will need to discuss it a bit before merging, and it will need to wait for a minor release. There is a chance we will want to put this behind an experimental flag at first too. In the meantime, could you add a changeset? It's used to generate the changelog, so make sure you include enough detail to explain what it is and how it works for new users. Think of it as the first bit of docs.

Copy link
Member

@delucis delucis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR @azat-io! I think this could be a nice feature.

Left a couple of questions based on a quick look.

Also pinging @natemoo-re and @stramel as our resident SVG experts who might have good insights here!

svg: z
.object({
optimize: z.boolean().default(true),
svgoConfig: z.record(z.any()).optional(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should offer at least proper typing here even if we don’t do full schema validation. For example, if a type is available for the SVGO options, we could use something like:

			svgoConfig: z.custom<SVGOOptions>((value) => value && typeof value === 'object').optional(),

That way users should get a nice editor experience.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done ✅

* @description
* Whether to enable SVG optimization using SVGO during build time.
*
* When enabled, all imported SVG files will be optimized for smaller file sizes
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

all imported SVG files

Will this also apply to usage with Astro’s assets pipeline? For example usage like:

---
import { Image } from 'astro:assets';
import mySVG from './example.svg';
---

<Image src={mySVG} alt="Example SVG" />

@stramel
Copy link
Contributor

stramel commented Jun 6, 2025

Thanks for the PR! I do have some initial thoughts on this.

This approach is similar to what we did in astro-icon which had some downsides and issues.

This might also conflict with an idea @natemoo-re had about shifting the icons into a content-collection instead.

I was also thinking about alternatives to this approach that doesn't tie us so tightly to svgo. Similar to the image optimization setup or offering a optimize function/file. Sharp offers SVG optimization as well.

Another thought was allowing opt-in per SVG though that can get a bit hairy.

Let me know if you have any deeper thoughts. I'll keep thinking about it as well. Interested to hear @natemoo-re 's opinions as well

@azat-io azat-io force-pushed the feat/svgo branch 2 times, most recently from 175772e to f7104bc Compare June 7, 2025 10:54
@azat-io
Copy link
Author

azat-io commented Jun 7, 2025

Made fixes based on comments:

  • added changest
  • improved typing
  • made the feature experimental

svg?: {
/**
* @docs
* @name svg.optimize
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* @name svg.optimize
* @name experimental.svg.optimize

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done ✅


/**
* @docs
* @name svg.svgoConfig
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* @name svg.svgoConfig
* @name experimental.svg.svgoConfig

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done ✅

@azat-io
Copy link
Author

azat-io commented Jun 12, 2025

Should I create a pull request in the documentation?

@azat-io
Copy link
Author

azat-io commented Jun 20, 2025

Rebased.

@azat-io
Copy link
Author

azat-io commented Jun 26, 2025

Any feedback?

@azat-io
Copy link
Author

azat-io commented Jul 5, 2025

Ping.

1 similar comment
@azat-io
Copy link
Author

azat-io commented Jul 16, 2025

Ping.

@delucis
Copy link
Member

delucis commented Jul 17, 2025

Hey @azat-io! We’re waiting on getting some more feedback from our SVG experts — apologies for the delay.

In the meantime, it would be good to have an answer to my question here: #13880 (comment)

@azat-io azat-io force-pushed the feat/svgo branch 2 times, most recently from 446db9a to 8a6dd52 Compare July 20, 2025 12:59
@azat-io
Copy link
Author

azat-io commented Aug 6, 2025

Rebased.

@jlarmstrongiv
Copy link

Amazing stuff! I was looking for how to use svgo with astro today and came across this PR. Native support for svgo with a customizable svgo config would be extremely helpful.

@azat-io
Copy link
Author

azat-io commented Oct 5, 2025

Hi @delucis, @stramel, @natemoo-re,

Checking in - it's been 4 months since the last comment. All feedback has been addressed and the PR is ready for review.

What's the status on this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs pr pkg: astro Related to the core `astro` package (scope)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants