ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

「使用 webpack 5 从0到1搭建React + TypeScript 项目环境」3. 资源模块

2022-01-12 21:01:48  阅读:242  来源: 互联网

标签:TypeScript module loader React webpack asset 模块 declare


「使用 webpack 5 从0到1搭建React + TypeScript 项目环境」3. 资源模块

资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader

webpack 5 之前,通常使用:

资源模块类型(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文件查看我们可以看到图片资源已生效:

image-20220112204539791

至此,我们已经可以在代码里引入图片和字体资源了

标签:TypeScript,module,loader,React,webpack,asset,模块,declare
来源: https://blog.csdn.net/p1967914901/article/details/122462173

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有