webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)

news2025/4/23 7:02:49

目录

  • 1、webpack简介
  • 2、简单示例
  • 3、入口(entry)和输出(output)
  • 4、自动生成html文件
  • 5、打包css代码
  • 6、优化(单独提取css代码)
  • 7、优化(压缩过程)
  • 8、打包less代码
  • 9、打包图片
  • 10、搭建开发环境(webpack-dev-server)
  • 11、打包模式
  • 12、打包模式的应用
  • 13、前端项目中注入环境变量
  • 14、开发环境中使用 source map 调试
  • 15、 解析别名(alias)
  • 16、优化-生产环境下使用CDN
  • 17、多页面打包
  • 18、优化-分割公共代码
  • 19、完整的示例代码
  • 20、webpack打包和不打包的区别
  • 21、webpack 打包原理和 Babel 的作用
  • 22、插件(Plugin) 和 加载器(Loader)区别

以下代码根据 哔哩哔哩黑马程序员视频整理

1、webpack简介

更多内容和配置请查看webpack官网

在这里插入图片描述

2、简单示例

在这里插入图片描述

在这里插入图片描述

3、入口(entry)和输出(output)

  1. 新建配置文件:在项目根目录创建 webpack.config.js 文件,用于配置 Webpack 打包行为。

  2. 配置入口(entry

    • 确定入口文件路径,使用 path.resolve 方法获取绝对路径,避免路径错误。
    • 示例:
      // 引入 Node.js 内置的 path 模块,用于处理文件路径,确保路径解析的正确性 
      const path = require('path');  
      module.exports = {  
      // __dirname 表示当前文件(webpack.config.js)所在的目录路径,
        entry: path.resolve(__dirname, 'src/login/index.js'), // 入口文件路径  
      };  
      
  3. 配置出口(output

    • path:指定打包输出目录的绝对路径。
    • filename:定义输出文件的名称及路径(相对于 path)。
    • 示例:
      module.exports = {  
        //...  
        output: {  
          path: path.resolve(__dirname, 'dist'), // 输出目录  
          filename: './login/index.js' // 输出文件名及路径  
        }  
      };  
      
  4. 重新打包:执行打包命令(如 webpack 或自定义脚本),观察输出结果。只有与入口文件有直接或间接引入关系的模块才会被打包。

通过以上配置,可精准控制 Webpack 的打包入口和出口,确保项目资源按预期输出,提升构建效率与文件管理的规范性。

4、自动生成html文件

使用 html - webpack - plugin 自动生成 html 文件的步骤及配置示例,解析如下:

  1. 下载插件
    • 命令 npm i html - webpack - plugin --save - dev,用于在项目中安装 html - webpack - plugin 作为开发依赖,以便在 Webpack 打包时使用该插件生成 html 文件。
  2. 配置 webpack.config.js
    • 引入插件:const HtmlWebpackPlugin = require('html - webpack - plugin')
    • module.exportsplugins 数组中添加插件实例,通过 template 指定模板文件(如 ./public/login.html),通过 filename 指定输出文件路径及名称(如 ./login/index.html),使 Webpack 具备利用该插件处理 html 文件的能力。
  3. 重新打包观察效果
    • 执行打包命令(如 webpack),插件会根据配置,基于模板文件生成指定的 html 输出文件,自动引入打包后的资源(如 js 文件),无需手动创建或维护 html 文件。

这些步骤实现了在 Webpack 构建过程中自动生成 html 文件,简化项目开发流程。

// 引入 html - webpack - plugin 插件,该插件用于在 Webpack 打包过程中自动生成 HTML 文件
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    // 其他配置(如 entry、output 等)可能在此处省略
    plugins: [
        // 创建 HtmlWebpackPlugin 的实例,配置生成 HTML 的相关选项
        new HtmlWebpackPlugin({
            // 指定模板文件的路径
            template: './public/login.html', 
            // 指定生成的 HTML 输出文件的路径和名称
            // 该路径是相对于 Webpack 配置中 output.path 的目录
            filename: './login/index.html' 
        })
    ]
};

5、打包css代码

以下是对打包 CSS 代码相关内容的解析:

1. 加载器作用

  • css - loader:主要负责解析 CSS 代码,例如处理 @importurl() 等语句,将 CSS 文件转换为 JavaScript 模块,使其能被 Webpack 理解和处理。
  • style - loader:把 css-loader 解析后的 CSS 代码以 <style> 标签的形式插入到 HTML 的 DOM 中,从而让样式生效。

2. 操作步骤解析

  • 步骤1:准备 CSS 文件代码并引入到 src/login/index.js 中(可能还会进行压缩转译等处理)。这一步是为后续的打包做准备,确保 CSS 代码能被项目所使用。
  • 步骤2:使用 npm i css-loader style-loader --save -dev 下载 css-loaderstyle-loader 本地软件包。--save -dev 表示将其保存为开发依赖,因为这些加载器仅在开发和构建过程中使用,而不是在生产环境运行时使用。
  • 步骤3:在 webpack.config.js 中进行配置,让 Webpack 拥有加载 CSS 的功能。以下是配置代码的详细注释:
module.exports = {
    //... 其他配置(如 entry、output 等,此处省略未展示部分)
    module: {
        rules: [
            {
                // test 字段用于匹配文件,这里 /\.css$/i 表示匹配所有以.css 结尾的文件,i 表示不区分大小写
                test: /\.css$/i, 
                // use 字段指定使用的加载器,加载器的执行顺序是从右到左(从后往前)
                // 先使用 css-loader 解析 CSS 代码,再使用 style-loader 将解析后的代码插入到 DOM 中
                use: ["style-loader", "css-loader"], 
            },
        ],
    },
};
  • 步骤4:执行打包命令后,观察打包效果,确保 CSS 样式在最终的页面中正确呈现。

3. 注意事项
Webpack 默认只识别 JavaScript 代码,所以对于 CSS 等其他类型的文件,需要通过相应的加载器来处理,使其能够被正确打包和使用。
在这里插入图片描述

6、优化(单独提取css代码)

插件作用
mini-css-extract-plugin 插件主要用于将 CSS 代码从 JavaScript 模块中提取出来,生成单独的 CSS 文件。这样做的好处是 CSS 文件可以被浏览器缓存,减少 JavaScript 文件的体积,提高页面加载性能。

操作步骤解析

  1. 下载软件包:使用 npm install --save -dev mini-css-extract-plugin 命令将该插件作为开发依赖安装到项目中。--save -dev 表示此插件仅在开发和构建过程中使用,而非生产环境。
  2. 配置 webpack.config.js
    • 首先引入插件:const MiniCssExtractPlugin = require("mini-css-extract-plugin"),通过 require 函数引入插件模块,并将其赋值给 MiniCssExtractPlugin 变量。
    • 然后在 module.rules 中配置 CSS 处理规则:
module.exports = {
    //... 其他配置(如 entry、output 等,此处省略未展示部分)
    module: {
        rules: [
            {
                test: /\.css$/i,
                // 之前使用 style - loader 和 css - loader,现在用 MiniCssExtractPlugin.loader 替代 style - loader
                use: [MiniCssExtractPlugin.loader, "css-loader"], 
            },
        ],
    },
    plugins: [
        // 实例化插件,启动插件功能
        new MiniCssExtractPlugin() 
    ]
};

这里 test: /\.css$/i 用于匹配所有以 .css 结尾的文件,use 数组指定了处理 CSS 文件的加载器。MiniCssExtractPlugin.loader 会将 CSS 提取到单独文件,css-loader 负责解析 CSS 代码。同时,在 plugins 数组中实例化 MiniCssExtractPlugin 来启用插件功能。
3. 观察打包效果:重新执行 Webpack 打包命令,查看生成的文件中是否有单独的 CSS 文件,并且页面样式是否正常显示。

注意事项
mini-css-extract-plugin 不能和 style-loader 一起使用。因为 style-loader 是将 CSS 代码插入到 DOM 中,而该插件是将 CSS 提取成单独文件,二者功能冲突。

在这里插入图片描述

7、优化(压缩过程)

问题背景

在使用 mini-css-extract-plugin 等插件将 CSS 代码提取成单独文件后,CSS 代码未经过压缩处理,文件体积较大,影响页面加载性能,因此需要对其进行压缩。

插件作用

css-minimizer-webpack-plugin 插件专门用于在 Webpack 构建过程中压缩 CSS 代码,通过去除不必要的空格、注释、简化选择器和属性等方式,减小 CSS 文件的大小,从而加快页面的加载速度。

操作步骤解析

  1. 下载软件包:使用命令 npm install css-minimizer-webpack-plugin --save -dev 将该插件作为开发依赖安装到项目中。--save -dev 表明此插件仅在开发和构建阶段使用,而非在生产环境运行时使用。
  2. 配置 webpack.config.js
    • 首先引入插件:const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");,通过 require 函数引入插件模块,并将其赋值给 CssMinimizerPlugin 变量。
    • 然后在 optimization.minimizer 数组中配置插件:
module.exports = {
    //... 其他配置(如 entry、output 等,此处省略未展示部分)
    optimization: {
        minimizer: [
            // 在 webpack@5 中,可以使用 `...` 语法来扩展现有的 minimizer(如 `terser-webpack-plugin`),
            // 确保 JS 代码也能被压缩处理(图中注释部分说明了这一点,若要启用可取消注释相关内容)
            new CssMinimizerPlugin(),
        ],
    },
};

这里 optimization.minimizer 用于配置 Webpack 构建过程中的压缩器。将 CssMinimizerPlugin 的实例添加到 minimizer 数组中,即可在打包时对 CSS 代码进行压缩。
3. 观察打包效果:重新执行 Webpack 打包命令,查看生成的 CSS 文件大小是否减小,同时确认页面样式在压缩后是否正常显示。
在这里插入图片描述

8、打包less代码

加载器作用

less-loader 加载器的主要作用是将 Less 代码编译为 CSS 代码。Less 是一种 CSS 预处理器,它扩展了 CSS 的语法,增加了变量、Mixin、函数等功能,使得样式表的编写更加高效和易于维护。less-loader 能将这些扩展语法转换为浏览器可以识别的 CSS 代码。

操作步骤解析

  1. 准备 Less 代码:新建 Less 代码文件(例如设置背景图相关样式),并将其引入到 src/login/index.js 中。这一步是为了让 Webpack 能够找到并处理 Less 代码。
  2. 下载软件包:使用命令 npm i less less-loader --save -dev 下载 lessless-loader 本地软件包。less 是 Less 语言的核心库,less-loader 是 Webpack 用于处理 Less 的加载器,--save -dev 表示将它们作为开发依赖安装,即仅在开发和构建过程中使用。
  3. 配置 webpack.config.js
module.exports = {
    //... 其他配置(如 entry、output 等,此处省略未展示部分)
    module: {
        rules: [
            {
                test: /\.less$/i,
                // use 数组指定了处理 Less 文件的加载器,执行顺序从右到左(从后往前)
                // less - loader 先将 Less 代码编译为 CSS 代码,css - loader 解析 CSS 代码,
                // MiniCssExtractPlugin.loader 将 CSS 提取到单独文件(前提是已配置该插件用于提取 CSS)
                use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"] 
            },
        ],
    },
};

这里 test: /\.less$/i 用于匹配所有以 .less 结尾的文件,use 数组按照顺序依次使用不同的加载器对 Less 文件进行处理。
4. 观察打包效果:重新执行 Webpack 打包命令,查看打包后的结果,确认 Less 代码是否成功编译为 CSS 代码,并且页面样式是否正常显示。

注意事项
less-loader 需要配合 less 软件包使用,二者缺一不可。如果只安装了 less-loader 而没有安装 less,在编译 Less 代码时会报错。

9、打包图片

  • 资源模块:Webpack5 内置资源模块,可直接打包字体、图片等,无需额外 loader。
  • 配置步骤:在 webpack.config.js 中配置规则,如通过 test: /\.(png|jpg|jpeg|gif)$/i 匹配图片文件,type: 'asset' 启用资源模块,generator.filename 定义输出文件名(利用 [hash] 对内容哈希计算,[ext] 保留原文件扩展名,[query] 保留查询参数)。
  • 临界值判断:默认以 8KB 为临界值。大于 8KB 的图片会打包为单独文件并导出 URL 地址;小于 8KB 的图片则导出为 data URI(base64 字符串),减少 HTTP 请求。
    在这里插入图片描述

10、搭建开发环境(webpack-dev-server)

  • 问题:修改代码后需重新打包才能查看运行效果,效率低。
  • 开发环境配置
    • 作用:启动 Web 服务,自动检测代码变化并热更新到网页,且 dist 目录和打包内容在内存中,更新速度快。
    • 步骤
      1. 下载 webpack-dev-server 软件包到项目,命令为 npm i webpack-dev-server --save -dev
      2. 设置模式为开发模式(mode: 'development'),并在 package.json 中配置自定义命令(如 "dev": "webpack serve --open"--open 可自动打开浏览器)。
      3. 使用 npm run dev 启动开发服务器,体验热更新效果。
        在这里插入图片描述

11、打包模式

在这里插入图片描述

12、打包模式的应用

  • 需求:开发模式下用 style-loader 内嵌样式以加快速度,生产模式下提取 CSS 代码。
  • 方案
    • 方案 1:直接在 webpack.config.js 配置导出函数,但局限性大(仅支持 2 种模式)。
      在这里插入图片描述

    • 方案 2:借助 cross-env(跨平台通用)包区分环境:

      1. 下载 cross-env 到项目:npm i cross-env --save -dev
      2. package.json 中配置自定义命令,通过 cross-env 设置参数(如 NODE_ENV=productionNODE_ENV=development),参数会绑定到 process.env 对象。
      3. webpack.config.js 中根据 process.env.NODE_ENV 区分环境,应用不同配置。
      4. 重新打包观察配置差异。
        在这里插入图片描述
        在这里插入图片描述
    • 方案 3:当多种模式差异性较大时,配置不同的 webpack.config.js 文件。

13、前端项目中注入环境变量

  • 需求:开发模式下打印语句生效,生产模式下失效。
  • 问题cross-env 设置的环境变量仅在 Node.js 环境生效,前端代码无法直接访问 process.env.NODE_ENV
  • 解决方法:使用 Webpack 内置的 DefinePlugin 插件。该插件在编译时将前端代码中匹配的变量名替换为对应的值或表达式。
  • 代码实现
    1. 引入 Webpack:const webpack = require('webpack')
    2. webpack.config.jsplugins 数组中添加 DefinePlugin 实例:
      plugins: [
        new webpack.DefinePlugin({
          // 键为注入到前端 JS 代码中的全局变量名
          // 值通过 JSON.stringify 处理(确保值为字符串形式,符合前端代码规范)
          'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
        })
      ]
      
      这样,前端代码就能根据 process.env.NODE_ENV 的值(如 'development''production')判断是否执行相应逻辑(如开发模式下的打印语句)。
      在这里插入图片描述

14、开发环境中使用 source map 调试

  • 问题:代码压缩混淆后,无法准确定位源代码的行数和列数。
  • source map 的作用:能准确追踪 errorwarning 在原始代码中的位置。
  • 设置方式:在 webpack.config.js 中配置 devtool 选项,例如 devtool: 'inline - source - map',该选项会将源码的位置信息一同打包在 js 文件内。
  • 注意事项source map 仅适用于开发环境,生产环境中不建议使用,以防止源码位置被轻易查看。
    在这里插入图片描述

15、 解析别名(alias)

  • 作用:配置模块解析规则,通过创建 import 引入路径的别名,简化模块引入,避免长路径或相对路径的不安全性。
  • 实现方式:在 webpack.config.js 中配置 resolve.alias。例如,使用 path.resolve(__dirname, 'src') 将别名 @ 指向项目的 src 绝对路径。
    • 原引入方式:import { checkPhone, checkCode } from '../src/utils/check.js'(路径长且相对路径不够安全)。
    • 配置别名后:import { checkPhone, checkCode } from '@/utils/check.js'(通过别名 @ 简化路径)。
  • 代码示例
    const config = {
      //...其他配置
      resolve: {
        alias: {
          '@': path.resolve(__dirname,'src') // 将 @ 映射到 src 目录的绝对路径
        }
      }
    }
    

通过这种配置,可使模块引入更简洁、安全,提升开发效率。

16、优化-生产环境下使用CDN

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

具体示例

  1. 使用模块语法判断
    在这里插入图片描述

  2. 配置忽略的模块
    在这里插入图片描述在这里插入图片描述

  3. 使用参数
    在这里插入图片描述

17、多页面打包

在这里插入图片描述

具体示例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

18、优化-分割公共代码

Webpack 会自动分析模块依赖关系,将符合规则的公共代码提取到独立文件,减少重复代码,提升缓存利用率和打包效率。
在这里插入图片描述

19、完整的示例代码

webpack.config.js文件

const path = require('path'); // 用于处理文件路径的Node.js核心模块
const HtmlWebpackPlugin = require('html-webpack-plugin'); // 生成HTML文件并自动引入打包后的JS/CSS资源
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // 生产环境中将CSS提取为独立文件(替代style-loader)
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); // 优化压缩CSS代码(配合terser-webpack-plugin)
const webpack = require('webpack'); // 引入Webpack核心模块,用于使用内置插件(如DefinePlugin)

