webpack知识体系|青训营笔记

100 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第6天,今天学习的是构建webpack知识体系。根据老师授课内容,本文的角度主要从什么是webpack和如何使用webpack展开。

webpack是什么

前端项目由各种各样的资源构成,js css html以及各种静态文件现在又有了如sass less这样的预编译css,以及ts这种js的超集语言,以及各个框架比如vue 和 jsx tsx等等文件构成,种类繁多的资源文件组织起来非常繁琐,在像webpack之类的这种自动化打包编译工具出现之前,只能手动管理,并且还很难支持新的语言特性如ts sass less等工具,这些问题都对开发效率有很大的影响,为了解决这样的问题,webpack这类工具就产生了。

webpack本质上是一种前端资源编译、打包工具。它可以做到以下功能

  • 多份资源文件打包成一个Buddle
  • 支持Babel、eslint、ts、less、sass
  • 支持模块化处理css、图片等资源文件
  • 支持HMR+开发服务器
  • 支持持续监听、持续构建
  • 支持代码分离
  • 支持Tree-Shaking
  • 支持SourceMap.
  • ……

学习使用webpack是前端工程化的必经之路,也是走向资深前端工程师不可或缺的一环。

使用webpack

webpack使用各种loader babel plugin将各种前端资源文件打包成浏览器可以识别的bundle.js文件,所以使用webpack的过程就是学会熟悉使用webpack各种配置项配置loader babel 和plugin。

基本使用

  1. 安装脚手架
npm i -D webpack webpack-cli
  1. 编辑配置文件wbpack.config.js
const path = require("path");
module.exports = {
  entry: "./index.js",
  output: {
    filename: "[name].js",
    path: path.join(__dirname, "./dist"),
  },
  mode: "development",
};

  1. 执行编译命令
npx webpack
  1. 生产环境打包下的代码如下
/*
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ (() => { // webpackBootstrap
/******/ 	var __webpack_modules__ = ({

/***/ "./index.js":
/*!******************!*\
  !*** ./index.js ***!
  \******************/
/***/ (() => {

eval("console.log(\"hhhhh\");\r\n\n\n//# sourceURL=webpack:///./index.js?");

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module can't be inlined because the eval devtool is used.
/******/ 	var __webpack_exports__ = {};
/******/ 	__webpack_modules__["./index.js"]();
/******/ 	
/******/ })()
;

核心流程

  1. webpack从entry入口文件开始启动编译流程。
  2. 依赖解析,对于文件中出现的import require语句找到依赖项。
  3. 资源解析,根据module配置项使用loader babel等配置将非js文件转为js内容,2、3递归调用直至所有内容解析完毕。
  4. 资源合并打包成一个可以在浏览器上可运行的bundlejs文件。

使用loader

以使用css loader为例,webpack只能识别js内容,遇到像css这种非js文件需要先通过对应的loader将非js文件转为js文件。loader的使用需要在配置项module中处理,使用如下:

  • 先安装对应loader
npm install --save-dev style-loader css-loader 
  • 配置loader规则
    • test是匹配文件
    • use 匹配到的文件使用什么loader
const path = require("path");
module.exports = {
  entry: "./index.js",
  output: {
    filename: "[name].js",
    path: path.join(__dirname, "./dist"),
  },
  module: {
    rules: [
      {
        test: /\.css/i,
        use: ["style-loader", "css-loader"],
      },
    ],
  },
  mode: "development",
};

使用babel

babel 是一个工具链,主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。这里以解析es6的类语法为例使用

  • 安装babel依赖
npm i -D @babel/core @babel/preset-env babel-loader
  • 修改配置
const path = require("path");
module.exports = {
  entry: "./index.js",
  output: {
    filename: "[name].js",
    path: path.join(__dirname, "./dist"),
  },
  module: {
    rules: [
      {
        test: /\.css/i,
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.js?$/,
        use: [
          {
            loader: "babel-loader",
            options: {
              presets: [["@babel/preset-env"]],
            },
          },
        ],
      },
    ],
  },
  mode: "development",
};

使用插件

这里以自动生成HTML的plugin使用为例

  • 安装依赖
npm i -D html-webpack-plugin
  • 修改配置文件
const path = require("path");
const HTMLWebpackPlugin = require("html-webpack-plugin");
module.exports = {
  entry: "./index.js",
  output: {
    filename: "[name].js",
    path: path.join(__dirname, "./dist"),
  },
  module: {
    rules: [
      {
        test: /\.css/i,
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.js?$/,
        use: [
          {
            loader: "babel-loader",
            options: {
              presets: [["@babel/preset-env"]],
            },
          },
        ],
      },
    ],
  },
  plugins: [new HTMLWebpackPlugin()],
  mode: "development",
};

学习路径

新手向掌握以下知识点

image.png

webpack的三个等级

image.png