webpack学习笔记

相关命令

打包

webpack

查看打包相关详细信息

webpack --stats detailed

设置打包入口文件

webpack --entry 文件路径

设置打包模式

webpack --mode production/development

修改文件自动打包

webpack --watch

热更新(ctrt+s后页面自动更新内容)

  1. 先安装依赖
npm i webpack-dev-server
  1. 修改配置项

      devServer: {
        // 提供静态文件目录地址,就是热更新时候浏览器编译的文件目录
        static: './dist',
      }
    

    3.启动项目

    webpack-dev-server
    

插件

插件提供了一些额外的强大功能,我的理解相当于游戏外挂

html-webpack-plugin

功能: 自动帮你生成html文件,并且让你在生成html时以其他html文件作为模板

npm安装依赖

npm install --save-dev html-webpack-plugin

配置项文档

const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
  plugins: [new HtmlWebpackPlugin()],
};

配置项笔记

变量名类型示例描述
titleString我好帅生成的html文件标题
templateString将生成的html文件以哪个现有的html文件作为模板
filenameString | Functionindex.html生成的html文件名
injectString | Booleanbody将生成的jscss文件插入到哪里

mini-css-extract-plugin

功能: css抽离插件(抽离成单独的css文件)

使用:

1.安装依赖

npm i mini-css-extract-plugin -D

2.引入

const MineCssExtractPlugin = require('mini-css-extract-plugin')

3.插件注册

 plugins: [
    new HtmlWebpackPlugin({
      // 标题
      title: 'aavv',
      // 以哪个html为模板
      template: './src/index.html',
      // 生成的html文件名
      filename: 'app.html',
      // 脚本等相关文件注入到哪里
      inject: 'body',
    }),
     // here
    new MineCssExtractPlugin({
      filename: 'css/[contenthash].css',
    }),
    new CssMinimizerPlugin(),
  ],

4.loader使用

{
        test: /\.(css|scss)$/,
        use: [MineCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
      },

css-minimizer-webpack-plugin

css压缩插件

1.安装依赖

npm i css-minimizer-webpack-plugin

2.引入

const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')

3.配置

  // 优化配置
  optimization: {
    minimizer: [new CssMinimizerPlugin()],
  },

terser-webpack-plugin

js代码压缩插件

该插件在webpack5自带,直接引入并配置就行

// js压缩插件webpack5内置该插件无需安装,仅在生产环境有效
const TerserPlugin = require("terser-webpack-plugin");
 optimization: {
    // 通过自定义插件覆盖默认插件配置
    minimizer: [new TerserPlugin()],
      },

Assets Module

资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader。其实就是废弃了以前的什么file-loader,url-loader等等资源处理的插件.

asset/resource

将资源原样输出到打包后的文件夹

asset/inline

将图片资源转成base64

asset/source

将文件源代码原样输出

module: {
    // 配置规则
    rules: [
      {
        // 匹配哪些文件
        test: /\.png$/,
        // 同之前的file-loader
        // file-loader 就是一个可以用来处理图片字体等文件资源的 loader,它的处理方式是将资源复制到打包后的文件夹,并重命名。
        type: 'asset/resource',
        // 生成的文件信息
        generator: {
          // 文件名 contenthash:根据文件内容生成hash值
          filename: 'img/[contenthash][ext]',
        },
      },
      {
        test: /\.(svg|png)$/,
        // 目前的理解是图片转成base44
        type: 'asset/inline',
      },
      {
        test: /\.txt$/,
        // 将文件源代码原样输出
        type: 'asset/source',
      },
    ],
  },

loader

loader可以让webpack拥有解析除jsjson以外格式的文件比如css,图片文件

加载scss文件

安装依赖

    "css-loader": "^6.7.1",
    "node-sass": "^7.0.1",
    "sass": "^1.50.0",
    "sass-loader": "^12.6.0",
    "style-loader": "^3.3.1",

配置

      {
        test: /\.(css|scss)$/,
        use: ['style-loader', 'css-loader', 'sass-loader'],
      },

babel-loader

babel-loader能将es6以及更高的语法转成es5的

安装依赖

npm install -D babel-loader @babel/core @babel/preset-env

继续安装依赖

npm i @babel/plugin-transform-runtime
npm install --save @babel/runtime

webpack配置

      {
        test: /\.js$/,
        // 排除node_modules文件夹下的文件
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          // babel-loader的配置项
          options: {
            presets: ['@babel/preset-env'],
            plugins: [['@babel/plugin-transform-runtime']],
          },
        },
      },

