Webpack知识体系 | 青训营笔记

67 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第17天

1.重点内容

在目前前端项目的开发中,作为团队协同开发,webpack是比不可少的,因此这节课就webpack为中心,构建webpack相关的知识体系。

2.重要的知识点

  • 为什么要学习Webpack?
  • 什么是Webpack
  • Webpack打包核心
  • Loader组件
  • Plugin组件
  • 学习Webpack

3.详尽的知识点

为什么要学习Webpack?

  • 理解前端工程化的概念、工具、目标
  • 成为个人的核心竞争力
  • 通往高阶前端的必修

什么是Webpack

在前端的开发过程中,随着技术的迭代和发展,所包含的文件数量越来越多,这是就需要一个工具来管理这些文件。

此时Webpack等工程化工具的出现,引出了前端工程的概念。

Webpack本质上是一种前端资源编译、打包工具。

Webpack打包核心

使用Webpack

  1. 安装Webpack
  2. 编辑配置文件 webpack.config.js
  3. 执行编译命令

核心流程

  1. 入口处理,从"entry"文件开始,启动编译流程
  2. 依赖解析,根据"require","import"等语句找到依赖资源
  3. 资源解析,根据"module"配置,将非标准JS资源转译成JS内容
  4. 资源合并打包,将转译后的资源内容合并打包为可直接运行的JS文件

其中第二第三步两步递归调用,解析所有资源文件。

如何使用Webpack

使用Webpack的核心就是围绕配置展开,配置可以大致分为两类

  • 流程类

    • 作用于打包流程中的某个环节,直接影响打包效果
    • entry/output
    • module/plugins
    • mode
  • 工具类

    • 提高更多工程化能力的配置项
    • watch/devServer/devtool

以处理CSS为例

  • 安装处理CSS的Loader
> npm add -D css-loader style-loader
复制代码
  • 添加"module"处理CSS文件
module.exports = {
    module: {
        rules: [{
            test: /.css/i,
            use: [
                "style-loader",
                "css-loader"
            ]
        }]
    }
}
复制代码

处理JS文件

  • 安装依赖
> npm i -D @babel/core @babel/preset-env babel-loader
复制代码
  • 声明产物出口
module: {
        rules: [{
            test: /.js/i,
            use: [
                loader: 'babel-loader',
                options: {
                presets: [
                    [
                        '@babel/preset-env'
                    ]
                ]
            }
        ]
    }]
}
复制代码
  • 执行命令
> npx webpack
复制代码

处理HTML文件

  • 安装依赖
> npm i -D html-webpack-plugin
复制代码
  • 声明产物出口
plugins: [new HTMLWebpackPlugin()]
复制代码
  • 执行命令

提升代码效率

  • HMR(Hot Module Replacement) 模块热替换
  • Tree-Shaking 删除无用代码
  • 缓存
  • Sourcemap
  • 性能监控
  • ...

Loader组件

因为Webpack只认识JS文件,所以我们需要使用Loader组件将其他语言的资源转译成JS文件来被Webpack识别。

Loader的链式调用

以CSS处理为例

  1. 首先使用less-loader将less转译成css
  2. 使用css-loader将CSS包包装成module.exports = "${css}"的内容
  3. 使用style-loader将CSS包进require语句,调用injectStyle将内容注入到style标签

Loader的特性

  • 链式执行
  • 支持异步执行
  • 分normal、pitch模式

Plugin组件

插件在许多知名工具如VS Code,Web Storm中很常见,使用插件已经成为日常开发中必不可少的内容,但是为什么要使用插件而不是直接集成在软件内部,这是我们需要考虑的。

使用插件的原因:

  • 如果集成在软件内部,则整个流程细节会很复杂,上手成本高
  • 功能迭代的成本高
  • 功能僵化,缺乏成长性
  • ...

使用插件的原因就是对扩展开发,对修改封闭。

学习Webpack

  • 理解打包流程
  • 掌握常用配置项,loader,插件的使用方法
  • 掌握常见手脚架
  • 理解Loader,Plugin机制
  • 理解性能优化方法手段
  • 理解前端工程化和生态现状
  • 阅读源码,参与开源共建

4.课后总结

Webpack作为常用工具,作为开发人员不仅需要掌握其使用方法,更应该掌握Webpack的相关知识体系。这样更有利于团队化,工程化的前端项目。