从零到一搭建 react 项目系列之(三)

简介: 从零到一搭建 react 项目系列之(三)

正文


接着继续介绍 webpack 配置


从 webpack 4.0 开始,webpack 可以零配置即可进行打包,门槛进一步降低。但是这种方式显然不能满足我们的需求。上面一篇文章中,如果细心的同学会发现,执行 yarn run build 命令,会有一条 WRANING 信息。


WARNING in configuration

The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.

You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/


大概意思,mode 选项没有配置,webpack 会把 production 最为默认配置。

既然这样,我们调整一下 package.json,给它指定了 mode 选项,WARNING 就没有了。

// package.json
{
  "scripts": {
    "build": "webpack --progress --colors --mode=production"
  }
}


那么这 mode 是什么呢?除了这个,还有什么配置选项呢?


一、先了解 webpack 一些核心配置


这里我不再讲述,里面有链接,可以点击去了解。后续文章,对这些配置也会有更详细的介绍。

  • 入口(entry)
  • 输出(output)
  • 加载器(loader)
  • 插件(plugin)
  • 模式(mode)


二、开始写页面了


最最最简单的 webpack 打包已经学会了,那么我们如何进行开发呢?

按照我们传统写前端的方式,它应该要有一个 HTML 文件,然后将 JS、CSS、图片等等引入到其中,这就构成了我们的前端页面。

但其实,webpack 只能读取 JavaScriptJSON 文件,这是开箱可用的自带能力。那么遇到 CSS、Image、HTML 文件 webpack 如何处理呢?那么它就需要 loader 加载器去处理它们。

这里我们借助一个 html-webpack-plugin 来生成我们的 HTML 文件。

# 安装 html-webpack-plugin
$ yarn add --dev html-webpack-plugin@3.2.0


接着我们在项目根目录添加一个 webpack.config.js 的文件。

// webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
const config = {
  plugins: [
    new HtmlWebpackPlugin()
  ]
}
module.exports = config


然后我们重新打包,看下会发生什么?

$ yarn run build


7.webp.jpg


它给我们生成了 index.html 文件,并将我们打包后的 main.js 引入其中了。然后我们使用浏览器打开 index.html 文件可以看到控制台打印了 Hello Webpack!

到此为止,我们最最最简单的需求已经完成了。使用 webpack 打包了一个前端页面。


三、优化我们输出的 HTML 文件


其实啊,html-webpack-plugin 也可以根据提供的模板HTML来生成的符号我们要求的样子。


给自己提个需求,在 index.html 要有一个立即函数表达式(IIFE,Immediately Invoked Function Expression)去执行某些动作。(具体什么不重要)


再借助上述的方法显然是不合适的,那我们怎么办呢?


  1. /src 下新建一个 index.html 文件

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title><%= htmlWebpackPlugin.options.title %></title>
    </head>
    <script>
        !(function() {
            console.log('给自己加需求,什么人啊!怕不是脑子有毛病吧')
        })()
    </script>
    <body>
        <div id="app">This is app.</div>
    </body>
</html>


  1. 修改 webpack.config.js 配置。

const HtmlWebpackPlugin = require('html-webpack-plugin')
const config = {
  plugins: [
    new HtmlWebpackPlugin({
      title: 'Hi', // 模板要使用 <title><%= htmlWebpackPlugin.options.title %></title> 配置才生效
      template: './src/index.html', // 模板路径
      filename: 'index.html', // 输出 HTML 文件名称
      inject: 'body', // 插入的 script 标签位于 body 底部,true 同理
      hash: true, // 加上 hash 值
      favicon: './src/favicon.ico'
    })
  ]
}
module.exports = config


