Skip to content

Commit 8752477

Browse files
authored
perf(gatsby-plugin-image): Optimise image size functions (#27544)
* perf(gatsby-plugin-image): Optimise image size functions * Add test
1 parent 47d8041 commit 8752477

File tree

2 files changed

+43
-14
lines changed

2 files changed

+43
-14
lines changed

packages/gatsby-plugin-sharp/src/__tests__/index.js

+18
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const {
2828
fixed,
2929
queueImageResizing,
3030
getImageSize,
31+
getImageSizeAsync,
3132
stats,
3233
setBoundActionCreators,
3334
} = require(`../`)
@@ -614,6 +615,23 @@ describe(`gatsby-plugin-sharp`, () => {
614615

615616
expect(result).toMatchSnapshot()
616617
})
618+
619+
it(`handles padding bytes correctly in async version`, async () => {
620+
const result = await getImageSizeAsync(
621+
getFileObject(path.join(__dirname, `images/padding-bytes.jpg`))
622+
)
623+
624+
expect(result).toMatchInlineSnapshot(`
625+
Object {
626+
"hUnits": "px",
627+
"height": 1000,
628+
"mime": "image/jpeg",
629+
"type": "jpg",
630+
"wUnits": "px",
631+
"width": 746,
632+
}
633+
`)
634+
})
617635
})
618636

619637
describe(`tracedSVG`, () => {

packages/gatsby-plugin-sharp/src/index.js

+25-14
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,36 @@ const duotone = require(`./duotone`)
2020
const { IMAGE_PROCESSING_JOB_NAME } = require(`./gatsby-worker`)
2121

2222
const imageSizeCache = new Map()
23+
24+
const getImageSizeAsync = async file => {
25+
if (
26+
process.env.NODE_ENV !== `test` &&
27+
imageSizeCache.has(file.internal.contentDigest)
28+
) {
29+
return imageSizeCache.get(file.internal.contentDigest)
30+
}
31+
const input = fs.createReadStream(file.absolutePath)
32+
const dimensions = await imageSize(input)
33+
34+
if (!dimensions) {
35+
reportError(
36+
`gatsby-plugin-sharp couldn't determine dimensions for file:\n${file.absolutePath}\nThis file is unusable and is most likely corrupt.`,
37+
``
38+
)
39+
}
40+
41+
imageSizeCache.set(file.internal.contentDigest, dimensions)
42+
return dimensions
43+
}
44+
// Remove in next major as it's really slow
2345
const getImageSize = file => {
2446
if (
2547
process.env.NODE_ENV !== `test` &&
2648
imageSizeCache.has(file.internal.contentDigest)
2749
) {
2850
return imageSizeCache.get(file.internal.contentDigest)
2951
} else {
30-
const dimensions = imageSize.sync(
31-
toArray(fs.readFileSync(file.absolutePath))
32-
)
52+
const dimensions = imageSize.sync(fs.readFileSync(file.absolutePath))
3353

3454
if (!dimensions) {
3555
reportError(
@@ -657,7 +677,7 @@ async function fixed({ file, args = {}, reporter, cache }) {
657677
sizes.push(options[fixedDimension])
658678
sizes.push(options[fixedDimension] * 1.5)
659679
sizes.push(options[fixedDimension] * 2)
660-
const dimensions = getImageSize(file)
680+
const dimensions = await getImageSizeAsync(file)
661681

662682
const filteredSizes = sizes.filter(size => size <= dimensions[fixedDimension])
663683

@@ -763,16 +783,6 @@ async function fixed({ file, args = {}, reporter, cache }) {
763783
}
764784
}
765785

766-
function toArray(buf) {
767-
var arr = new Array(buf.length)
768-
769-
for (var i = 0; i < buf.length; i++) {
770-
arr[i] = buf[i]
771-
}
772-
773-
return arr
774-
}
775-
776786
exports.queueImageResizing = queueImageResizing
777787
exports.resize = queueImageResizing
778788
exports.base64 = base64
@@ -783,4 +793,5 @@ exports.resolutions = fixed
783793
exports.fluid = fluid
784794
exports.fixed = fixed
785795
exports.getImageSize = getImageSize
796+
exports.getImageSizeAsync = getImageSizeAsync
786797
exports.stats = stats

0 commit comments

Comments
 (0)