React+TypeScript+webpack4多入口配置详解

yizhihongxing

这里就为您详细讲解“React+TypeScript+webpack4多入口配置详解”。

一、概述

在前端开发中,React是目前比较流行的UI库,而TypeScript则是JavaScript的超集,通过在JavaScript基础上增加类型系统等特性,提高了代码的可靠性。

在React和TypeScript项目中,我们通常需要使用webpack作为打包工具,而webpack4则是目前比较稳定而且常用的版本。

本文将在讲解webpack4多入口配置的基础上,结合React和TypeScript,帮助大家构建一个高质量的前端项目。

二、webpack4多入口配置

1. 基础配置

首先,我们需要在项目根目录下创建一个webpack.config.js文件,用于存放webpack的配置信息。

const path = require('path');

module.exports = {
  entry: {
    index: './src/index.tsx',
    about: './src/about.tsx'
  },
  output: {
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  resolve: {
    extensions: ['.ts', '.tsx', '.js', '.jsx']
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/
      }
    ]
  }
};

在以上代码中,我们首先使用require引入了path模块,然后在module.exports中配置了入口文件和输出文件的路径。

其中,entry字段指定了多个入口文件,这样webpack会将多个入口文件打包在一起,生成多个输出文件;output字段指定了输出文件的文件名和路径;resolve字段用于配置webpack识别的文件后缀名;module字段用于配置webpack的loader,处理.tsx?文件。

2. HtmlWebpackPlugin配置

使用HtmlWebpackPlugin可以自动将多个入口文件打包在一起,并在输出文件中生成对应的<script>标签。

首先,我们需要通过npm install --save-dev html-webpack-plugin安装HtmlWebpackPlugin。

然后,在webpack.config.js中引入该插件,并修改module.exports如下:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: {
    index: './src/index.tsx',
    about: './src/about.tsx'
  },
  output: {
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  resolve: {
    extensions: ['.ts', '.tsx', '.js', '.jsx']
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: 'React+TypeScript+webpack4多入口配置详解'
    })
  ]
};

在以上代码中,我们首先通过require引入了HtmlWebpackPlugin模块,然后在plugin字段中引入该插件。

3. 热替换配置

开启热替换可以在开发时提高开发效率,下面我们来介绍如何开启热替换功能。

首先,我们需要通过npm install --save-dev webpack-dev-server来安装webpack-dev-server

然后,在webpack.config.js中添加以下代码:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  ...
  devServer: {
    contentBase: './dist',
    hot: true
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: 'React+TypeScript+webpack4多入口配置详解'
    })
  ]
};

在以上代码中,我们首先通过devServer.contentBase字段指定了开发服务器的根目录,在这里即为输出文件的路径;devServer.hot字段指定了开启热替换功能。

最后,在package.json中添加以下命令:

"scripts": {
  "start": "webpack-dev-server --open"
},

运行npm start命令即可启动开发服务器,并自动打开浏览器。

三、React+TypeScript实践

在以上完成了webpack4多入口配置的基础上,我们现在来介绍如何结合React和TypeScript实现一个完整的应用。

首先,我们需要通过npm install --save-dev react react-dom @types/react @types/react-dom安装React和TypeScript的相关模块。

接下来,我们在src目录下创建App.tsx

import React from 'react';

interface Props {
  name: string;
}

export default function App(props: Props) {
  return (
    <div>
      Hello, {props.name}!
    </div>
  );
}

在以上代码中,我们首先定义了一个Props接口,用于约束传入App组件的属性;然后定义了一个App组件,用于输出一段简单的问候语。

接下来,我们将App组件在index.tsxabout.tsx中分别引入并渲染。

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
  <App name="world" />,
  document.getElementById('root')
);

以上代码中,我们首先引入了React和ReactDOM模块,然后引入了App组件,最后渲染了一个传入name属性为worldApp组件,并将其挂载到index.html中的<div id="root"></div>中。

我们需要在public目录下创建一个index.html文件,并添加以下代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>React+TypeScript+webpack4多入口配置详解</title>
</head>
<body>
  <div id="root"></div>
</body>
</html>

在以上代码中,我们首先定义了一个空的<div>标签,并将其id设置为root,用于承载React组件的渲染结果;然后设置了网页标题。

最后,在package.json文件中添加以下命令:

"scripts": {
  "build": "webpack",
  "start": "webpack-dev-server --open"
},

运行npm run start命令即可在浏览器中看到效果。

四、示例说明

1. Todo List

下面,我们将通过一个简单的Todo List示例来进一步巩固所学知识。

首先,我们需要安装react-icons模块,用于引入图标文件。在终端中运行以下命令:

npm install --save-dev react-icons

接着,我们在src目录下创建以下文件:

  • components/TodoList.tsx
  • components/TodoItem.tsx
  • assets/icon-delete.svg

其中,assets/icon-delete.svg是一个SVG图标文件,用于在TodoItem组件中实现删除功能。

