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