Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove unnecessary image-related .wasm files inside build output when possible #6701

Merged
merged 2 commits into from
Mar 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/proud-buckets-fly.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'astro': patch
'@astrojs/image': patch
---

Remove unnecessary `.wasm` files inside build output when possible
26 changes: 21 additions & 5 deletions packages/astro/src/assets/services/vendor/squoosh/copy-wasm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,37 @@ import { fileURLToPath } from 'node:url';

export async function copyWasmFiles(dir: URL) {
const src = new URL('./', import.meta.url);
await copyDir(fileURLToPath(src), fileURLToPath(dir));
const fileList = await listFiles(fileURLToPath(src), fileURLToPath(dir));

for (let file of fileList) {
await fs.mkdir(path.dirname(file.dest), { recursive: true });
await fs.copyFile(file.src, file.dest);
}
}

export async function deleteWasmFiles(dir: URL) {
const src = new URL('./', import.meta.url);
const fileList = await listFiles(fileURLToPath(src), fileURLToPath(dir));

for (let file of fileList) {
await fs.rm(file.dest);
}
}

async function copyDir(src: string, dest: string) {
async function listFiles(src: string, dest: string) {
const itemNames = await fs.readdir(src);
const copiedFiles: {src: string, dest: string}[] = []
await Promise.all(itemNames.map(async (srcName) => {
const srcPath = path.join(src, srcName);
const destPath = path.join(dest, srcName);
const s = await fs.stat(srcPath);
if (s.isFile() && /.wasm$/.test(srcPath)) {
await fs.mkdir(path.dirname(destPath), { recursive: true });
await fs.copyFile(srcPath, destPath);
copiedFiles.push({src: srcPath, dest: destPath});
}
else if (s.isDirectory()) {
await copyDir(srcPath, destPath);
copiedFiles.push(...await listFiles(srcPath, destPath));
}
}));

return copiedFiles;
}
12 changes: 7 additions & 5 deletions packages/astro/src/assets/vite-plugin-assets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,12 +183,14 @@ export default function assets({
return;
}

const dir =
settings.config.output === 'server'
? settings.config.build.server
: settings.config.outDir;
if (settings.config.image.service === 'astro/assets/services/squoosh') {
const dir =
settings.config.output === 'server'
? settings.config.build.server
: settings.config.outDir;

await copyWasmFiles(new URL('./chunks', dir));
await copyWasmFiles(new URL('./chunks', dir));
}
},
// In build, rewrite paths to ESM imported images in code to their final location
async renderChunk(code) {
Expand Down
11 changes: 11 additions & 0 deletions packages/astro/src/core/build/generate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
generateImage as generateImageInternal,
getStaticImageList,
} from '../../assets/internal.js';
import { deleteWasmFiles } from '../../assets/services/vendor/squoosh/copy-wasm.js';
import { hasPrerenderedPages, type BuildInternals } from '../../core/build/internal.js';
import {
prependForwardSlash,
Expand Down Expand Up @@ -110,6 +111,16 @@ export async function generatePages(opts: StaticBuildOptions, internals: BuildIn
for (const imageData of getStaticImageList()) {
await generateImage(opts, imageData[0], imageData[1]);
}

// Our Squoosh image service loads `.wasm` files relatively, so we need to copy the WASM files to the dist
// for the image generation to work. In static output, we can remove those after the build is done.
if (
opts.settings.config.image.service === 'astro/assets/services/squoosh' &&
opts.settings.config.output === 'static'
) {
await deleteWasmFiles(new URL('./chunks', opts.settings.config.outDir));
}

delete globalThis.astroAsset.addStaticImage;
}

Expand Down
13 changes: 0 additions & 13 deletions packages/integrations/image/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { ssgBuild } from './build/ssg.js';
import type { ImageService, SSRImageService, TransformOptions } from './loaders/index.js';
import type { LoggerLevel } from './utils/logger.js';
import { joinPaths, prependForwardSlash, propsToFilename } from './utils/paths.js';
import { copyWasmFiles } from './vendor/squoosh/copy-wasm.js';
import { createPlugin } from './vite-plugin-astro-image.js';

export { getImage } from './lib/get-image.js';
Expand Down Expand Up @@ -143,13 +142,6 @@ export default function integration(options: IntegrationOptions = {}): AstroInte
// for SSG builds, build all requested image transforms to dist
const loader = globalThis?.astroImage?.loader;

if (resolvedOptions.serviceEntryPoint === '@astrojs/image/squoosh') {
// For the Squoosh service, copy all wasm files to dist/chunks.
// Because the default loader is dynamically imported (above),
// Vite will bundle squoosh to dist/chunks and expect to find the wasm files there
await copyWasmFiles(new URL('./chunks', dir));
}

if (loader && 'transform' in loader && staticImages.size > 0) {
const cacheDir = !!resolvedOptions.cacheDir
? new URL(resolvedOptions.cacheDir, _config.root)
Expand All @@ -165,11 +157,6 @@ export default function integration(options: IntegrationOptions = {}): AstroInte
});
}
},
'astro:build:ssr': async () => {
if (resolvedOptions.serviceEntryPoint === '@astrojs/image/squoosh') {
await copyWasmFiles(new URL('./chunks/', _buildConfig.server));
}
},
},
};
}
24 changes: 0 additions & 24 deletions packages/integrations/image/src/vendor/squoosh/copy-wasm.ts

This file was deleted.