const config = {
  // 打包模式(development/production,通过命令行参数覆盖配置文件)
  // mode: 'development', // 开发模式默认开启调试相关配置(如eval-source-map)

  // 多入口配置(每个页面单独打包)
  entry: {
    // 键名对应最终生成的chunk名称,值为入口文件绝对路径
    'login': path.resolve(__dirname, 'src/login/index.js'), // 登录页面入口
    'content': path.resolve(__dirname, 'src/content/index.js'), // 内容页面入口
    'publish': path.resolve(__dirname, 'src/publish/index.js') // 发布页面入口
  },

  // 输出配置
  output: {
    path: path.resolve(__dirname, 'dist'), // 打包输出的根目录(绝对路径)
    filename: './[name]/index.js', // 输出文件名模板:[name]对应entry的键名(如login/index.js)
    clean: true // 打包前自动清空output.path目录(避免残留旧文件)
  },

  // 插件配置(增强Webpack功能)
  plugins: [
    // 登录页HTML模板处理
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'public/login.html'), // 源HTML模板文件路径
      filename: path.resolve(__dirname, 'dist/login/index.html'), // 生成的HTML文件路径
      useCdn: process.env.NODE_ENV === 'production', // 生产环境启用CDN资源(通过模板变量控制)
      chunks: ['login'] // 仅引入当前entry对应的chunk(避免引入其他页面的JS)
    }),
    // 内容页HTML模板处理(结构同上)
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'public/content.html'),
      filename: path.resolve(__dirname, 'dist/content/index.html'),
      useCdn: process.env.NODE_ENV === 'production',
      chunks: ['content']
    }),
    // 发布页HTML模板处理(结构同上)
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'public/publish.html'),
      filename: path.resolve(__dirname, 'dist/publish/index.html'),
      useCdn: process.env.NODE_ENV === 'production',
      chunks: ['publish']
    }),
    // CSS提取插件(生产环境生效)
    new MiniCssExtractPlugin({
      filename: './[name]/index.css' // 生成的CSS文件名(与JS文件路径对应)
    }),
    // 环境变量注入插件(将Node环境变量传递到前端代码)
    new webpack.DefinePlugin({
      // 使用JSON.stringify确保值为字符串形式(符合JS语法)
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
    })
  ],

  // 模块加载器配置(处理非JS文件)
  module: {
    rules: [
      // CSS文件处理规则
      {
        test: /\.css$/i, // 匹配所有.css文件(i表示不区分大小写)
        // 根据环境选择不同的加载器:开发环境用style-loader(内联样式),生产环境用MiniCssExtractPlugin.loader(提取文件)
        use: [process.env.NODE_ENV === 'development' ? 'style-loader' : MiniCssExtractPlugin.loader, "css-loader"]
      },
      // Less文件处理规则(支持CSS预处理器)
      {
        test: /\.less$/i, // 匹配所有.less文件
        use: [
          // 同上:环境区分CSS加载方式
          process.env.NODE_ENV === 'development' ? 'style-loader' : MiniCssExtractPlugin.loader,
          'css-loader', // 解析CSS文件中的@import和url()
          'less-loader' // 将Less代码编译为CSS
        ],
      },
      // 图片文件处理规则(Webpack5内置资源模块)
      {
        test: /\.(png|jpg|jpeg|gif)$/i, // 匹配常见图片格式
        type: 'asset', // 自动根据文件大小选择处理方式(<8KB转base64,否则生成独立文件)
        generator: {
          filename: 'assets/[hash][ext][query]' // 输出文件名:哈希值+原扩展名+查询参数
        }
      }
    ],
  },

  // 优化配置(生产环境关键优化)
  optimization: {
    // 压缩器配置(支持JS/CSS压缩)
    minimizer: [
      // 保留默认JS压缩器(terser-webpack-plugin,Webpack5内置)
      // `...` 展开运算符表示保留原有minimizer配置
      `...`,
      new CssMinimizerPlugin(), // 单独配置CSS压缩器(配合默认JS压缩器工作)
    ],
    // 代码分割配置(核心优化点)
    splitChunks: {
      chunks: 'all', // 对所有模块(同步/异步/初始加载)进行公共代码分析
      cacheGroups: { // 缓存组(自定义分割规则)
        commons: { // 公共模块分组(抽取多个页面共享的代码)
          minSize: 0, // 允许分割任意大小的模块(覆盖默认30KB限制)
          minChunks: 2, // 模块被引用至少2次才进行分割
          reuseExistingChunk: true, // 重用已存在的chunk(避免重复生成)
          // 动态生成chunk名称:基于引用该模块的所有chunk名称拼接
          name(module, chunks, cacheGroupKey) { 
            const allChunksNames = chunks.map((item) => item.name).join('~'); // 格式:chunk名1~chunk名2
            return `./js/${allChunksNames}`; // 输出路径:dist/js/[chunk名1~chunk名2].js
          }
        }
      }
    }
  },

  // 模块解析配置(简化路径引用)
  resolve: {
    // 路径别名配置(避免使用复杂相对路径)
    alias: {
      '@': path.resolve(__dirname, 'src') // 用@符号代替src目录绝对路径(如import '@/utils/xxx')
    }
  }
};