postcss-loader

github地址postcss

postcss-loader能让你项目中的css具有一些超能力,该loader有很多插件

autoprefixer

提高兼容性,自动给部分样式加前缀

安装以下依赖

 postcss  postcss-loader autoprefixer

webpack配置

      {
        test: /\.(css|scss)$/,
        use: [MineCssExtractPlugin.loader, 'css-loader', 'sass-loader', 'postcss-loader']
      },

根目录新建postcss.config.js文件

​ 该文件可以理解为对postcss工具的一些配置

使用autoprefixer

module.exports = {
  plugins: {
    autoprefixer: {
    }
  }
}

代码分包

1.动态导入(懒加载)

使用import.then语法

懒加载的好处就是打包的体积不变,但是浏览器对于使用懒加载的模块是不会去加载这些js文件的,用到的时候才会加载这些文件

1.1 魔法注释

/* webpackChunkName: "my-chunk-name" */

相关的块起名字,名字将在打包后的文件夹下看到

/*webpackPrefetch: true */

浏览器会在空闲时间把模块下载下来,存到缓存中

缺点: 不利于网页流量统计

还有一个webpackPreload,但是好像不常用,也是预加载,但是优先级跟别的chunk块是一样的

2.插件配置

    //  一个插件,用来抽离公共代码
     splitChunks: {
       // all不管是异步加载还是同步加载的公共模块都会被抽离
       chunks: 'all',
     },

3.多个入口起点

 entry: {
    // 多个入口打包
    index: './src/index.js',
    // another: './src/lodash.js',
  },

源代码追踪

devtool配置

选项描述
eval加载速度快,但是没有正确显示错误行号
source-map直接打个.map文件出来,会显示源代码错误行号
eval-source-map能够正确追踪到行号,初次加载速度慢
cheap-eval-source-map没有列追踪,只能追踪到行
cheap-module-eval-source-map跟上面差不多,module相当于支持babel这种预编译工具

代码校验

webpack中使用es-lint工具进行代码校验

安装依赖

npm install eslint -S

快速生成配置文件

npx eslint --init

webpack5需要安装EslintWebpackPlugin插件来使webpack在打包时es-lint生效

npm安装 eslint-webpack-plugin

npm install eslint-webpack-plugin --save-dev

然后把插件添加到你的 webpack 配置

const ESLintPlugin = require('eslint-webpack-plugin');

module.exports = {
  // ...
  plugins: [new ESLintPlugin(options)],
  // ...
};

解析(resolve)

设置模块如何被解析

配置别名(alias)

module.exports = {
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  }
	}

优化相关

externals下的配置可以将第三方包打包时排除在外,其中key值为import a from b中的b,value就目前的理解为你全局使用的那个变量.

 externals:{
      jQuery: '$'
    }

可视化分析工具

npm安装依赖

npm install webpack-bundle-analyzer –save-dev

require引入

const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')

安装插件

plugins: [
    // 可视化分析插件
    new BundleAnalyzerPlugin()
  ]

执行命令浏览器打开可视化界面

webpack serve

Tree Shaking

这个选项是webpack默认开启的,import但没有使用的东西,会被视为dead code``webpack将不会打包这些模块,但webpack打包是很智能的,它会自动判断这个模块有没有被使用,就是说你如果import一个css文件,我测试的时候是不管你用没用里面的样式,这个css文件都会参与打包。我发现在打包的时候这个摇树还是很智能的。

sideEffects

该选项接收可以接收的参数有,true,false,数组,并且该配置项在package.json文件夹下,true表示所有的文件都有副作用,不能打包删除,false表示所有的打包文件都没副作用,dead code可以被删除,数组: [“*.js”],表示所有的js文件都有副作用,不能被剔除。

Polyfills

项目打包时不一定所有的高级语法特性都会被转为浏览器能识别的es5以以前的语法,这时候polyfills(垫片)就很好的解决了这一个问题,让某些浏览器不支持的语法(api)变得能够支持

thread-loader

插件地址

这个loader能够让其它loader另开线程打包,说的简单点,就是对于那些打包时耗时比较长的loader,采用thread-loader另开线程,增加打包速度,每个另开线程的启动时间为600ms,慎用!

