webpack4+react+antd从零搭建React脚手架(二)

2023-05-16

接着上文,对webpack 的配置的优化和对css,图片的编译。以及引入antd
项目代码地址react-project

优化webpack

生成的文件名添加Hash值

output: {
    filename: "js/[name].[chunkhash].js",
},

生产过程中,清理dist文件夹。安装插件 clean-webpack-plugin

npm install --save-dev clean-webpack-plugin
  • 修改 webpack.prod.conf.js
const CleanWebpackPlugin = require('clean-webpack-plugin');
...
module.exports = merge(baseWebpackConfig, { 
	 plugins: [
	 	new CleanWebpackPlugin(['../dist'], { allowExternal: true })
	]
})

添加热加载模块

yarn add --save-dev webpack-dev-server

在build中添加webpack.dev.conf.js文件

const path = require('path');
const merge = require('webpack-merge');
const baseWebpackConfig = require('./webpack.base.conf.js');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');


module.exports = merge(baseWebpackConfig, {
  mode: 'development',
  output: {
    filename: "js/[name].[hash:16].js",
  },
  // 源错误检查
  devtool: 'inline-source-map',
  plugins: [
    // 处理html
    new HtmlWebpackPlugin({
      template: 'public/index.html',
      inject: 'body',
      minify: {
        html5: true
      },
      hash: false
    }),
    // 热更新
    new webpack.HotModuleReplacementPlugin(),
  ],
  // 热更新
  devServer: {
    port: '3000',
    contentBase: path.join(__dirname, '../public'),
    compress: true,
    historyApiFallback: true,
    hot: true, //开启
    https: false,
    noInfo: true,
    open: true,
    proxy: {}
  }
});

在package.json scripts属性添加内容

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "build": "webpack --config build/webpack.prod.conf.js",
  },

npm run dev
自动打开浏览器打开入口页面实时更新

对 css less sass 文件进行处理

  • 安装依赖
npm install extract-text-webpack-plugin
npm install style-loader css-loader postcss-loader autoprefixer --save-dev
npm install less sass less-loader sass-loader stylus-loader node-sass --save-dev
  • webpack.base.conf.js 文件修改
// webpack.base.conf.js
 {
        test: /\.css$/,
        use: ['style-loader', 'css-loader',],
      },
{
   test:/\.less$/,
   use: [
         {  loader: "style-loader"  },
         {  loader: "css-loader" },
         {
            loader: "postcss-loader",//自动加前缀
            options: {
                   plugins:[
                          require('autoprefixer')({
                              browsers:['last 5 version']
                          })
                  ]
            }
         },
         {  loader: "less-loader" }
     ]
},
      {
        test: /\.scss$/,
        use: [
          { loader: "style-loader" },
          {
            loader: "css-loader",
          },
          { loader: "sass-loader" },
          {
            loader: "postcss-loader",
            options: {
              plugins: [
                require('autoprefixer')({
                  browsers: ['last 5 version']
                })
              ]
            }
          }
        ]
      },

对图片和字体进行编译

  • 安装依赖
npm i file-loader url-loader --save-dev

webpack.base.conf.js 文件修改

{
        test: /\.(png|jpg|gif)$/,
        use: [{
          loader: 'url-loader',
          options: {
            // outputPath:'../',//输出**文件夹
            publicPath: '/',
            name: "images/[name].[ext]",
            limit: 1000  //是把小于1000B的文件打成Base64的格式,写入JS
          }
        }]
      },
      {
        test: /\.(woff|svg|eot|woff2|tff)$/,
        use: 'url-loader',
        exclude: /node_modules/
        // exclude忽略/node_modules/的文件夹
      }

然后可以在index.js引入一个图片还有css文件进行编译试试看。

对生成的代码进行分析

引入依赖

yarn add webpack-bundle-analyzer -D

在/ webpack.prod.conf.js 文件

// webpack.prod.conf.js 文件
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
...

  plugins: [
   
    // 分析哪些文件体积过大
    new BundleAnalyzerPlugin(),

  ],

引入antd

这里开始出现天坑了,巨坑了
mdzz的。

antd的文档地址Ant Design

安装antd
现在从 yarn 或 npm 安装并引入 antd。