接着,在TodoList.tsx文件中添加以下代码:

import React, { useState } from 'react';
import { MdDelete } from 'react-icons/md';
import TodoItem from './TodoItem';

interface TodoItem {
  id: number;
  content: string;
  completed: boolean;
}

export default function TodoList() {
  const [items, setItems] = useState<TodoItem[]>([]);
  const [inputValue, setInputValue] = useState('');

  const handleAddClick = () => {
    if (inputValue.trim()) {
      setItems([...items, {
        id: Date.now(),
        content: inputValue.trim(),
        completed: false
      }]);
      setInputValue('');
    }
  };

  const handleDelete = (id: number) => {
    setItems(items.filter(item => item.id !== id));
  };

  const handleContentChange = (id: number, newContent: string) => {
    setItems(items.map(item => {
      if (item.id === id) {
        item.content = newContent;
      }
      return item;
    }));
  };

  const handleToggleComplete = (id: number) => {
    setItems(items.map(item => {
      if (item.id === id) {
        item.completed = !item.completed;
      }
      return item;
    }));
  };

  return (
    <div>
      <h1>Todo List</h1>

      <div>
        <input type="text" value={inputValue} onChange={e => setInputValue(e.target.value)} />
        <button onClick={handleAddClick}>Add</button>
      </div>

      {items.map(item => (
        <TodoItem
          key={item.id}
          item={item}
          onDelete={handleDelete}
          onContentChange={handleContentChange}
          onToggleComplete={handleToggleComplete}
        />
      ))}

      {items.length === 0 && (
        <p>No items yet.</p>
      )}
    </div>
  );
}

在以上代码中,我们首先定义了一个TodoItem接口,用于约束Todo项的属性;然后定义了一个TodoList组件,用于将所有事项渲染出来,并处理添加/删除/修改/完成等操作。

其中,我们使用了useState来存储Todo项列表和输入框的值;使用了handleAddClickhandleDeletehandleContentChangehandleToggleComplete来处理各种事件;使用了<TodoItem>组件来渲染Todo项;使用了条件渲染的方式,当Todo项为空时,渲染一段提示信息。

接下来,在TodoItem.tsx文件中添加以下代码:

import React, { useState } from 'react';
import { MdDelete } from 'react-icons/md';

interface Props {
  item: {
    id: number;
    content: string;
    completed: boolean;
  };
  onDelete: (id: number) => void;
  onContentChange: (id: number, newContent: string) => void;
  onToggleComplete: (id: number) => void;
}

export default function TodoItem(props: Props) {
  const [isEditing, setIsEditing] = useState(false);
  const [inputValue, setInputValue] = useState(props.item.content);

  const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setInputValue(e.target.value);
  };

  const handleEnterKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
    if (e.keyCode === 13) {
      if (inputValue.trim()) {
        setIsEditing(false);
        props.onContentChange(props.item.id, inputValue.trim())
      } else {
        props.onDelete(props.item.id);
      }
    }
  };

  return (
    <div>
      <input type="checkbox" checked={props.item.completed} onChange={() => props.onToggleComplete(props.item.id)} />
      {isEditing ? (
        <input type="text" value={inputValue} onChange={handleInputChange} onKeyDown={handleEnterKeyDown} />
      ) : (
        <span onClick={() => setIsEditing(true)}>{props.item.content}</span>
      )}
      <MdDelete onClick={() => props.onDelete(props.item.id)} />
    </div>
  );
}

在以上代码中,我们首先定义了Props接口,约束TodoItem组件的属性;然后定义了一个TodoItem组件,用于渲染单个Todo项,并处理编辑/删除等操作。

其中,我们使用了useState来存储编辑状态和输入框的值;使用了handleInputChangehandleEnterKeyDown来处理输入框的各种事件;使用了条件渲染的方式,当处于编辑状态时,渲染输入框。

最后,在App.tsx文件中,引入TodoList组件:

import React from 'react';
import TodoList from './components/TodoList';

interface Props {
  name: string;
}

export default function App(props: Props) {
  return (
    <div>
      <TodoList />
    </div>
  );
}

重新运行npm run start命令,即可在浏览器中看到效果。

2. 倒计时

下面,我们将通过一个倒计时示例来进一步巩固所学知识。

首先,在src目录下创建以下文件:

  • components/Countdown.tsx

接着,在Countdown.tsx文件中添加以下代码:

import React, { useState, useEffect } from 'react';

interface Props {
  seconds: number;
}

export default function Countdown(props: Props) {
  const [remainingSeconds, setRemainingSeconds] = useState(props.seconds);

  useEffect(() => {
    const timer = setInterval(() => {
      setRemainingSeconds(s => s - 1);
    }, 1000);

    return () => {
      clearInterval(timer);
    };
  }, []);

  return (
    <div>
      {remainingSeconds > 0 ? remainingSeconds : 0}
    </div>
  );
}

