diff options
author | 2025-04-13 17:01:02 -0500 | |
---|---|---|
committer | 2025-04-13 17:01:02 -0500 | |
commit | 57e59bec40ec2febd32065324505087caec9038a (patch) | |
tree | 0df3bd05dc101dc765a5e278a49196b5e452a82f | |
parent | 793ecd916e4e815886a57b85bd1739f704faae7f (diff) | |
download | astro-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.md | 5 | ||||
-rw-r--r-- | packages/astro/src/assets/utils/node/emitAsset.ts | 6 | ||||
-rw-r--r-- | packages/astro/src/assets/vite-plugin-assets.ts | 7 | ||||
-rw-r--r-- | packages/astro/src/core/create-vite.ts | 2 |
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 }), |