yarn add antd

修改index.js,引入 antd 的按钮组件。

import React from "react";
import ReactDom from "react-dom";
import { Button, Switch } from 'antd';

import styles from './index.less'
import Pic from './g.jpg'


const Div = document.createElement("div");
Div.setAttribute("id", "root")
document.body.appendChild(Div)
ReactDom.render(
  <div>
    <h1 className={styles.green}>hello, world!333</h1>
    <img src={Pic}></img>
    <Button type="primary">Primary</Button>
    <Switch defaultChecked />
  </div>,
  document.getElementById("root")
);

这时候100%的没有效果。
官方文档在引入antd的css时候,给了两种方案。文档链接。

  1. 一种是在index.css,在文件顶部引入 antd/dist/antd.css
  2. 另一种是按需加载组件代码和样式。

这里使用了一个新的插件babel-plugin-import

yarn add babel-plugin-import

官方文档指出 babel-plugin-import
修改.babelrc文件

{
  "presets": [
    "react",
    "env"
  ],
  "plugins": [
    [
      "import",
      {
        "libraryName": "antd",
        "libraryDirectory": "lib",
        "style": true
      }
    ]
  ]
}

babel-plugin-import的使用方法babel-plugin-import。
这时候,文档已经解释完毕。

结果发现完全按照文档写的结果还是不行!!!

谷歌半天的坑才知道还需要的webpack配置的js里面进行配置一下。
我这里是将antd的样式改写为less,引入的。所以如果需要覆盖样式的话。一定要将后缀改为.less
直接上配置
less配置了两遍,一遍还不行,别问我为什么。我也不知道。

 {
        test: /\.css$/,
        use: ['style-loader', 'css-loader',],
      },
      {
        test: /\.less$/,
        use: [
          { loader: 'style-loader' },
          { loader: 'css-loader' },
          {
            loader: "postcss-loader",
            options: {
              plugins: [
                require('autoprefixer')({
                  browsers: ['last 5 version']
                })
              ]
            }
          },
          // javascriptEnabled: true  ------  在less里面可以使用JavaScript表达式
          { loader: 'less-loader', options: { javascriptEnabled: true } },
        ],
        // 切记这个地方一定要引入antd,文档上没有写入但是一定要因引进去,切记切记
        include: [/antd/],
      },
      {
        test: /\.less$/,
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              modules: true,
              sourceMap: true,
              localIdentName: '[name]__[local]--[hash:base64:5]',
            },
          },
          {
            loader: "postcss-loader",
            options: {
              plugins: [
                require('autoprefixer')({
                  browsers: ['last 5 version']
                })
              ]
            }
          },
          { loader: 'less-loader', options: { javascriptEnabled: true } },
        ],
        exclude: [/antd/],
      },

至此大工告成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webpack4+react+antd从零搭建React脚手架(二) 的相关文章