// 开发环境配置(仅在NODE_ENV=development时生效)
if (process.env.NODE_ENV === 'development') {
  config.devtool = 'inline-source-map'; // 启用内联source map(方便调试,显示原始代码位置)
}

// 生产环境配置(仅在NODE_ENV=production时生效)
if (process.env.NODE_ENV === 'production') {
  // 外部扩展配置(排除指定库的打包,通过CDN引入)
  config.externals = {
    // 键:import语句中的模块名,值:全局变量名(需与CDN暴露的变量一致)
    'bootstrap/dist/css/bootstrap.min.css': 'bootstrap', // 引导CSS(假设全局变量为bootstrap)
    'axios': 'axios', // axios库(全局变量axios)
    'form-serialize': 'serialize', // form-serialize库(全局变量serialize)
    '@wangeditor/editor': 'wangEditor' // 王编辑器(全局变量wangEditor)
  }
}

module.exports = config; // 导出完整配置对象

代码说明:

  1. 多入口配置:针对不同页面(登录/内容/发布)设置独立入口,生成对应的HTML和JS/CSS文件
  2. 环境区分:通过process.env.NODE_ENV动态切换开发/生产环境配置(如CSS加载方式、source map、外部扩展)
  3. 公共代码分割:通过splitChunks.commons规则,自动提取被多个页面引用的公共模块(如工具函数、公共组件)
  4. 资源处理
    • CSS/Less:开发环境内联样式提升速度,生产环境提取独立文件并压缩
    • 图片:使用Webpack5内置asset模块自动处理base64嵌入和独立文件生成
  5. 性能优化
    • clean: true确保输出目录无残留文件
    • externals排除第三方库打包,减少最终包体积(配合CDN使用)
    • splitChunks提升缓存利用率(公共代码变更时仅需重新打包该部分)

