|
1 | 1 | const { JSDOM } = require('jsdom'); |
| 2 | +const { get } = require('axios'); |
| 3 | +var sizeOf = require('image-size'); |
| 4 | +const { scullyConfig } = require('@scullyio/scully'); |
| 5 | +const path = require('path'); |
2 | 6 |
|
3 | 7 | const lazyImagesPlugin = async (html, route) => { |
4 | 8 | const dom = new JSDOM(html); |
5 | 9 | const doc = dom.window.document; |
6 | 10 |
|
7 | | - makeImageLazyload(doc); |
8 | | - |
| 11 | + await makeImageLazyload(doc, route); |
9 | 12 | doc.body.append(loadLazyload(doc)); |
10 | 13 | doc.body.append(createLazyImageScript(doc)); |
11 | 14 |
|
12 | 15 | return dom.serialize(); |
13 | 16 | }; |
14 | 17 |
|
15 | | -const makeImageLazyload = (doc) => { |
| 18 | +const makeImageLazyload = async (doc, route) => { |
16 | 19 | var imgEl = doc.getElementsByTagName('img'); |
17 | 20 |
|
18 | 21 | // can be added when loading="lazy" is supported in more browsers |
19 | 22 | // for (var i = 0; i < imgEl.length; i++) { |
20 | 23 | // imgEl[i].setAttribute('loading', 'lazy'); |
21 | 24 | // } |
22 | | - |
23 | 25 | for (var i = 0; i < imgEl.length; i++) { |
24 | | - if (imgEl[i].getAttribute('src')) { |
25 | | - imgEl[i].setAttribute('data-src', imgEl[i].getAttribute('src')); |
26 | | - imgEl[i].removeAttribute('src'); |
| 26 | + const src = imgEl[i].getAttribute('src'); |
| 27 | + let dimensions = { width: 0, height: 0 }; |
| 28 | + if (src) { |
| 29 | + if (src.startsWith('http')) { |
| 30 | + try { |
| 31 | + const image = await get(src, { |
| 32 | + responseType: 'arraybuffer', |
| 33 | + }); |
| 34 | + dimensions = sizeOf(image.data); |
| 35 | + imgEl[i].setAttribute('height', dimensions.height); |
| 36 | + imgEl[i].setAttribute('width', dimensions.width); |
| 37 | + } catch (err) {} |
| 38 | + } else { |
| 39 | + dimensions = sizeOf(path.join(scullyConfig.outDir, src)); |
| 40 | + imgEl[i].setAttribute('height', dimensions.height); |
| 41 | + imgEl[i].setAttribute('width', dimensions.width); |
| 42 | + } |
| 43 | + imgEl[i].setAttribute('data-src', src); |
| 44 | + imgEl[i].setAttribute( |
| 45 | + 'src', |
| 46 | + `data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 ${dimensions.width} ${dimensions.height}'%3E%3C/svg%3E` |
| 47 | + ); |
27 | 48 | imgEl[i].classList.add('lazyload'); |
28 | 49 | } |
29 | 50 | } |
30 | 51 | }; |
31 | 52 |
|
32 | 53 | const loadLazyload = (doc) => { |
33 | | - |
34 | 54 | const lazyload = doc.createElement('script'); |
35 | 55 | lazyload.src = 'https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.js'; |
36 | 56 | return lazyload; |
|
0 commit comments