「使用 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
文件查看我们可以看到图片资源已生效:
至此,我们已经可以在代码里引入图片和字体资源了