使用建议:

  1. 开发环境通过npm run dev启动(需配置webpack-dev-server
  2. 生产环境通过NODE_ENV=production npm run build打包(需确保CDN资源已正确引入)
  3. 可根据实际需求调整splitChunks.minChunks(公共模块引用次数阈值)和minSize(文件大小阈值)

package.json文件

{
  "name": "",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "cross-env NODE_ENV=production webpack --mode=production",
    "dev": "cross-env NODE_ENV=development webpack serve --open --mode=development"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "cross-env": "^7.0.3",
    "css-loader": "^6.7.3",
    "css-minimizer-webpack-plugin": "^5.0.0",
    "html-webpack-plugin": "^5.5.1",
    "less": "^4.1.3",
    "less-loader": "^11.1.0",
    "mini-css-extract-plugin": "^2.7.5",
    "style-loader": "^3.3.2",
    "webpack": "^5.82.0",
    "webpack-cli": "^5.1.1",
    "webpack-dev-server": "^4.15.0"
  },
  "dependencies": {
    "@wangeditor/editor": "^5.1.23",
    "axios": "^1.4.0",
    "bootstrap": "^5.2.3",
    "form-serialize": "^0.7.2"
  }
}

20、webpack打包和不打包的区别

  • 运行效率
    • 不打包时,浏览器需逐个请求众多模块文件,HTTP 请求次数多,加载速度慢。尤其在现代项目模块繁杂的情况下,效率低下。
    • Webpack 打包将多个模块合并为少量文件,减少 HTTP 请求次数。同时,打包过程可压缩代码(如去除冗余字符、优化代码结构),减小文件体积,显著提升浏览器加载与运行效率。
  • 对基础的支持
    • 不打包时,浏览器可能无法识别现代前端的新特性(如 ES6+ 的 import/export 模块语法)及预处理文件(如 lessscss),导致无法正确解析运行。
    • Webpack 可通过 loader 对代码进行转换处理,例如:用 babel - loader 将 ES6+ 代码转译为兼容旧浏览器的代码;用 css - loaderless - loader 处理样式文件;用资源模块处理图片、字体等。通过这些方式,确保项目在不同环境中正常运行,增强对各类基础的支持。

