summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Nate Moore <natemoo-re@users.noreply.github.com> 2025-04-13 17:01:02 -0500
committerGravatar GitHub <noreply@github.com> 2025-04-13 17:01:02 -0500
commit57e59bec40ec2febd32065324505087caec9038a (patch)
tree0df3bd05dc101dc765a5e278a49196b5e452a82f
parent793ecd916e4e815886a57b85bd1739f704faae7f (diff)
downloadastro-57e59bec40ec2febd32065324505087caec9038a.tar.gz
astro-57e59bec40ec2febd32065324505087caec9038a.tar.zst
astro-57e59bec40ec2febd32065324505087caec9038a.zip
fix(svg): do not attach `svg` buffer to `imageMetadata` (#13588)
* fix(svg): do not attach svg buffer to imageMetadata * chore: add changeset
-rw-r--r--.changeset/five-rings-smile.md5
-rw-r--r--packages/astro/src/assets/utils/node/emitAsset.ts6
-rw-r--r--packages/astro/src/assets/vite-plugin-assets.ts7
-rw-r--r--packages/astro/src/core/create-vite.ts2
4 files changed, 10 insertions, 10 deletions
diff --git a/.changeset/five-rings-smile.md b/.changeset/five-rings-smile.md
new file mode 100644
index 000000000..6a784dbd6
--- /dev/null
+++ b/.changeset/five-rings-smile.md
@@ -0,0 +1,5 @@
+---
+'astro': patch
+---
+
+Fixes a memory leak when using SVG assets.
diff --git a/packages/astro/src/assets/utils/node/emitAsset.ts b/packages/astro/src/assets/utils/node/emitAsset.ts
index d7e748559..3bdadc9ec 100644
--- a/packages/astro/src/assets/utils/node/emitAsset.ts
+++ b/packages/astro/src/assets/utils/node/emitAsset.ts
@@ -54,12 +54,6 @@ export async function emitESMImage(
value: id,
});
- // Attach file data for SVGs
- // TODO: this is a workaround to prevent a memory leak, and it must be fixed before we remove the experimental flag, see
- if (fileMetadata.format === 'svg' && experimentalSvgEnabled) {
- emittedImage.contents = fileData;
- }
-
// Build
let isBuild = typeof fileEmitter === 'function';
if (isBuild) {
diff --git a/packages/astro/src/assets/vite-plugin-assets.ts b/packages/astro/src/assets/vite-plugin-assets.ts
index 9421ece46..4d6a8c35b 100644
--- a/packages/astro/src/assets/vite-plugin-assets.ts
+++ b/packages/astro/src/assets/vite-plugin-assets.ts
@@ -1,3 +1,4 @@
+import type * as fsMod from 'node:fs';
import { extname } from 'node:path';
import MagicString from 'magic-string';
import type * as vite from 'vite';
@@ -90,7 +91,7 @@ const addStaticImageFactory = (
};
};
-export default function assets({ settings }: { settings: AstroSettings }): vite.Plugin[] {
+export default function assets({ fs, settings }: { fs: typeof fsMod; settings: AstroSettings }): vite.Plugin[] {
let resolvedConfig: vite.ResolvedConfig;
let shouldEmitFile = false;
let isBuild = false;
@@ -223,9 +224,9 @@ export default function assets({ settings }: { settings: AstroSettings }): vite.
}
if (settings.config.experimental.svg && /\.svg$/.test(id)) {
- const { contents, ...metadata } = imageMetadata;
+ const contents = await fs.promises.readFile(imageMetadata.fsPath, { encoding: 'utf8' });
// We know that the contents are present, as we only emit this property for SVG files
- return { code: makeSvgComponent(metadata, contents!) };
+ return { code: makeSvgComponent(imageMetadata, contents) };
}
// We can only reliably determine if an image is used on the server, as we need to track its usage throughout the entire build.
diff --git a/packages/astro/src/core/create-vite.ts b/packages/astro/src/core/create-vite.ts
index 04fce7d5a..3c3ec3e12 100644
--- a/packages/astro/src/core/create-vite.ts
+++ b/packages/astro/src/core/create-vite.ts
@@ -164,7 +164,7 @@ export async function createVite(
astroContentAssetPropagationPlugin({ settings }),
vitePluginMiddleware({ settings }),
vitePluginSSRManifest(),
- astroAssetsPlugin({ settings }),
+ astroAssetsPlugin({ fs, settings }),
astroPrefetch({ settings }),
astroTransitions({ settings }),
astroDevToolbar({ settings, logger }),