webpack 知识体系基础 | 青训营笔记

90 阅读3分钟

webpack 知识体系基础

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

1、什么是webpack

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

webpack本身默认只对JavaScript文件进行处理,其他类型的文件需要配置loader或者plugins进行处理; 

webpack将多种静态资源js、css、less转换成一个静态文件,减少了页面的请求

  • 多份资源文件打包成一个 Bundle

  • 支持 Babel、Eslint、TS、CoffeScript、Less、Sass

  • 支持模块化处理 css、图片等资源

  • 支持 HMR + 开发服务器

  • 支持持续监听、持续构建

  • 支持代码分离

  • 支持 Tree-shaking

  • 支持 Sourcemap 等

2、Webpack 的用法

2.1 运用流程

1.安装 Webpack:

npm i -D webpack webpack-cli

2.编辑配置文件

// webpack.config.js
    module.exports = {
        entry: './src/index.js',
        output: {
            filename: "[name].js",
            path: path.join(__dirname,"./dist"),
        },
        module: {
           rules: [{
               test: /\.less$/i,
               use: ['style-loader','css-loader','less-loader']
           }], 
        }
    }

3.执行编译命令:

npx webpack

会在根目录的 dist 文件夹下得到编译出的打包文件 main.js

核心流程:入口处理、依赖解析、资源解析、资源合并打包

image.png

2.2 Webpack 本质上完成的事情:模块化 + 一致性

-   多个文件资源合并成一个,减少 HTTP 请求数
-   支持模块化开发
-   支持高级JS特性
-   支持 typescript、CoffeeScript 语言
-   统一图片、CSS、字体等其他资源的处理模型

3、webpack 使用方法

关于 Webpack的使用方法,基本都围绕配置展开,而这些配置大致可划分为两类:

流程类:作用于流程中某个or若干个环节,直接影响打包效果的配置项

工具类:主流程之外,提供更多工程化能力的配置项

流程类配置

image.png

使用示例

文件结构:

image.png

1、声明入口entry

module.exports = {
entry: "./src/index"
};

2、声明产物出口output

const path = require("path");
module.exports = {
  entry: "./src/index",
  output: {
    filename : "[name].js",
    path: path.join(__dirname, "./dist"),
  }
};

3、运行npx webpack

loader

webpack可以处理js代码,并且webpack会自动处理js之间相关的依赖;

但是,在开发中不仅仅只有基本的js代码需要被处理,也需要加载cssimg、也包括将一些高级的ES6的转化成ES5、将ts转化成es5,将scss、less转化成css、将.jsx,.vue转化成js文件;

对于webpack本身的能力来说,这些转化是不支持的;

解决:给webpack扩展对应的loader

1、通过npm安装所需要的使用的loader

npm add -D css-loader style-loader

2、添加module处理

const path = require("path");
module.exports = {
  entry: "./src/index",
  output: {
    filename : "[name].js",
    path: path.join(__dirname, "./dist"),
  },
  module: {
// css处理器
  rules: [{
    test: /\.css/i,
    use: [
      "style-loader",
      "css-loader"
      ],
  }],
},
};
  • Loader 的特性:

    • 链式执行(前一个 loader 的输出可能是另一个 loader 的输入)
    • 支持异步执行
    • 分为 normal 和 pitch 两种模式

Tree-Shaking

Tree-shaking的本质是消除无用的js代码。无用代码消除在广泛存在于传统的编程语言编译器中,编译器可以判断出某些代码根本不影响输出,然后消除这些代码,这个称之为DCE(dead code elimination)

在 webpack 项目中,有一个入口文件,相当于一棵树的主干,入口文件有很多依赖的模块,相当于树枝。实际情况中,虽然依赖了某个模块,但其实只使用其中的某些功能。通过 Tree-Shaking,将没有使用的模块摇掉,这样来达到删除无用代码的目的。

开启Tree-shaking:

module.exports = { 
  entry:"./src/ index",
  mode: "production",
  devtool: false,
  optimization: {
  usedExports: true,
 },
}