「使用 webpack 5 从0到1搭建React + TypeScript 项目环境」3. 资源模块
资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader。
在 webpack 5 之前,通常使用:
raw-loader将文件导入为字符串url-loader将文件作为data URI内联到bundle中file-loader将文件发送到输出目录
资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader:
asset/resource发送一个单独的文件并导出URL。之前通过使用file-loader实现。asset/inline导出一个资源的data URI。之前通过使用url-loader实现。asset/source导出资源的源代码。之前通过使用raw-loader实现。asset在导出一个data URI和发送一个单独的文件之间自动选择。之前通过使用url-loader,并且配置资源体积限制实现。
当在 webpack 5 中使用旧的 assets loader(如 file-loader/url-loader/raw-loader 等)和 asset 模块时,你可能想停止当前 asset 模块的处理,并再次启动处理,这可能会导致 asset 重复,你可以通过将 asset 模块的类型设置为 'javascript/auto' 来解决。
接下来我们简单介绍一下如何配置,详细请看资源模块 | webpack 中文文档 (docschina.org)
我们在webpack.config.common.js中添加如下配置:
{ test: /\.(png|jpg|jpeg|gif|woff|woff2|eot|ttf|otf)$/i, type: "asset/resource", generator: { filename: 'static/[hash][ext][query]' }, },
接下来我们在src/index.tsx中引入图片:
import React from 'react'; import ReactDOM from 'react-dom'; import jpg from './assets/picture.jpg' const App = () => { return ( <> <p>hello world</p> <img src={jpg} alt="" width='100px' height='100px'/> </> ); }; ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById("root") );
由于这里我们通过 ES6 的方式导入图片,为了使 TypeScript 可以识别图片模块,我们需要在src/typings.d.ts中加入以下内容:
declare module "*.svg"; declare module "*.png"; declare module "*.jpg"; declare module "*.jpeg"; declare module "*.gif"; declare module "*.bmp"; declare module "*.tiff";
通过yarn build打包后,打开html文件查看我们可以看到图片资源已生效:
至此,我们已经可以在代码里引入图片和字体资源了
