本文最后更新于 2024-10-25,文章内容可能已经过时。

webpack是什么,为什么需要webpack

webpack打包构建工具,目前项目比较复杂,开发文件比较多,使用到的新的技术也比较多

es6+ vue typescript等相关技术,为了能够让浏览器正常解析使用webpack将这些技术,通过打包转换为浏览器能够解析运行的代码!

webpack中,不仅可以在浏览器中兼容代码,还可以对代码进行压缩!

webpack 中有哪些配置

常用配置

配置 作用
entry 需要打包的入口文件,可以是单个文件 也可以是多个文件!
output 打包结果输出的文件,文件的存放位置,以及文件名命名规则, 以及引用资源的根路径等。
module 模块相关配置,通过loaders来处理各种文件类型,比如JavaScript,CSS,图片,字体等
plugins 插件相关配置,比如压缩,优化,热更新等。
resolve 解析相关配置,比如可以配置路径别名 模块如何寻找解析顺序,等。
devServer 开发服务器相关配置,提供的开发服务器,可以实时编译,刷新浏览器,提供热更新等功能。
mode 模式相关配置,webpack 的运行模式,可以是开发模式,生产模式等。
optimization 优化相关配置,webpack 打包优化配置,比如压缩,分包,代码分割等。
externals 外部依赖相关配置,比如不打包的依赖,比如jqueryreactvue,等。

其他配置

配置 作用
devtool 调试工具,打包后的文件调试工具,比如source-mapeval-source-mapcheap-module-source-mapcheap-module-eval-source-mapevalnone,等。
stats 打包信息,打包信息配置,比如显示打包后的文件大小显示打包后的模块数量显示错误信息,等。
cache 缓存,缓存配置webpack 缓存配置,缓存可以加快打包速度缓存配置可以缓存 loader缓存插件缓存入口文件缓存输出文件,等。
context 上下文,webpack 运行的上下文默认是当前目录可以指定运行的目录
target 目标环境,webpack 打包的目标环境可以指定浏览器版本可以指定运行环境可以指定运行模式,等。
performance 性能,webpack 打包的性能配置可以指定打包后的文件大小可以指定打包后的文件数量可以指定打包时间限制,等。

手写一个基本配置

const path = require('path')

module.exports = {
  model: 'development', // 开发模式
  // 配置打包入口文件
  entry: path.resolve(__dirname, '../src/index.js'),
  // 配置打包结果输出文件
  output: {
    // 将打包结果的文件放在 dist 目录下
    path: path.resolve(__dirname, '../dist'),
    // 文件名,[name] 代表入口文件的文件名,[chunkhash] 代表打包后的文件 hash 值长度为 8
    filename: '[name].[chunkhash:8].js',
    // 输出文件中引用资源的根路径,默认是 '/'
    publicPath: './',
    clean: true // 每次打包前清空 dist 目录
  },
  // 解析模块查找规则配置
  resolve: {
    // 扩展
    extensions: ['.js', '.json', '.jsx', '.ts', '.tsx'], // 配置解析文件扩展名
    alias: {
      '@': path.resolve(__dirname, '../src') // 配置路径别名
    }
  },
  // 配置模块相关配置
  module: {
    rules: [
      // 解析 js 文件的 loader
      {
        // 匹配文件规则
        test: /\.(js|jsx|ts|tsx)$/,
        // 包含的目录
        include: path.resolve(__dirname, '../src'),
        // 排除 node_modules 目录
        exclude: /node_modules/,
        // 使用的 loader
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env', '@babel/preset-react'],
            plugins: ['@babel/plugin-transform-runtime']
          }
        }
      },
      // 样式 loader 解析规则
      {
        test: /\.css|\.less|\.scss$/,
        use: [
          'style-loader',
          'css-loader',
          'less-loader',
          'sass-loader'
        ]
      },
      // 图片 loader 解析规则
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 10000,
              name: 'static/images/[name].[contenthash:8].[ext]'
            }
          }
        ]
      }
    ]
  }
  // 配置插件相关配置
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, '../public/index.html'),
      filename: 'index.html',
  ],
  // 配置开发服务器相关配置
  devServer: {
  },
}

常见的 loader,loader 作用

webpack只能处理js文件类型,如果要处理其它文件类型,需要使用loaderloader的作用就是将文件转换成webpack可以处理的模块