总结区别:

  • 运行效率:Webpack 打包减少 HTTP 请求、压缩文件,提升加载与运行速度;不打包则因请求多、文件未优化,效率低。
  • 对基础的支持:Webpack 打包通过 loader 转换代码与资源,支持现代前端特性与复杂资源;不打包时,浏览器对新特性和特殊资源支持不足,可能导致项目无法正常运行。

21、webpack 打包原理和 Babel 的作用

webpack 打包原理

Webpack 将 JavaScript、CSS、图像等都视为模块,通过 import/require 语句建立模块间的依赖关系。从入口文件出发,递归解析依赖的所有模块,将它们打包成少量文件(如 bundle.js)。打包过程中:

  • 支持代码分割,把 bundle 拆分为多个小文件,实现异步按需加载,提升性能。
  • 若某模块被多个文件引用,仅生成一个文件,避免重复。
  • 未被调用的文件、变量和方法不会被打包,减少冗余。
  • 多入口场景下,若不同入口引入相同代码,可借助插件(如 SplitChunksPlugin)抽离到公共文件,优化重复代码。

Babel 的作用:

Babel 是一个 JavaScript 编译器,核心功能是将现代 JavaScript 代码(如 ES6+ 的 letconst、箭头函数、对象展开运算符等)转换为旧浏览器或环境能理解的 ES5 等兼容语法,解决新语法的兼容性问题。通过配置插件和预设(如 @babel/preset - env),还能支持对 JSX(用于 React)、装饰器等特殊语法的转换,确保代码在不同环境中稳定运行。

