webpack的使用

136 阅读4分钟

四大核心概念

entry(入口)

entry详细配置

种类

  • 单入口
  • 多入口

配置

  • 字符串 标准单入口,用于单页面应用
  • 数组 多个文件合并为一个入口,一般进行动态链dll配置
  • 对象 每个属性为一个入口,用于多页面应用
  • 函数 函数return上面三种之一

单入口

const path = require('path');

module.exports = {
  entry: path.resolve(__dirname, '../src/page/entry.js')
}

多入口

const path = require('path');

module.exports = {
  entry: {
  	admin: path.resolve(__dirname, '../src/page/admin/entry.js'),
    ticket: path.resolve(__dirname, '../src/page/ticket/entry.js'),
  }
}

ouput(输出)

ouput详细配置

常用配置

  • filename(输出文件的名字,可以写死,也可以使用下面方式自动匹配键名就可以对应多个入口)
  • path(指定输出的目录)
  • chunkFilename(除了入口外生成的文件名字)
  • publicPath(指定文件打包后的引用路径,一般生产环境配置)

哈希值(跟缓存相关,每次打包发布后,哈希值不变的,打开页面就不需要重新获取,直接拿缓存)

webpack提供了这几种hash:

  • hash(所有文件哈希值都一样,每次打包所有都将改变)
  • chunkhash(针对entry每一个入口文件,如果其中一个发生改变,只会改变这个entry的哈希值,其他不会改变,也就是每个入口下生产的哈希值一样,如果修改某个入口的内容,只会变更这个入口下的哈希值,但是修改了公共文件,那么所有入口的哈希值都将改变,缓存都将失效)
  • contenthash(所有打包出来的文件哈希值都不一样,内容不变,哈希值就不变)

三种哈希讲解链接

单入口对应输出

const path = require('path');

module.exports = {
  output: {
    filename: 'main.js', // 出口文件名
    chunkFilename: '[name].[chunkhash].js',
    path: path.resolve(__dirname, '../dist'),
    publicPath: 'http://www.baidu.com' // 页面内打包文件的引用路径前都加上这个
  }
}

多入口对应输出

const path = require('path');

module.exports = {
  output: {
    filename: '[name].[chunkhash].js', // 根据入口名字命名
    chunkFilename: '[name].[chunkhash].js',
    path: path.resolve(__dirname, '../dist'),
    publicPath: 'http://www.baidu.com'
  }
}

loader(帮助处理打包js外的内容)

module.rules(loader配置在这里面)

  • test(loader处理时匹配到的范围)
  • include(loader处理时只包括的范围)
  • exclude(loader处理时排除的范围)
  • loader(使用单个loader)
  • use(数组,使用多个loader)
  • options(loader的配置项)
module.exports = {
  module: {
    rules: [
      {
        test: /\.(woff2?|eot|ttf|otf)$/i, // 单个loader与它的配置项
        loader: "url-loader", 
        options: {
          limit: 10000,
          name: "[name].[hash:7].[ext]",
          outputPath: "fonts",
        },
      },
      {
        test: /\.less$/i, // 多个loader和它的配置项
        use: [
          "vue-style-loader",
          {
            loader: "css-loader",
            options: {
              importLoaders: 2,
            },
          },
          "postcss-loader",
          "less-loader",
        ],
      },
    ],
  },
};

常用的loader

文件相关(字体)

详细配置

  • url-loader
  • file-loader

js相关

详细配置

  • babel-loader
  • @babel/core (babel核心包)
  • @babel/preset-env (预设插件,里面包含一系列插件,通过.browserslistrc文件设置需要兼容的浏览器,避免兼容所有)
  • @babel/runtime-corejs3
  • @babel/plugin-transform-runtime (帮助runtime引入,避免冗余引入减小打包体积,其中corejs与之配合提供了沙盒环境利用假名避免全局污染,如果是corejs3,还提供corejs2不支持的实例方法.)

css相关

详细配置

  • css-loader(处理.css文件)
  • style-loader(添加css进style标签内)
  • postcss-loader(兼容,补全浏览器前缀)
  • less-loader(处理.less文件)

vue相关

详细配置

  • vue-loader
  • vue-style-loader (与style-loader差不多,只不过这个支持服务端渲染)

plugins(大多数用于优化代码,扩展loader)

让webpack能够执行更多任务,从优化和压缩,到重新定义环境中的变量,非常强大

插件目的在于解决loader无法实现的其他事。

使用时,只需要require它,并添加到plugins数组,通过new实例化即可

const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports = {
  plugins: [
    new CleanWebpackPlugin()
  ]
}

优化

开发环境

生产环境(主要做体积优化)

  • mini-css-extract-plugin (css提取) 详细配置
  • optimize-css-assets-webpack-plugin (css压缩) 详细配置
  • terser-webpack-plugin (压缩js,生产环境默认开启,但是配置css压缩需要在minimizer配置,所以需要重新配置) 详细配置
  • html-webpack-plugin (压缩html,简化html文件的创建) 详细配置
  • tree-shaking (生产模式自动开启,但要注意引入代码有需要运行的(副作用)文件,需要通过package.json的sideEffects属性排除)
  • splitChunks (代码分割) 详细配置
  • externals (通过cdn引入的第三方,可以在这里设置后排除打包) 详细配置
  • import (预加载和懒加载,预加载慎用)

打包速度

  • thread-loader (多线程打包)
  • DLL动态链
  • 使用inclue和exclude(减少需要编译的文件)
  • babel缓存(cacheDirectory)
  • module.noParse(排除不需要被loader编译的第三方库)

其他

  • clean-webpack-plugin (清理输出文件) 详细配置
  • stats (配置控制台输出的信息,对于webpack-dev-server,devServer放于对象内) 详细配置
  • resolve (模块如何解析,路径相关) 详细配置
  • webpack-merge (方便拆分开发环境和生产环境配置文件) 详细配置
  • cross-env (跨平台设置环境变量) 详细配置
  • progress-bar-webpack-plugin (编译进度条) 详细配置