Webpack 5 前端应用基础打包配置与实战指南

作者:脚本小铺

时间:2026-10-26

浏览:397

本文详细介绍 Webpack 5 作为前端构建工具的核心概念,涵盖模块化与工程化的实现。重点解析入口、输出、加载器、插件及模式五大配置属性,并通过完整示例演示从项目初始化到打包输出的全过程,帮助开发者掌握基础打包技能。

文章目录

前言:初识 Webpack 5

Webpack 是一个静态资源打包工具,它以一个或多个文件作为入口,将直接或间接引用的所有文件组合成一个或多个输出文件。这些输出文件被称为 bundle,是编译后的代码,可直接在浏览器中运行。需要注意的是,Webpack 本身的功能有限,若不添加 loader 和 plugin 等扩展,其处理能力较为单一。

Webpack 的核心价值在于帮助前端开发实现模块化与工程化。

一、前端工程化

1、webpack

(1)定义:Webpack 是一款前端构建工具。由于前端代码格式多样(包括 HTML、CSS、JS、图片等),构建工具的作用是将这些不同格式的文件打包在一起,便于项目上线运行。其本质是将开发环境的代码转换为运行环境的代码。

开发环境的代码:侧重于便于阅读和维护。

运行环境的代码:侧重于执行效率,通常会对代码进行压缩以减小体积。

(2)主要功能:

A、代码压缩:将 JS 代码、CSS 代码以及静态资源文件(如图标、图像)进行混合压缩,从而减小代码体积,提升加载速度。

B、统一编译语法:针对 CSS、Less、Sass、ES6 语法、TypeScript 语法等不同语法要求,构建工具能统一编译,解决在不同浏览器上运行可能出现的问题。

C、模块化处理:CSS 和 JS 各有自己的模块化处理方式,但不同浏览器对这些模块化语法的兼容性较差。构建工具能统一模块化的形式,提高跨浏览器兼容性。

2、webpack的使用:配置文件所需要的信息(五大配置属性)

(1)entry(入口配置):用于配置打包的入口文件,即指定从项目的哪个文件开始进行打包。

(2)output(输出配置):用于配置打包后的文件,包括文件名和存储路径。

path:指定输出文件的存储路径。

filename:指定打包后生成的文件名。

clean:指定在打包前是否清空输出目录。

(3)Loaders(加载器):Webpack 默认只能处理 JS 和 JSON 等文件。若需打包其他格式的文件(如 CSS、Less、Sass、Vue 文件、图片等),则需要使用不同的 loader 辅助完成。安装 loader 后,需在 webpack 配置中通过 module.rules 进行配置。

(4)plugins (插件):用于扩展 Webpack 的功能,例如 HTML 插件。

(5)mode(打包的模式):Webpack 提供两种打包模式:生产模式(production)和开发模式(development)。这两种模式都仅能编译 ES6 中的模块(Module)语法。

3、示例

(1)创建文件夹(根目录):命名为 webpack-study。

(2)进入该文件夹,打开 cmd 窗口(或使用 VS Code 终端)。

(3)将该文件夹初始化为 npm 项目:执行命令 npm init。

(4)安装 webpack 开发依赖:执行命令 npm install webpack webpack-cli -D。

或者分别执行以下命令:

npm install webpack -D

npm install webpack-cli -D

强调:

A、使用 npm 安装包时,若未指定版本号,默认安装最新版本。

B、package.json 文件中 dependencies 键表示发布后仍依赖的包,devDependencies 键表示开发时的依赖。

C、npm install --save:将依赖包安装到 dependencies 键下;npm install --save-dev 将依赖包安装到 devDependencies 键下。

D、i 是 install 的缩写,-D 是 --save-dev 的缩写(即在开发时的依赖)。

(5)项目的目录结构:

前言:初识 Webpack 5

(6)编写代码。

(7)在项目的根目录下创建 webpack 的配置文件:webpack.config.js。

/**
 * webpack的基本打包配置有: entry、output、mode 三项即可
 */
const path = require('path');
module.exports = {
    entry:'./src/main.js',//配置打包入口文件
    output:{//输出配置
        path: path.join(__dirname,'dist'),//配置输出文件的保存位置
        filename:'js/bundle.js',//打包后的文件名
        clean: true,//打包前是否将打包的输出目录清空
    },
    mode:'development'//以开发模式打包
}

