From f77d9f735cdb27dc68306fbd517197b735c5494f Mon Sep 17 00:00:00 2001 From: Josef Reinhard Brandl Date: Tue, 23 Aug 2022 11:51:06 +0200 Subject: [PATCH] fix: Skip inlining Git LFS placeholders --- docs/config/build-options.md | 4 +++- docs/guide/assets.md | 2 ++ packages/vite/src/node/plugins/asset.ts | 9 ++++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/config/build-options.md b/docs/config/build-options.md index b2d9bf629a02b9..291135045560ce 100644 --- a/docs/config/build-options.md +++ b/docs/config/build-options.md @@ -53,8 +53,10 @@ Specify the directory to nest generated assets under (relative to `build.outDir` Imported or referenced assets that are smaller than this threshold will be inlined as base64 URLs to avoid extra http requests. Set to `0` to disable inlining altogether. +Git LFS placeholders are automatically excluded from inlining because they do not contain the content of the file they represent. + ::: tip Note -If you specify `build.lib`, `build.assetsInlineLimit` will be ignored and assets will always be inlined, regardless of file size. +If you specify `build.lib`, `build.assetsInlineLimit` will be ignored and assets will always be inlined, regardless of file size or being a Git LFS placeholder. ::: ## build.cssCodeSplit diff --git a/docs/guide/assets.md b/docs/guide/assets.md index a8fdf5e208249a..43e86344f69511 100644 --- a/docs/guide/assets.md +++ b/docs/guide/assets.md @@ -26,6 +26,8 @@ The behavior is similar to webpack's `file-loader`. The difference is that the i - Assets smaller in bytes than the [`assetsInlineLimit` option](/config/build-options.md#build-assetsinlinelimit) will be inlined as base64 data URLs. +- Git LFS placeholders are automatically excluded from inlining because they do not contain the content of the file they represent. + ### Explicit URL Imports Assets that are not included in the internal list or in `assetsInclude`, can be explicitly imported as a URL using the `?url` suffix. This is useful, for example, to import [Houdini Paint Worklets](https://houdini.how/usage). diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index c018ba56427fce..35d4fbf3327cc4 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -398,6 +398,12 @@ export function publicFileToBuiltUrl( return `__VITE_PUBLIC_ASSET__${hash}__` } +const GIT_LFS_PREFIX = Buffer.from('version https://git-lfs.github.com') +function isGitLfsPlaceholder(content: Buffer): boolean { + // Check whether the content begins with the characteristic string of Git LFS placeholders + return GIT_LFS_PREFIX.compare(content, 0, GIT_LFS_PREFIX.length) === 0 +} + /** * Register an asset to be emitted as part of the bundle (if necessary) * and returns the resolved public URL @@ -426,7 +432,8 @@ async function fileToBuiltUrl( config.build.lib || (!file.endsWith('.svg') && !file.endsWith('.html') && - content.length < Number(config.build.assetsInlineLimit)) + content.length < Number(config.build.assetsInlineLimit) && + !isGitLfsPlaceholder(content)) ) { const mimeType = mrmime.lookup(file) ?? 'application/octet-stream' // base64 inlined as a string