随机推荐

  • IntelliJ IDEA 2020.1 正式发布,15 项重大特性、官方支持中文了! | 原力计划

    头图 amp 作者 YourBatman xff0c CSDN博客专家 责编 唐小引 出品 CSDN xff08 ID xff1a CSDNnews xff09 前言 千呼万唤始出来 xff01 自从官方在 2020 01 20 发布了其
  • 状态观测器

    干扰 xff0c 输出 xff0c 系统内状态都是一种状态 xff0c 状态观测器可以扩展干扰观测器 定义系统实际输出和理论输出的误差d xff0c 对d求导得到一个公式 xff0c 系统理论输出求导得到一个公式 xff0c 组建成二元方程
  • python更新pip失败-解决Python pip 自动更新升级失败的问题

    在使用python pip的时候 xff0c 经常会发生pip版本过低导致失败的情况 xff0c 这时候 xff0c 系统会提示让你使用如下命令对pip进行升级更新 xff1a python m pip install upgrade pi
  • es6小记

    const let关键字 let xff1a 声明 使js存在块级作用域 const xff1a 定义常亮 xff0c 定义以后不可以更改 若是引用的类型 xff0c 那可以更改他的属性 const a 61 b 789 br a b 61
  • js检测浏览器内核、版本号

    js检测浏览器内核 版本号 span class hljs function span class hljs keyword function span span class hljs title isBroswer span span c
  • 点击地图获取经纬度(基于腾旭地图api)

    废话不多说上图 接着代码段 xff08 注意 xff1a 这里的key要换成自己的key xff09 span class hljs doctype lt DOCTYPE html gt span span class hljs tag l
  • dataTable使用

    官网 DataTable英文网址 DataTables中文网址 DataTables一些例子 本文主要是围绕下面的例子进行讲解的 xff0c 请看效果图 说明 xff1a 全选功能 xff0c 点击删除 xff0c 批量删除 xff0c 批
  • 判断checkbox 是否选中

    checkbox 选中事件 首先input的标签设置checkbox lt input name 61 span class hljs string 34 operaMode 34 span span class hljs class sp
  • jQuery添加新元素/内容

    整理了一下jq添加元素 HTML的一些操作 xff0c 效果图见下 结构插入 内部插入 append 在被选元素的结尾插入内容 appendTo 方法在被选元素的结尾 xff08 仍然在内部 xff09 插入指定内容 prepend 在被选
  • 高德地图开发bug

    第一次使用的时候报错 INVALID USER DOMAIN 然后百度了一下 xff0c 官方文档上是这么说的 xff1a xff0c 请先检查一下您在申请Key的时候 xff0c 是否设置了域名白名单 xff0c 如果设定了 xff0c
  • 新 iPhone SE 卖 3299 元起,香不香?

    作者 吴波 来源 网易科技 xff08 ID xff1a tech 163 xff09 4 月 15 日 xff0c 等待了 1485 天之后 xff0c 当年的 4 英寸 性能小钢炮 iPhone SE 终于迎来全新升级款 The New
  • 图片剪裁并预览上传

    预览效果 详细代码讲解 现在有点忙 xff0c 稍后便会讲解 demo下载地址图片剪裁并预览上传
  • js实现下载功能

    js实现下载功能 最近需要做一个下载功能 xff0c 然后到网上查了查 xff0c 顺便写了个小demo xff1b 在h5新特性里面 xff1b a标签有个download的属性 xff1b span class hljs tag lt
  • 前端js免费的CDN网站

    1 BootCDN http www bootcdn cn 目前前端开源的项目几乎都涵盖了 xff0c 支持http和https 2 百度静态资源公共库 http cdn code baidu com 一个是稳定 xff0c 快速 xff0
  • js区号插件(全国电话区号)

    最近由于要和美团和饿了么外卖对接 xff0c 地址要输入区号 xff1b 网上百度没有找到插件 xff1b 于是自己就动手撸了一个 xff1b 效果图见下 xff1b 为什么第一个是浙江呢 xff0c 因为我在杭州啊 xff01 xff01
  • 那些看过的好文章

    我总结的js性能优化的小知识http www cnblogs com liyunhua p 4529086 html19 个 JavaScript 有用的简写技术https segmentfault com a 11900000126738
  • java小白成长记02

    位运算符 左移 lt lt 就是乘以2的次幂运算 xff0c 移几位就是几次幂 xff1b 3 lt lt 3即为3 2 2 2 61 24 xff1b 6 lt lt 2即为6 2 2 61 24 xff1b 右移 gt gt 就是除以2
  • web前端开发-谷歌浏览器插件

    搜集了一些web前端开发所需要的谷歌浏览器插件 xff1b 具体内容见下图 xff1b 下载地址 使用方法 xff1a 点击谷歌浏览器右上角 gt 更多工具 gt 扩展程序 xff1b 直接将 crx文件拖进去即可安装 xff1b
  • webpack4+react+antd从零搭建React脚手架(一)

    本人是在windows环境下搭建的 xff0c ios自行摸索 代码地址PreByter 项目初始化 首先就是项目初始化 xff0c 一定确保安装node或者yarn二者均可 xff0c npm init 或者 yarn init 此时会生
  • webpack4+react+antd从零搭建React脚手架(二)

    接着上文 xff0c 对webpack 的配置的优化和对css xff0c 图片的编译 以及引入antd 项目代码地址react project 优化webpack 生成的文件名添加Hash值 output filename 34 js n