22、插件(Plugin) 和 加载器(Loader)区别

一、核心定义与功能

  1. 加载器(Loader)
  • 定义
    加载器是用于 处理特定类型文件 的转换器,将浏览器无法直接识别的模块(如 CSS、Less、图片、字体等)转换为 Webpack 能够处理的 模块

  • 核心功能

    • 文件转换:将非 JS 文件转换为 JS 可识别的模块(或直接转换为最终可执行的代码/资源)。
    • 单模块处理:仅针对单个模块的内容进行处理(如将 .vue 文件拆分为 JS/CSS/HTML,将 Less 编译为 CSS)。
  • 典型场景

    • babel-loader:将 ES6+ 语法转换为 ES5 兼容代码。
    • css-loader:解析 CSS 文件中的 @importurl() 依赖。
    • image-loader:压缩图片并生成 URL 路径。
  1. 插件(Plugin)
  • 定义
    插件是用于 扩展 Webpack 构建流程 的功能模块,通过监听 Webpack 的生命周期钩子(如 编译开始文件生成后 等),在构建过程中执行自定义逻辑。

  • 核心功能

    • 全局构建控制:处理构建过程中的全局逻辑(如生成 HTML、提取 CSS、代码压缩、环境变量注入等)。
    • 多模块协作:操作多个模块之间的关系(如代码分割、资源优化、错误处理等)。
  • 典型场景

    • HtmlWebpackPlugin:根据模板生成 HTML 文件并自动引入打包后的 JS/CSS。
    • MiniCssExtractPlugin:将 CSS 从 JS 中提取为独立文件(生产环境常用)。
    • TerserPlugin:压缩 JS 代码(Webpack 5 内置)。

二、核心区别对比

