From 738ef234e6a7134658cd28b88733f14dc4a72ecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hans-J=C3=B8rgen=20Vedvik?= Date: Sat, 10 Nov 2018 19:16:28 +0100 Subject: [PATCH] fix(image): render fallback as html string --- .../ImageProcessQueue.spec.js.snap | 2 +- gridsome/app/components/Image.js | 26 ++++++++++--------- gridsome/app/head.js | 7 ++++- gridsome/lib/app/queue/ImageProcessQueue.js | 2 ++ 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/gridsome/__tests__/__snapshots__/ImageProcessQueue.spec.js.snap b/gridsome/__tests__/__snapshots__/ImageProcessQueue.spec.js.snap index b18370525..ee3825bfc 100644 --- a/gridsome/__tests__/__snapshots__/ImageProcessQueue.spec.js.snap +++ b/gridsome/__tests__/__snapshots__/ImageProcessQueue.spec.js.snap @@ -6,7 +6,7 @@ exports[`disable lazy loading 1`] = `""`; +exports[`generate srcset for image 2`] = `""`; exports[`generate srcset for image 3`] = `""`; diff --git a/gridsome/app/components/Image.js b/gridsome/app/components/Image.js index 11d7ca46b..a0eb466c3 100644 --- a/gridsome/app/components/Image.js +++ b/gridsome/app/components/Image.js @@ -32,7 +32,7 @@ export default { const isDev = process.env.NODE_ENV === 'development' const isLazy = typeof props.immediate === 'undefined' const classNames = (data.class || []).concat(['g-image']) - const noscriptClass = classNames.slice() + const noscriptClassNames = classNames.slice() const res = [] let src = '' @@ -84,22 +84,23 @@ export default { } classNames.push('g-image--lazy') - noscriptClass.push('g-image--loaded') + classNames.push('g-image--loading') + noscriptClassNames.push('g-image--loaded') parent.$once('hook:mounted', () => onMount(parent.$refs[ref])) parent.$once('hook:updated', () => onMount(parent.$refs[ref])) parent.$once('hook:beforeDestroy', () => onDestroy(parent.$refs[ref])) - res.push(h('noscript', null, [ - h('img', { - class: noscriptClass, - attrs: { - src, - alt: props.alt, - width: size.width - } - }) - ])) + // must render as innerHTML to make hydration work + res.push(h('noscript', { + domProps: { + innerHTML: `` + + `${props.alt}` + } + })) } return res @@ -151,6 +152,7 @@ function loadImage (el) { delete el.dataset.sizes delete el.onload + el.classList.remove('g-image--loading') el.classList.add('g-image--loaded') } diff --git a/gridsome/app/head.js b/gridsome/app/head.js index 1af3cc307..cca9fcd52 100644 --- a/gridsome/app/head.js +++ b/gridsome/app/head.js @@ -13,7 +13,7 @@ Vue.use(Meta, { const head = { title: config.siteName, titleTemplate: config.titleTemplate, - __dangerouslyDisableSanitizers: ['style', 'script'], + __dangerouslyDisableSanitizers: ['style', 'script', 'noscript'], __dangerouslyDisableSanitizersByTagID: {}, htmlAttrs: { lang: 'en' @@ -24,6 +24,7 @@ const head = { { name: 'viewport', content: 'width=device-width, initial-scale=1, viewport-fit=cover' } ], base: {}, + noscript: [], script: [], style: [], link: [] @@ -46,4 +47,8 @@ icons.touchicons.forEach(({ width, height, src: href }) => { }) }) +head.noscript.push({ + innerHTML: `` +}) + export default head diff --git a/gridsome/lib/app/queue/ImageProcessQueue.js b/gridsome/lib/app/queue/ImageProcessQueue.js index 3b9a12d77..b3e6b112e 100644 --- a/gridsome/lib/app/queue/ImageProcessQueue.js +++ b/gridsome/lib/app/queue/ImageProcessQueue.js @@ -157,6 +157,8 @@ class ImageProcessQueue { (options.height ? ` height="${options.height}"` : '') + (options.alt ? ` alt="${options.alt}">` : '>') + `` + + classNames.push('g-image--loading') } results.imageHTML = '' +