一些配置

const path = require('path')
// 插件
// html自动生成插件
const HtmlWebpackPlugin = require('html-webpack-plugin')
// css抽离插件
const MineCssExtractPlugin = require('mini-css-extract-plugin')
// css压缩插件
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
// js压缩插件webpack5内置该插件无需安装,仅在生产环境有效
const TerserPlugin = require('terser-webpack-plugin')
// eslint-插件
const ESLintPlugin = require('eslint-webpack-plugin')
// 可视化分析插件
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
module.exports = {
  // 打包的入口文件
  entry: {
    // 多个入口打包
    index: './src/index.js'
    // another: './src/lodash.js'
  },
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  },
  output: {
    // 生成的js名字
    filename: 'js/[name].[contenthash].js',
    // 输出的文件目录
    path: path.resolve(__dirname, 'dist'),
    // 每次打包清除dist文件夹下面的内容
    clean: true,
    // 默认输出的静态资源文件名
    assetModuleFilename: 'images/[contenthash][ext]',
    // 打包后生成的资源路径前缀
    publicPath: './'
  },
  devServer: {
    // 提供静态文件目录地址,就是热更新时候浏览器编译的文件目录
    static: './dist'
  },
  // 追踪源代码出错位置
  devtool: 'inline-source-map',
  // 开发环境 | 生产环境
  mode: 'production',

  plugins: [
    new HtmlWebpackPlugin({
      // 标题
      title: 'aavv',
      // 以哪个html为模板
      template: './src/index.html',
      // 生成的html文件名
      filename: 'app.html',
      // 脚本等相关文件注入到哪里
      inject: 'body'
    }),
    // css抽离插件
    new MineCssExtractPlugin({
      filename: 'css/[contenthash].css'
    }),
    // 代码校验插件
    new ESLintPlugin()
    // 可视化分析插件
    // new BundleAnalyzerPlugin()
  ],
  module: {
    // 配置规则
    rules: [
      // {
      //   // 匹配哪些文件
      //   test: /\.png$/,
      //   // 同之前的file-loader
      //   // file-loader 就是一个可以用来处理图片字体等文件资源的 loader,它的处理方式是将资源复制到打包后的文件夹,并重命名。
      //   type: 'asset/resource',
      //   // 生成的文件信息
      //   generator: {
      //     // 文件名 contenthash:根据文件内容生成hash值
      //     filename: 'img/[contenthash][ext]',
      //   },
      // },
      {
        test: /\.(svg|png)$/,
        // 目前的理解是图片转成base44
        type: 'asset/inline'
      },
      {
        test: /\.txt$/,
        // 将文件源代码原样输出
        type: 'asset/source'
      },
      {
        test: /\.jpg$/,
        // 让webpack自己选转base64还是转成图片存到打包后的文件夹
        type: 'asset',
        // 解析器
        parser: {
          // 资源转换规则
          dataUrlCondition: {
            // 图片小于2M转base64
            maxSize: 2 * 1024 * 1024
          }
        }
      },
      {
        test: /\.(css|scss)$/,
        use: [MineCssExtractPlugin.loader, 'css-loader', 'sass-loader', 'postcss-loader']
      },
      {
        test: /\.js$/,
        // 排除node_modules文件夹下的文件
        exclude: /node_modules/,
        use: [
          'thread-loader',
          {
            loader: 'babel-loader',
            // babel-loader的配置项
            options: {
            // 支持一系列es6语法
              presets: ['@babel/preset-env'],
              // 支持async await语法
              plugins: [['@babel/plugin-transform-runtime']]
            }
          }]
      }
    ]
  },
  // 优化配置
  optimization: {
    // 通过自定义插件覆盖默认插件配置
    minimizer: [new CssMinimizerPlugin(), new TerserPlugin()],
    // 一个插件,用来抽离公共代码
    splitChunks: {
      // all不管是异步加载还是同步加载的公共模块都会被抽离
      // chunks: 'all',
      // 哪些模块需要缓存,一般第三方模块需要缓存
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all'
        }
      }
    }
    // 对于import却没有使用的模块,不参与打包
    // usedExports: true
  },
  // 排除打包的依赖
  externals: {
    lodash: '_'
  }
}

博客

欢迎访问我的博客www.smartxy.cc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值