常用 loader

loader 作用
babel-loader ES6+ 语法转换为 ES5 语法,可以处理 JSX,TypeScript 等。
vue-loader 加载 Vue 组件,可以处理 Vue组件。
style-loader 样式文件插入到 DOM 中,通过 style 标签引用
css-loader 加载 CSS 文件,可以处理 CSS,Less,Sass 等。
less-loader 加载 Less 文件,可以处理 Less 语法。
sass-loader 加载 Sass 文件,可以处理 Sass 语法。
postcss-loader 加载 CSS 文件,可以处理 CSS,Less,Sass 等,可以添加浏览器前缀,自动补全 CSS3 特性。
file-loader 加载文件,可以处理图片,字体等。
url-loader 与 file-loader 类似,但可以设置文件大小限制,超过限制则会使用 DataURL(base64) 格式

其他 loader

loader 作用
html-loader 加载 HTML 文件,可以处理模板文件
raw-loader 加载原始文件,可以处理文本文件
json-loader 加载 JSON 文件。
worker-loader 加载 Web Worker 文件。
expose-loader 暴露模块,可以将模块暴露到全局作用域。
script-loader 加载模块,可以加载模块。
source-map-loader 加载 source map 文件。
ts-loader 加载 TypeScript 文件。
happypack 多进程打包,可以提高打包速度
thread-loader 多线程打包,可以提高打包速度
cache-loader 缓存 loader,可以缓存 loader 的结果。

有哪些常见的 plugin, plugin 作用

webpackplugin插件主要用来打包功能扩展,在打包过程中可以对代码进行优化代码压缩以及打包优化等!

常见的plugin

plugin 作用
html-webpack-plugin 基于 html 模版,生成对应文件的引用关系
clean-webpack-plugin 清空输出目录
webpack-bundle-analyzer 分析打包结果
copy-webpack-plugin 复制文件,可以复制文件到输出目录
mini-css-extract-plugin 提取 CSS 文件,可以提取CSS 文件到单独的文件中。
optimize-css-assets-webpack-plugin 压缩 CSS 文件,可以压缩 CSS 文件。
terser-webpack-plugin 压缩 JavaScript 文件,可以压缩 JavaScript 文件。
webpack-merge 合并 webpack 配置
uglifyjs-webpack-plugin 压缩 JavaScript 文件,可以压缩 JavaScript 文件。
webpack-dev-server 开发服务器,可以实时编译,刷新浏览器,提供热更新等功能。
define-webpack-plugin 定义环境变量,可以定义环境变量
webpack-manifest-plugin 生成 manifest 文件,可以生成 manifest 文件
webpack-parallel-uglify-plugin 多进程压缩 JavaScript 文件,可以提高压缩速度

laoder 和 plugin 的区别

  • loader: 是用来处理webpack打包所不能处理的模块webpack只能处理js文件,像 css 图片 字体 vue 等其它文件需要loader来处理
  • plugin: 是用来扩展webpack功能的,对webpack打包功能等一个增强, 比如压缩,优化,热更新等。

loader(文件类型转换器): 更专注于文件的转换, 是文件转换器,将js除外的文件,转换成webpack可以处理的模块

plugin(webpack功能扩展):更专注于流程扩展, 是webpack的插件,用来扩展webpack的功能,对webpack的打包功能进行增强

babel-loader常见配置

babel-loaderES6+ 语法转换为 ES5 语法,可以处理 JSX,TypeScript 等。 babel-loader高级语法转换为低级语法,这样浏览器才能识别,才能运行

常见预设配置

可以在 .babelrc 或者是 babel.config.js 文件中配置,也可以在 webpack.config.js 文件中配置。 主要有 presets(预设)plugins(插件) 两个配置项。

  • babel-preset-env:用来转换代码到指定环境的浏览器版本,可以指定浏览器版本,也可以指定运行环境,也可以指定运行模式
  • babel-preset-react:用来转换 React 代码。
  • babel-preset-typescript:用来转换 TypeScript 代码。