简单介绍一下 html-webpack-plugin 的配置:

  • title:生成 HTML 文件的标题,需配合 <%= htmlWebpackPlugin.options.title %> 使用。
  • template:模板所在的文件路径,它可以是 html、jade、ejs、hbs 等。但是需要安装对应的 loader,否则 webpack 将不能解析。
  • filename:输出 HTML 文件名称。
  • inject:注入选项,可选值:truebodyheadfalse
    1)true:默认值,script 标签位于 HTML 文件的 body 底部;
    2)body:同 true;
    3)head:script 标签位于 head 标签内;
    4)false:不插入生成的 js 文件,只是单纯的生成一个 HTML 文件。
  • favicon:网站的 favicon 图标。
  • hash:默认值 false。给生成的 js 文件一个独特的 hash 值,该 hash 值是本次 webpack 编译的 hash 值(如下图)。
  • minify、cache、chunks...:这些选择就不介绍了,有兴趣自行搜索查找。


  1. 打包结果:

    7.webp.jpg


四、除此之外


利用 clean-webpack-plugin 来清除 output 输出文件。

为什么要这样做呢?

假如我们输出 HTML 的 filename 是变化的,那么每打包一次输出的 dist 目录,就会不断地积累各种旧版本的输出文件,显然这并不是我们想要的。(可自行体验一下)

配置 clean-webpack-plugin 也是很简单,如下:

$ yarn add --dev clean-webpack-plugin@3.0.0

// package.json
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const config = {
  plugins: [
    new HtmlWebpackPlugin({
      title: 'Hi', // 模板要使用 <title><%= htmlWebpackPlugin.options.title %></title> 配置才生效
      template: './src/index.html', // 模板路径
      filename: 'index.html', // 输出 HTML 文件名称
      inject: 'body', // 插入的 script 标签位于 body 底部,true 同理
      hash: true, // 加上 hash 值
      favicon: './src/favicon.ico'
    }),
    // 新版无需再指定删除目录,默认删除 output 目录
    new CleanWebpackPlugin()
  ]
}
module.exports = config


最后附上:

// package.json
{
    "name": "webpack4_demo",
    "version": "1.0.0",
    "description": "从零到一搭建 react 项目",
    "main": "src/index.js",
    "repository": "git@github.com:toFrankie/webpack4_demo.git",
    "author": "Frankie <1426203851@qq.com>",
    "license": "MIT",
    "private": true,
    "scripts": {
        "build": "webpack --progress --colors --mode=production"
    },
    "dependencies": {
        "webpack": "4.41.2",
        "webpack-cli": "3.3.10"
    },
    "devDependencies": {
        "clean-webpack-plugin": "3.0.0",
        "html-webpack-plugin": "3.2.0"
    }
}


目录
相关文章
|
6月前
|
前端开发 JavaScript 测试技术
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
182 0
|
6月前
|
前端开发 API 数据安全/隐私保护
【第45期】一文解决React项目的权限管理
【第45期】一文解决React项目的权限管理
336 0
|
6月前
|
Web App开发 资源调度 JavaScript
竟然可以在一个项目中混用 Vue 和 React?
竟然可以在一个项目中混用 Vue 和 React?
666 0
|
6月前
|
运维 JavaScript 前端开发
发现了一款宝藏学习项目,包含了Web全栈的知识体系,JS、Vue、React知识就靠它了!
发现了一款宝藏学习项目,包含了Web全栈的知识体系,JS、Vue、React知识就靠它了!
100 2
|
6月前
|
存储 JSON 前端开发
react保姆级搭建新项目
此文主要以ts+vite+router6+antd 快速搭建一个react项目,适用于初学者,用于学习交流
109 2
|
6月前
|
移动开发 JavaScript 前端开发
vue/react项目刷新页面出现404的原因以及解决办法
vue/react项目刷新页面出现404的原因以及解决办法
696 0
|
6月前
|
存储 资源调度 前端开发
【React | 完整项目创建流程】能看到这么详细的React配置流程,就偷着乐吧!
【React | 完整项目创建流程】能看到这么详细的React配置流程,就偷着乐吧!
214 1
|
6月前
|
前端开发 JavaScript API
Github 上 8 个很棒的 React 项目
Github 上 8 个很棒的 React 项目
1524 0
|
6月前
|
前端开发 开发工具 git
React项目包结构的作用
React项目包结构的作用
114 0
|
6月前
|
前端开发
React 中 react-i18next 切换语言( 项目国际化 )
React 中 react-i18next 切换语言( 项目国际化 )
595 0
下一篇
无影云桌面