特性加载器(Loader)插件(Plugin)
作用对象单个模块文件(如 .js.css.vue整个构建流程(处理模块间关系或全局任务)
处理阶段模块加载时(在 module.rules 中配置)构建生命周期的各个钩子阶段(通过 plugins 数组配置)
核心目标文件转换(让 Webpack 识别非 JS 模块)扩展构建功能(优化、压缩、资源管理等全局操作)
使用方式module.rules 中通过 test 匹配文件类型,按顺序调用 use 中的加载器plugins 中实例化插件类(可传入配置参数)
典型配置位置webpack.config.js 中的 module.rules 字段webpack.config.js 中的 plugins 数组
输出结果转换后的模块内容(供 Webpack 继续处理)无直接输出,影响构建流程或生成额外资源(如 HTML)

三、协作关系

  1. 加载器是模块处理的“转换器”
    当 Webpack 解析到一个模块(如 import './style.css'),会根据 module.rules 匹配对应的加载器,按顺序调用(如先 css-loader 解析依赖,再 style-loader 内联样式到 HTML)。

  2. 插件是构建流程的“控制器”
    插件在加载器处理完模块后介入,例如:

    • MiniCssExtractPlugin 会将 css-loader 处理后的 CSS 从 JS 中提取为独立文件(替代 style-loader 的内联方式)。
    • HtmlWebpackPlugin 会根据所有打包后的 JS/CSS 生成最终的 HTML 模板。

四、示例对比

  1. 加载器示例:处理 CSS 文件
// webpack.config.js
module.rules = [
  {
    test: /\.css$/, // 匹配 CSS 文件
    use: [
      'style-loader', // 将 CSS 内联到 HTML 样式标签(开发环境)
      'css-loader' // 解析 CSS 中的 @import 和 url()
    ]
  }
];
  1. 插件示例:提取 CSS 为独立文件
// webpack.config.js
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

plugins: [
  new MiniCssExtractPlugin({
    filename: 'css/[name].[contenthash].css' // 生产环境生成独立 CSS 文件
  })
];

// 配合加载器使用(替换 style-loader)
use: [
  MiniCssExtractPlugin.loader, // 插件提供的加载器,用于提取 CSS
  'css-loader'
]

五、总结

  • 加载器(Loader):专注于 单个文件的内容转换,是模块级的“翻译官”(如将 Less 转 CSS,ES6 转 ES5)。
  • 插件(Plugin):专注于 构建流程的全局控制,是构建过程的“指挥官”(如生成 HTML、分离公共代码、压缩资源)。

两者相辅相成:Loader 处理基础文件转换,Plugin 实现高级构建功能,共同完成复杂的前端工程化需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序 van-dropdown-menu

点击其他按钮&#xff0c;关闭van-dropdown-menu下拉框 DropdownMenu 引入页面使用index.wxmlindex.scssindex.ts(重点)index.ts(全部) DropdownMenu 引入 在app.json或index.json中引入组件 "usingComponents": {"van-dropdown-menu": "vant/weapp…

智驱未来:AI大模型重构数据治理新范式

第一章 数据治理的进化之路 1.1 传统数据治理的困境 在制造业巨头西门子的案例中&#xff0c;其全球200个工厂每天产生1.2PB工业数据&#xff0c;传统人工清洗需要300名工程师耗时72小时完成&#xff0c;错误率高达15%。数据孤岛问题导致供应链决策延迟平均达48小时。 1.2 A…

C++ 蓄水池抽样算法

&#xff08;1&#xff09;概念 蓄水池抽样算法&#xff08;Reservoir Sampling&#xff09;是一种用于从 大规模数据集&#xff08;尤其是 流式数据 或 无法预先知晓数据总量 的场景&#xff09;中 等概率随机抽取固定数量样本 的算法。 &#xff08;2&#xff09;实现 我们…

分布式光纤测温技术让森林火灾预警快人一步

2025年春季&#xff0c;多地接连发生森林火灾&#xff0c;累计过火面积超 3万公顷。春季历来是森林草原火灾易发、多发期&#xff0c;加之清明节已到来&#xff0c;生产生活用火活跃&#xff0c;民俗祭祀用火集中&#xff0c;森林火灾风险进一步加大。森林防火&#xff0c;人人…

Vue2 el-checkbox 虚拟滚动解决多选框全选卡顿问题 - 高性能处理大数据量选项列表

一、背景 在我们开发项目中&#xff0c;经常会遇到需要展示大量选项的多选框场景&#xff0c;比如权限配置、数据筛选等。当选项数量达到几百甚至上千条时&#xff0c;传统的渲染方式全选时会非常卡顿&#xff0c;导致性能问题。本篇文章&#xff0c;记录我使用通过虚拟滚动实现…

KUKA机器人KR 3 D1200 HM介绍

KUKA KR 3 D1200 HM是一款小型机器人&#xff0c;型号中HM代表“Hygienic Machine&#xff08;卫生机械&#xff09;用于主副食品行业”&#xff0c;也是一款并联机器人。用于执行高速、高精度的抓取任务。这款机器人采用食品级不锈钢设计&#xff0c;额定负载为3公斤&#xff…

【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法(多输入单输出)

【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法&#xff08;多输入单输出&#xff09; 引言 本文使用状态空间模型实现失业率递归预测&#xff0c;状态空间模型&#xff08;State Space Model, SSM&#xff09;是一种用于描述动态系统行为的…

【Linux】线程ID、线程管理、与线程互斥

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 上篇文章&#xff1a; 【Linux】线程&#xff1a;从原理到实战&#xff0c;全面掌握多线程编程&#xff01;-CSDN博客 下…

【锂电池SOH估计】RF随机森林锂电池健康状态估计,锂电池SOH估计(Matlab完整源码和数据)

目录 效果一览程序获取程序内容代码分享研究内容基于随机森林(RF)的锂电池健康状态(SOH)估计算法研究摘要1. 引言2. 锂电池SOH评估框架3. 实验与结果分析4. 未来研究方向6. 结论效果一览 程序获取 获取方式一:文章顶部资源处直接下载:【锂电池SOH估计】RF随机森林锂电池…

【Pytorch 中的扩散模型】去噪扩散概率模型(DDPM)的实现

介绍 广义上讲&#xff0c;扩散模型是一种生成式深度学习模型&#xff0c;它通过学习到的去噪过程来创建数据。扩散模型有很多变体&#xff0c;其中最流行的通常是文本条件模型&#xff0c;它可以根据提示生成特定的图像。一些扩散模型&#xff08;例如 Control-Net&#xff0…

121.在 Vue3 中使用 OpenLayers 实现去掉鼠标右键默认菜单并显示 Feature 信息

🎯 实现效果 👇 本文最终实现的效果如下: ✅ 地图初始化时绘制一个多边形; ✅ 鼠标 右键点击地图任意位置; ✅ 若命中 Feature,则弹出该图形的详细信息; ✅ 移除浏览器默认的右键菜单,保留地图交互的完整控制。 💡 整个功能基于 Vue3 + OpenLayers 完成,采用 Com…

进阶篇 第 6 篇:时间序列遇见机器学习与深度学习

进阶篇 第 6 篇&#xff1a;时间序列遇见机器学习与深度学习 (图片来源: Tara Winstead on Pexels) 在上一篇中&#xff0c;我们探讨了如何通过精心的特征工程&#xff0c;将时间序列预测问题转化为机器学习可以处理的监督学习任务。我们学习了如何创建滞后特征、滚动统计特征…

【音视频】音频解码实战

音频解码过程 ⾳频解码过程如下图所示&#xff1a; FFmpeg流程 关键函数 关键函数说明&#xff1a; avcodec_find_decoder&#xff1a;根据指定的AVCodecID查找注册的解码器。av_parser_init&#xff1a;初始化AVCodecParserContext。avcodec_alloc_context3&#xff1a;为…

DOCA介绍

本文分为两个部分&#xff1a; DOCA及BlueField介绍如何运行DOCA应用&#xff0c;这里以DNS_Filter为例子做大致介绍。 DOCA及BlueField介绍&#xff1a; 现代企业数据中心是软件定义的、完全可编程的基础设施&#xff0c;旨在服务于跨云、核心和边缘环境的高度分布式应用工作…

# 利用迁移学习优化食物分类模型:基于ResNet18的实践

利用迁移学习优化食物分类模型&#xff1a;基于ResNet18的实践 在深度学习的众多应用中&#xff0c;图像分类一直是一个热门且具有挑战性的领域。随着研究的深入&#xff0c;我们发现利用预训练模型进行迁移学习是一种非常有效的策略&#xff0c;可以显著提高模型的性能&#…

洗车小程序系统前端uniapp 后台thinkphp

洗车小程序系统 前端uniapp 后台thinkphp 支持多门店 分销 在线预约 套餐卡等

HCIP(综合实验2)

1.实验拓补图 2.实验要求 1.根据提供材料划分VLAN以及IP地址&#xff0c;PC1/PC2属于生产一部员工划分VLAN10,PC3属于生产二部划分VLAN20 2.HJ-1HJ-2交换机需要配置链路聚合以保证业务数据访问的高带宽需求 3.VLAN的放通遵循最小VLAN透传原则 4.配置MSTP生成树解决二层环路问题…

Linux mmp文件映射补充(自用)

addr一般为NULL由OS指明&#xff0c;length所需长度&#xff08;4kb对齐&#xff09;&#xff0c;prot&#xff08;权限&#xff0c;一般O_RDWR以读写&#xff09;&#xff0c; flag&#xff08;MAP_SHARED(不刷新到磁盘上&#xff0c;此进程独有)和MAP_PRIVATE&#xff08;刷新…

单元测试学习笔记(一)

自动化测试 通过测试工具/编程模拟手动测试步骤&#xff0c;全自动半自动执行测试用例&#xff0c;对比预期输出和实际输出&#xff0c;记录并统计测试结果&#xff0c;减少重复的工作量。 单元测试 针对最小的单元测试&#xff0c;Java中就是一个一个的方法就是一个一个的单…

【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)

新视角生成(Novel View Synthesis)是计算机视觉与图形学领域的核心技术,旨在从单张或稀疏图像中生成任意视角的高保真图像,突破传统多视角数据的限制,实现对三维场景的自由探索。作为计算机视觉与图形学的交叉领域,近新视角生成年来在算法创新、应用落地和工具生态上均取…