diff options
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/responsiveLoaderPlugin.ts | 73 |
1 files changed, 45 insertions, 28 deletions
diff --git a/src/plugins/responsiveLoaderPlugin.ts b/src/plugins/responsiveLoaderPlugin.ts index 6334c4c..6975124 100644 --- a/src/plugins/responsiveLoaderPlugin.ts +++ b/src/plugins/responsiveLoaderPlugin.ts | |||
@@ -12,34 +12,51 @@ import sharp from 'responsive-loader/sharp'; | |||
12 | export default function responsiveLoaderPlugin(): Plugin { | 12 | export default function responsiveLoaderPlugin(): Plugin { |
13 | return { | 13 | return { |
14 | name: 'marussy-responsive-loader-plugin', | 14 | name: 'marussy-responsive-loader-plugin', |
15 | configureWebpack: (_config, isServer) => ({ | 15 | configureWebpack: (config, isServer) => { |
16 | mergeStrategy: { | 16 | const rules = config.module?.rules ?? []; |
17 | 'module.rules': 'prepend', | 17 | rules.forEach((rule) => { |
18 | }, | 18 | if ( |
19 | // Configuration based on | 19 | typeof rule === 'object' && |
20 | // https://github.com/dazuaz/responsive-loader/blob/ef2c806fcd36f06f6be8a0b97e09f40c3d86d3ac/README.md | 20 | 'test' in rule && |
21 | module: { | 21 | rule.test instanceof RegExp && |
22 | rules: [ | 22 | rule.test.test('.svg') && |
23 | { | 23 | typeof rule.oneOf?.[0] === 'object' && |
24 | test: /\.(png|jpe?g)$/, | 24 | 'use' in rule.oneOf[0] |
25 | resourceQuery: /[?&]rl$/, | 25 | ) { |
26 | use: [ | 26 | // Skip SVGR when importing SVG files with ?url. |
27 | { | 27 | rule.oneOf[0].resourceQuery = { not: /[?&]url$/ }; |
28 | loader: 'responsive-loader', | 28 | } |
29 | options: { | 29 | }); |
30 | adapter: sharp, | 30 | return { |
31 | format: 'webp', | 31 | mergeStrategy: { |
32 | // See | 32 | 'module.rules': 'replace', |
33 | // https://github.com/facebook/docusaurus/blob/c745021b01a8b88d34e1d772278d7171ad8acdf5/packages/docusaurus-plugin-ideal-image/src/index.ts#L62-L66 | 33 | }, |
34 | emitFile: !isServer, | 34 | // Configuration based on |
35 | name: 'assets/images/[name].[hash:hex:7].[width].[ext]', | 35 | // https://github.com/dazuaz/responsive-loader/blob/ef2c806fcd36f06f6be8a0b97e09f40c3d86d3ac/README.md |
36 | module: { | ||
37 | rules: [ | ||
38 | { | ||
39 | test: /\.(png|jpe?g)$/, | ||
40 | resourceQuery: /[?&]rl$/, | ||
41 | use: [ | ||
42 | { | ||
43 | loader: 'responsive-loader', | ||
44 | options: { | ||
45 | adapter: sharp, | ||
46 | format: 'webp', | ||
47 | // See | ||
48 | // https://github.com/facebook/docusaurus/blob/c745021b01a8b88d34e1d772278d7171ad8acdf5/packages/docusaurus-plugin-ideal-image/src/index.ts#L62-L66 | ||
49 | emitFile: !isServer, | ||
50 | name: 'assets/images/[name].[hash:hex:7].[width].[ext]', | ||
51 | }, | ||
36 | }, | 52 | }, |
37 | }, | 53 | ], |
38 | ], | 54 | type: 'javascript/auto', |
39 | type: 'javascript/auto', | 55 | }, |
40 | }, | 56 | ...rules, |
41 | ], | 57 | ], |
42 | }, | 58 | }, |
43 | }), | 59 | }; |
60 | }, | ||
44 | }; | 61 | }; |
45 | } | 62 | } |