"scripts": {
"build": "webpack"
}

(8)在 package.json 文件中配置打包指令。

(9)运行打包指令进行打包。

(10)将打包后的 js 文件导入页面文件(index.html)中。

4、webpack中使用的loader

(1)url-loader:用于打包图像文件。

(2)'style-loader', 'css-loader', 'less-loader':用于打包样式文件。

(3)babel-loader:用于打包 js 文件。

(4)vue-loader:用于打包 .vue 文件。

const { resolve } = require('path'); // node 内置核心模块,用来处理路径问题。
module.exports = { 
     mode: 'development' //开发环境   production  //生产环境
 	 entry: './src/js/index.js', //  单入口文件
      // entry: {                     //多入口  会打包双方重复文件
      //   index: './src/index.js',
      //   another: './src/another-module.js'
      // },
      // entry: {                     //多入口   lodash不会重复打包
      //   index: { import: './src/index.js', dependOn: 'shared' },
      //   another: { import: './src/another-module.js', dependOn: 'shared' },
      //   shared: 'lodash' //不会重复打包
      // },
	 output: { // 输出配置
    	 //filename: './built.js', // 输出文件名 
         path: resolve(__dirname, 'dist'),  //打包后的输出位置 webpack当前目录下的  dist
    //contenthash根据内容变化生成文件名 不变不修改名字会用缓存
        filename: 'scripts/[name].[contenthash].js', //'bundle.js',      //打包后的文件名  多个入口不能写固定一个名字
        clean: true,   //打包后清除上次内容
        assetModuleFilename: 'images/[contenthash][ext]', //静态文件打包地址/文件名
        publicPath: ''
	 },
    // devtool: 'inline-source-map',  //打包后找到真实源代码位置
     devServer: {            //实时更新
        static: './dist', 
        hot: true,   //开启热更新
        compress: true, // 启动gzip压缩
        port: 3000, // 端口号
        open: true // 自动打开浏览器
        proxy: {   //代理
          '/api': {
            target: 'http://localhost:4000',
            changeOrigin: true,
            ws: true,
            pathRewrite: {
              '^/api': ''
            }
      }
    }
  },
 module: {
    rules: [
      // 详细loader配置
      // 不同文件必须配置不同loader处理
     {
        test: /\.(jpg|gif|png)/,
        use: 'url-loader',
        option: {// 图片大小小于8kb,就会被base64处理// 优点: 减少请求数量(减轻服务器压力)// 缺点:图片体积会更大(文件请求速度更慢)
          esModule: true,
          limint: 5 * 1024,    //图片是否转base64
          name: '[hash: 10].[ext]'  //图片命名
        }
      },
      {
        test: /\.(css|less)$/,
        // use: ['style-loader', 'css-loader', 'less-loader']  //从后往前编译 先解析在编译  行内样式
        use: ['MinCssExtractPlugin.loader', 'css-loader', 'less-loader'], //把css文件打包到一个css 用link引入到html中
      },
      {
        test: /\.js$/,
        exclude: /node_modules/, // 不打包指定路径下的js文件
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env'],
            plugins: [
              [
                '@babel/plugin-transform-runtime'  //为promise解决
              ]
            ]
          }
        }
      },
 
    ]
  },
 plugins: [
webpack.HotModuleReplacementPlugin(), //热更新
    new HtmlWebpackPlugin({
      template: './index.html', //要打包的html
      filename: 'app.html',  //html打包后的名字
      inject: 'body',   //script 标签生成地址
      collapseWhitespace: true,  //压缩移除空格
      removeComments: true,  //压缩移除注释
    }),
    new MinCssExtractPlugin({   //把css文件打包到一个新css 用link引入到html中 可修改地址/文件名
      filename: 'styles/[contenthash].css'
    })
  ],
 optimization: {
    minimizer: [
      new CssMinimizerWebpackPlugin()  //还需将mode改为production  会压缩css代码
    ],
    splitChunks: {
      // chunks: 'all',// 公共文件 lodash不会重复打包
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chuns: 'all'
        }
      }
    }
  }
};

至此,关于 webpack 前端应用基础打包实现的教程结束。如需了解更多 webpack 基础打包相关内容,建议查阅本站往期文章或继续阅读后续教程,感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章