在以上代码中,我们首先定义了Props接口,约束Countdown组件的属性;然后定义了一个Countdown组件,用于渲染倒计时,以及处理计时器的逻辑。

其中,我们使用了useStateuseEffect来存储剩余秒数,以及处理计时器的逻辑;使用了条件渲染的方式,当剩余秒数为0时,渲染0。

最后,在App.tsx文件中,引入Countdown组件:

import React from 'react';
import Countdown from './components/Countdown';

interface Props {
  name: string;
}

export default function App(props: Props) {
  return (
    <div>
      <Countdown seconds={10} />
    </div>
  );
}

重新运行npm run start命令,即可在浏览器中看到效果。

结语

通过本文的讲解,我们已经掌握了React、TypeScript和webpack4多入口配置的基本知识,并通过两个示例加深了对知识点的理解和应用。

当然,本文仅仅是对React、TypeScript和webpack4多入口配置的一个入门介绍,后续我们可以继续深入学习,拓展更多的知识和应用场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:React+TypeScript+webpack4多入口配置详解 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • CSS去除移动端点击时元素产生的背景色 (推荐)

    现在我将会详细讲解如何去除移动端点击时元素产生的背景色。 第一步:使用CSS伪类 我们可以使用CSS伪类 :active 来修改当元素被激活时产生的背景色。为了去除配色方案中 :active 伪类声明的背景色,我们可以将其设置为透明。 下面是针对 div 元素的示例代码: div:active { background-color: transparent;…

    css 2023年6月9日
    00
  • html的基本使用(HTML标签解释)

    下面是关于“html的基本使用(HTML标签解释)”的攻略: HTML的基本使用(HTML标签解释) HTML,全称为“Hyper Text Markup Language”,即超文本标记语言,是Web页面的基础语言,一个页面的总体结构、布局以及内容都是由HTML语言完成的。在HTML中,通过标签来对页面进行组织和定义。 HTML基本基础结构 HTML页面基…

    css 2023年6月9日
    00
  • XHTML标准语法

    XHTML(Extensible HyperText Markup Language)是基于XML的下一代HTML标准,它和HTML一样可以用来定义文档的结构和内容,但是XHTML更加严格,它要求页面标记必须符合XML的语法规范,并且支持XML命名空间和样式表。 下面是XHTML标准语法的完整攻略: 1. 设置XHTML文档类型声明 在XHTML文档中,必须…

    css 2023年6月9日
    00
  • 利用class、id对元素进行分类、标识实例

    当我们在编写HTML文档时,需要将文档中的每个元素进行分类和标识,以便后续的CSS和JavaScript代码可以方便地针对它们进行样式和行为的控制。而在HTML中,我们可以使用class和id属性来对元素进行分类和标识。 利用class属性对元素进行分类 class属性可以为元素定义一个或多个类名,这些类名用空格分隔。一个元素可以同时拥有多个类名,这些类名可…

    css 2023年6月10日
    00
  • 浏览器默认样式(User Agent Stylesheet)的介绍与最佳处理方法

    浏览器默认样式 浏览器默认样式也称为用户代理样式表(User Agent Stylesheet),是浏览器默认加载的样式表。浏览器默认样式是为了方便用户操作网站而存在的。但同时,这些默认样式也可能会干扰到我们网站的设计和布局效果。 为什么需要处理浏览器默认样式 使用浏览器默认样式会导致网站在不同浏览器中显示的效果各异,造成网站的不可预测性。此外,不同浏览器的…

    css 2023年6月11日
    00
  • css鼠标样式cursor介绍(鼠标手型)

    CSS鼠标样式cursor介绍(鼠标手型) 在web开发中,鼠标手型是非常重要的一个细节,它能够用来改善用户体验,让用户更好地与网站进行交互。在CSS中,使用cursor属性来设置鼠标样式,下面我们来详细讲解一下。 常见鼠标样式值 pointer pointer是最常用的鼠标样式值,它表示链接的点击形式,意味着鼠标与链接交互时会显示成“手型”。 示例代码: …

    css 2023年6月10日
    00
  • CSS框架sass的简单一览

    CSS框架sass的简单一览 什么是Sass? Sass (Syntactically Awesome Stylesheets) 是一种预处理器,它是 CSS 的一个扩展,在样式表中加入了一些预编译的语法,使得开发者可以更简洁地编写 CSS,同时也使样式表更易于维护和扩展。 Sass的安装 首先确保你电脑里已经安装了Ruby,具体可参考官方文档 https:…

    css 2023年6月9日
    00
  • CSS中背景的Linear Gradients(线性渐变)应用

    下面是关于CSS中背景的Linear Gradients(线性渐变)应用的完整攻略: 一、Linear Gradients的基本概念 线性渐变是CSS3的特性之一,用于控制元素的背景颜色,让颜色在元素背景上逐渐过渡,呈现出平滑的渐变效果。它基于渐变函数linear-gradient(),可以自定义颜色和方向。渐变函数的语法如下: background: li…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部