module: {
  rules: [
    {
      // 匹配文件规则
      test: /\.js|.jsx|ts|tsx$/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: [
            '@babel/preset-env',
            {
              targets: {
                chrome: '58',
                firefox: '57',
                ie: '11'
              },
              useBuiltIns: 'usage',
              corejs: 3
            },
            '@babel/preset-react',
            '@babel/preset-typescript'
          ],
          // plugins: ['@babel/plugin-transform-runtime']
        },
        plugins: ['@babel/plugin-transform-runtime']
      }
  ]
}

webpack 指纹占位符

webpack中的指纹占位符,是对文件命名的一个扩展,可以根据占位符,来生成唯一的文件名

  • [ext]: 文件扩展名
  • [path]文件的相对路径
  • [name]:文件原本的文件名。
  • [id]唯一标识符

常用占位符

  1. [hash]每次构建时,整个项目的hash值都会改变,hash值长度为32
  2. [chunkhash]:只在当前 chunk 有改动的时候, hash 值才会改变,hash值长度为32
  3. [contenthash]:根据文件内容,来决定是否改变!
filename: '[name].[chunkhash:8].js',
filename: '/static/images/[name].[contenthash:8].[ext]'

webpack 打包流程

  1. 读取加载配置文件 根据 entry 入口文件 进行递归解析依赖,找出 importrequire 的模块文件,并将它们加入到依赖图中
  2. 文件类型转换,将非 js 和 json 文件的其它文件,通过 loader 匹配规则进行文件类型转换,转换为 webpack能够理解的模块
  3. 插件处理webpack 通过 plugin打包过程进行额外的处理,比如打包优化资源管理环境变量注入等!
  4. 生产输出Webpack 处理依赖关系后,会生成一个或多个 bundle 文件。这些文件是打包后的 JavaScript 文件,包含了应用程序的所有模块代码
  5. 输出结果,将打包好的 bundle 文件输出到指定目录

chunk(块) bundle(包) 和 module(模块)

  1. chunkwebpack打包分析过程中,会分成多个小块
  2. bundle则是多个chunk组成的js文件
  3. module则是webpack打包过程中,每一个文件都可以视为一个模块

chunk(块)

Webpack中,"chunk"是一个核心概念,它代表了Webpack打包过程中生成的代码块Webpack通过将应用程序分割成多个小块(chunks),然后将这些块打包成一个或多个bundle文件。每个chunk通常包含了一组模块(如JavaScript文件、CSS文件、图片等)的代码,这些模块在运行时可以被加载和执行

bundle(捆绑包)

bundlewebpack打包过程中生成的文件,它是多个chunk组成的。bundle文件可以是js文件,也可以是css文件,也可以是图片文件。

module(模块)

webpack中,每一个文件都可以视为一个模块js 图片 css等文件,通过 loaderplugin来处理,最终转换成打包文件!

如何提高webpack打包速度

  1. 多进程打包: HappyPackthread-loader 这两个插件可以提高webpack打包速度
  2. 缓存: cache-loader 可以缓存loader的结果加快打包速度
  3. 压缩: terser-webpack-pluginuglifyjs-webpack-plugin 这两个插件可以压缩JavaScript文件减少文件体积
  4. 第三方库预先打包: DllPluginDllReferencePlugin 这两个插件可以提前打包第三方库减少打包时间
  5. 缓存中间件: 使用HardSourceWebpackPlugin 可以缓存webpack中间件的结果加快打包速度

减少打包体积大小/性能优化

  1. tree shaking: webpack 内置的 tree shaking 功能,可以自动删除没有用到的代码
  2. 按需加载: webpack 提供了 import() 语法,可以按需加载代码
  3. 代码分割: webpack 提供了 splitChunks 配置,可以自动分割代码
  4. 代码压缩:
    • CSS压缩:optimize-css-assets-webpack-pluginmini-css-extract-plugin 这两个插件可以压缩CSS文件
    • JavaScript压缩:terser-webpack-pluginuglifyjs-webpack-plugin 这两个插件可以压缩JavaScript文件
  5. 图片压缩:image-webpack-loaderGzippedWebpackPlugin 这款插件可以压缩图片
  6. CDN加速: externals 配置可以使用CDN加速

babel-loader是什么,有什么作用

babel-loader是一个webpackloader转换器,它可以将es6+语法转换为浏览器可兼容js代码文件! 在es标准中提出了很多新特性,而浏览器对这些新特性没有实现,所以需要babel来转换为浏览器可以运行的js代码!