Webpack 5 - Modul Aset

Selamat siang. Dengan posting ini saya ingin memulai serangkaian artikel tentang fitur-fitur baru dari webpack yang akan datang. Mengapa saya ingin berbicara tentang webpack? Setidaknya karena saya mengambil bagian aktif dalam pengembangannya dan terus-menerus mempelajari bagian dalamnya. Dalam posting ini saya ingin berbicara tentang Modul Aset - fitur eksperimental webpack 5, yang memungkinkan Anda untuk menyingkirkan beberapa loader yang sudah dikenal, sambil tetap mempertahankan manfaatnya.


Bayangkan kita perlu merakit halaman dengan gambar dan gaya.


Solusi Webpack 4


Konfigurasi webpack 4 untuk tugas ini mungkin terlihat seperti ini:
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;
}

Kesimpulan:


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

Dengan pendekatan ini, semua file svg akan diproses menggunakan svgo dan menggunakan file-loader yang ditempatkan di direktori dengan bundel yang dirangkai, dan css, menggunakan css-loader , akan berubah menjadi sesuatu seperti ini:


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

Pada titik tertentu, kami mungkin perlu mengoptimalkan halaman kami dan kami mungkin ingin langsung menampilkan gambar dalam css. Untuk melakukan ini, ganti file-loaderdengan url-loader :


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

Kesimpulan:


/dist/main.js

CSS yang dikompilasi akan berubah sebagai berikut:


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

Lebih jauh, kita mungkin ingin hanya sebaris kecil yang berukuran svg (misalnya, hingga 8 kb), dan meninggalkan sisanya sebagai file terpisah. Untuk ini, url-loaderada pengaturan batas khusus:


      {
        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) -.


Terimakasih atas perhatiannya.


All Articles