рд╡реЗрдмрдкреИрдХ 5 - рдПрд╕реЗрдЯ рдореЙрдбреНрдпреВрд▓

рдЕрдЪреНрдЫрд╛ рджрд┐рдиред рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдореИрдВ рдЖрдЧрд╛рдореА рд╡реЗрдмрдкреИрдХ рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рд╡реЗрдмрдкреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ? рдХрдо рд╕реЗ рдХрдо рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдПрдХ рд╕рдХреНрд░рд┐рдп рд╣рд┐рд╕реНрд╕рд╛ рд▓реЗрддрд╛ рд╣реВрдВ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдШреБрд╕рддрд╛ рд╣реВрдВред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдПрд╕реЗрдЯ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рд╡реЗрдмрдкреИрдХ 5 рдХреА рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛, рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд▓рд╛рдн рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдХрдИ рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдбрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдЪрд┐рддреНрд░реЛрдВ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреГрд╖реНрда рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


Webpack 4 рд╕рдорд╛рдзрд╛рди


рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ 4 рд╡рд┐рдиреНрдпрд╛рд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
webpack.config.js


module.exports = {
  module: {
    rules: [
      {
        test: /\.svg$/,
        use: [
          'file-loader',
          'svgo-loader'
        ]
      },
      {
        test: /\.css$/,
        use: [
          'style-loader',
          'css-loader'
        ]
      }
    ]
  }
};

src/index.js


import './styles.css';

// ...

src/styles.css


.logo {
  background: url("/images/logo.svg") no-repeat;
  background-size: cover;
  width: 75px;
  height: 65px;
}

рдирд┐рд╖реНрдХрд░реНрд╖:


/dist/main.js
/dist/eb4c5fa504857.svg

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╕рднреА svg рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ svgo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмрдВрдбрд▓ рдХреЛрдб рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦреА рдЧрдИ рдлрд╝рд╛рдЗрд▓-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рдФрд░ рд╕реАрдПрд╕рдПрд╕, рд╕реАрдПрд╕рдПрд╕-рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:


.logo {
  background: url("eb4c5fa504857.svg") no-repeat;
  background-size: cover;
  width: 75px;
  height: 65px;
}

рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреГрд╖реНрда рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рд╣рдо рд╕реАрдзреЗ рдЗрдирд▓рд╛рдЗрди рдЫрд╡рд┐рдпреЛрдВ рдХреЛ css рдореЗрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, url-loader рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд file-loaderрдХрд░реЗрдВ :


      {
        test: /\.svg$/,
        use: [
-         'file-loader',
+         'url-loader',
          'svgo-loader'
        ]
      },

рдирд┐рд╖реНрдХрд░реНрд╖:


/dist/main.js

рд╕рдВрдХрд▓рд┐рдд рд╕реАрдПрд╕рдПрд╕ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:


-   background: url("eb4c5fa504857.svg") no-repeat;
+   background: url("data:image/svg+xml;base64,....") no-repeat;

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдХреЗрд╡рд▓ рдЫреЛрдЯреЗ svg- рдЖрдХрд╛рд░ рд╡рд╛рд▓реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 8kb рддрдХ) рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, url-loaderрдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реАрдорд╛ рд╕реЗрдЯрд┐рдВрдЧ рд╣реИ:


      {
        test: /\.svg$/,
        use: [
-         'url-loader',
+         'url-loader?limit=8192',
          'svgo-loader'
        ]
      },

, svg- 8, svg , url-loader file-loader.


, webpack 5 Asset Modules, , url-loader file-loader ( url-loader , , limit).


webpack 5


, , Asset Modules. :


module.exports = {
  // ...
+ experiments: {
+   asset: true
+ }
};

.


, svg- asset , file-loader url-loader тАФ , , - :


      {
        test: /\.svg$/,
-       use: [
-         'url-loader?limit=8000',
-         'svgo-loader'
-       ]
+       type: 'asset',
+       use: 'svgo-loader'
      },

, , type: 'asset' : 8 ( ), , .
use .


asset .


asset/inline


url-loader. , type: 'asset/inline' data-url:


      {
        test: /\.svg$/,
-       type: 'asset',
+       type: 'asset/inline',
        use: 'svgo-loader'
      },

, type: 'asset/inline' data-url.
, svg- mini-svg-data-uri, svg data-url, base64, :


+ const miniSVGDataURI = require('mini-svg-data-uri');
// ...
      {
        test: /\.svg$/,
        type: 'asset/inline',
+       generator: {
+         dataUrl(content) {
+           content = content.toString();
+           return miniSVGDataURI(content);
+         }
+       },
        use: 'svgo-loader'
      },

css:


-   background: url("data:image/svg+xml;base64,....") no-repeat;
+   background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg'....") no-repeat;

data-url.


asset/resource


file-loader. , type: 'asset/resource' :


      {
        test: /\.svg$/,
-       type: 'asset/inline',
+       type: 'asset/resource',
-       generator: {
-         dataUrl(content) {
-           content = content.toString();
-           return miniSVGDataURI(content);
-         }
-       },
        use: 'svgo-loader'
      },


, asset/resource , output.path ( dist), output.assetModuleFilename :


module.exports = {
+ output: {
+   assetModuleFilename: 'assets/[name][ext]'
+ },
  // ...
};

:


/dist/main.js
/dist/assets/logo.svg

[name] [hash] long term caching:


module.exports = {
  output: {
-    assetModuleFilename: 'assets/[name][ext]'
+    assetModuleFilename: 'assets/[hash][ext]'
  },
  // ...
};

:


/dist/main.js
/dist/assets/eb4c5fa504857.svg

, asset-. , svg- dist/icons, asset- dist/assets:


      {
        test: /\.svg$/,
        type: 'asset/resource',
+       generator: {
+         filename: 'icons/[hash][ext]'
+       },
        use: 'svgo-loader'

:


/dist/main.js
/dist/assets/fd441ca8b6d00.png
/dist/icons/eb4c5fa504857.svg

asset/source


raw-loader. , type: 'asset/source' :
file.txt


hello world

webpack.config.js


module.exports = {
       // ...
      {
        test: /\.svg$/,
        type: 'asset/resource',
        generator: {
          filename: 'icons/[hash][ext]'
        },
        use: 'svgo-loader'
      },
+     {
+       test: /\.txt$/,
+       type: 'asset/source'
+     },
      // ...

index.js


import './styles.css';
+ import txt from './file.txt';

+ console.log(txt); // hello world

:


/dist/main.js
/dist/icons/eb4c5fa504857.svg

asset


asset/resource asset/inline, - , . , 8, asset/resource, тАФ asset/inline.


module.exports = {
       // ...
      {
        test: /\.svg$/,
-       type: 'asset/resource',
+       type: 'asset'
-        generator: {
-          filename: 'icons/[hash][ext]'
-        },
        use: 'svgo-loader'
      },
      {
        test: /\.txt$/,
        type: 'asset/source'
      },
      // ...

asset/inline :


      {
        test: /.svg$/,
        type: 'asset',
+       parser: {
+         dataUrlCondition: {
+           maxSize: 20 * 1024 // 20kb
+         }
+       },
        use: 'svgo-loader'
      },

: Asset Modules webpack 5 " ".
.


webpack 5?


. , webpack 5 beta.13, . , webpack 5 ( , production).


P.S


webpack 5 webpack. , , ( webpack) -.


рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рджред


All Articles