Jorgen's blog Jorgen's blog
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

jorgen

Love it, make mistakes, learn, keep grinding.
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 微信小程序学习记录
  • WebAssembly
  • Vue.js 从入门到实践:构建现代前端应用
  • React.js-从入门到精通-构建现代用户界面
  • React-从入门到精通-构建现代Web应用
  • React-从入门到精通-构建现代前端应用
  • React 开发指南:从入门到精通
  • React框架入门:构建现代用户界面
  • TypeScript:为JavaScript添加类型安全
  • TypeScript在前端开发中的应用:从入门到实践
  • Vue.js 集成 TypeScript:构建类型安全的前端应用
  • Webpack从入门到实践:构建现代前端应用
    • Webpack安装与配置
      • 安装Webpack
      • 基本配置
      • 使用NPM脚本
    • 常用加载器介绍
      • 处理CSS文件
      • 处理图片和字体
      • 处理Babel
      • 处理TypeScript
    • 常用插件介绍
      • HtmlWebpackPlugin
      • CleanWebpackPlugin
      • MiniCssExtractPlugin
      • DefinePlugin
    • 优化策略
      • 开发环境优化
      • 使用source map
      • 使用webpack-dev-server
      • 生产环境优化
      • 代码分割
      • 懒加载
      • 压缩代码
      • 缓存
    • 实战案例
      • 项目初始化
      • 项目结构
      • 编写代码
      • 配置Webpack
      • 配置Babel
      • 添加脚本
      • 运行项目
    • 结语
  • 前端工程化:构建现代化开发流程
  • 前端工程化:构建高效、可维护的现代Web应用
  • 前端工程化:构建高效现代Web应用的艺术
  • 响应式设计:构建适配所有设备的现代Web应用
  • 前端状态管理:从Flux到现代解决方案
  • 前端性能优化-打造极速流畅的用户体验
  • 前端测试-构建可靠且高质量的用户界面
  • 前端安全防护-构建安全可靠的Web应用
  • 前端微前端架构-构建可扩展的大型前端应用
  • 前端数据可视化-打造直观易懂的数据呈现
  • 前端国际化-构建面向全球用户的多语言Web应用
  • 前端无障碍访问-构建包容性的Web体验
  • 前端组件化与组件库设计-构建可复用的高质量组件
  • 前端AI与机器学习集成:构建智能化用户界面
  • 前端架构设计模式-构建可扩展的现代Web应用
  • frontend
Jorgen
2023-11-15
目录

Webpack从入门到实践:构建现代前端应用


## 前言

在前端开发的旅程中,我们经常会遇到各种工具和框架。Vue.js让我们能够构建响应式的用户界面,微信小程序让我们能够开发跨平台的应用,而WebAssembly则让我们能够在浏览器中运行接近原生性能的代码。但是,有一个工具,它默默地站在幕后,将我们的代码、样式和资源打包成浏览器可以理解的形式,那就是Webpack。

🏗 Webpack是现代前端开发中不可或缺的构建工具,它不仅仅是一个模块打包器,更是一个强大的前端工程化解决方案。无论你是初学者还是有经验的开发者,掌握Webpack都能让你的开发效率提升一个档次。

在本文中,我将带你从零开始,逐步了解Webpack的核心概念、安装配置、常用加载器和插件,以及优化策略。最后,我们还会通过一个实战案例,将所学知识应用到实际项目中。

::: tip
"学会Webpack,你将能够更好地理解和控制自己的前端项目,而不是被工具所控制。"
:::

## Webpack基础概念

在深入Webpack之前,我们需要了解一些核心概念。这些概念是理解Webpack工作原理的基础。

### 入口(Entry)

入口是Webpack构建的起点,Webpack从这里开始查找和构建依赖关系。你可以把它想象成应用程序的"主文件"。

```javascript
// 单个入口
module.exports = {
  entry: './src/index.js'
};

// 多个入口
module.exports = {
  entry: {
    app: './src/app.js',
    admin: './src/admin.js'
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 出口(Output)

出口是Webpack构建后文件的存放位置,它告诉Webpack在哪里以及如何命名生成的文件。

module.exports = {
  output: {
    filename: 'bundle.js',
    path: __dirname + '/dist'
  }
};
1
2
3
4
5
6

# 加载器(Loader)

Webpack本身只能理解JavaScript和JSON文件。加载器允许Webpack处理其他类型的文件,并将其转换为有效的模块,然后添加到依赖图中。

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      }
    ]
  }
};
1
2
3
4
5
6
7
8
9
10

# 插件(Plugin)

插件可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件是Webpack的支柱功能。

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
      filename: 'index.html'
    })
  ]
};
1
2
3
4
5
6
7
8
9
10

# 模式(Mode)

通过选择development, production或none之中的一个,来设置mode参数,你可以启用Webpack内置的优化。默认值为production。

module.exports = {
  mode: 'production'
};
1
2
3

# Webpack安装与配置

了解了基本概念后,让我们开始安装和配置Webpack。

# 安装Webpack

首先,我们需要创建一个新的项目目录并初始化npm:

mkdir webpack-demo
cd webpack-demo
npm init -y
1
2
3

然后,安装Webpack和它的CLI工具:

npm install webpack webpack-cli --save-dev
1

# 基本配置

创建一个src目录,并在其中添加一个index.js文件:

// src/index.js
function component() {
  const element = document.createElement('div');
  
  // Lodash(目前通过一个 script 引入)
  element.innerHTML = _.join(['Hello', 'Webpack'], ' ');
  
  return element;
}

document.body.appendChild(component());
1
2
3
4
5
6
7
8
9
10
11

同时,我们需要安装lodash作为依赖:

npm install lodash
1

创建一个基本的Webpack配置文件webpack.config.js:

// webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist'),
  },
};
1
2
3
4
5
6
7
8
9
10

运行Webpack构建:

npx webpack --config webpack.config.js
1

这将生成一个dist/main.js文件,包含了我们的应用代码和lodash。

# 使用NPM脚本

为了简化命令,我们可以在package.json中添加一个脚本:

"scripts": {
  "build": "webpack --config webpack.config.js"
}
1
2
3

现在,我们可以通过npm run build来运行Webpack。

# 常用加载器介绍

加载器是Webpack处理不同类型文件的关键。让我们介绍一些常用的加载器。

# 处理CSS文件

要处理CSS文件,我们需要安装style-loader和css-loader:

npm install --save-dev style-loader css-loader
1

然后更新webpack.config.js:

module.exports = {
  // ...其他配置
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      }
    ]
  }
};
1
2
3
4
5
6
7
8
9
10
11

现在,我们可以在JavaScript中导入CSS文件:

import './styles.css';
1

# 处理图片和字体

要处理图片和字体等静态资源,我们可以使用file-loader或url-loader:

npm install --save-dev file-loader
1

然后添加配置:

module.exports = {
  // ...其他配置
  module: {
    rules: [
      {
        test: /\.(png|svg|jpg|gif)$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: '[name].[ext]',
              outputPath: 'images/'
            }
          }
        ]
      },
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: '[name].[ext]',
              outputPath: 'fonts/'
            }
          }
        ]
      }
    ]
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 处理Babel

为了使用ES6+的新特性,我们需要使用Babel来转换我们的JavaScript代码:

npm install --save-dev babel-loader @babel/core @babel/preset-env
1

然后添加配置:

module.exports = {
  // ...其他配置
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 处理TypeScript

如果你的项目使用TypeScript,你需要安装相应的加载器:

npm install --save-dev typescript ts-loader
1

然后添加配置:

module.exports = {
  // ...其他配置
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/
      }
    ]
  },
  resolve: {
    extensions: ['.tsx', '.ts', '.js']
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 常用插件介绍

插件可以扩展Webpack的功能。让我们介绍一些常用的插件。

# HtmlWebpackPlugin

这个插件会自动生成HTML文件,并将打包后的JavaScript文件自动引入。

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

然后添加配置:

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  // ...其他配置
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
      filename: 'index.html'
    })
  ]
};
1
2
3
4
5
6
7
8
9
10
11

# CleanWebpackPlugin

这个插件会在每次构建前清理dist目录:

npm install --save-dev clean-webpack-plugin
1

然后添加配置:

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

module.exports = {
  // ...其他配置
  plugins: [
    new CleanWebpackPlugin()
  ]
};
1
2
3
4
5
6
7
8

# MiniCssExtractPlugin

这个插件将CSS提取到单独的文件中:

npm install --save-dev mini-css-extract-plugin
1

然后添加配置:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  // ...其他配置
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader']
      }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: 'styles.css'
    })
  ]
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# DefinePlugin

这个插件允许你在编译时创建全局常量:

const webpack = require('webpack');

module.exports = {
  // ...其他配置
  plugins: [
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('production')
    })
  ]
};
1
2
3
4
5
6
7
8
9
10

# 优化策略

随着项目规模的增大,Webpack构建可能会变慢。下面是一些优化策略。

# 开发环境优化

# 使用source map

source map可以帮助我们在开发时调试代码,定位到原始源码:

module.exports = {
  // ...其他配置
  devtool: 'eval-cheap-module-source-map'
};
1
2
3
4

# 使用webpack-dev-server

webpack-dev-server提供了一个简单的web服务器,并支持热模块替换(HMR):

npm install --save-dev webpack-dev-server
1

然后添加配置:

module.exports = {
  // ...其他配置
  devServer: {
    static: './dist',
    hot: true
  }
};
1
2
3
4
5
6
7

并更新package.json中的脚本:

"scripts": {
  "start": "webpack serve --open",
  "build": "webpack --config webpack.config.js"
}
1
2
3
4

# 生产环境优化

# 代码分割

代码分割可以将代码分割成多个包,按需加载或并行加载:

module.exports = {
  // ...其他配置
  optimization: {
    splitChunks: {
      chunks: 'all'
    }
  }
};
1
2
3
4
5
6
7
8

# 懒加载

使用动态导入实现懒加载:

function getComponent() {
  return import(/* webpackChunkName: "lodash" */ 'lodash').then(({ default: _ }) => {
    const element = document.createElement('div');
    element.innerHTML = _.join(['Hello', 'Webpack'], ' ');
    return element;
  });
}
1
2
3
4
5
6
7

# 压缩代码

使用TerserPlugin压缩JavaScript代码:

const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  // ...其他配置
  optimization: {
    minimizer: [
      new TerserPlugin()
    ]
  }
};
1
2
3
4
5
6
7
8
9
10

# 缓存

利用缓存提高构建速度:

module.exports = {
  // ...其他配置
  output: {
    filename: '[name].[contenthash].js',
    path: path.resolve(__dirname, 'dist')
  }
};
1
2
3
4
5
6
7

# 实战案例

让我们通过一个实际项目来演示Webpack的使用。我们将创建一个简单的React应用,并使用Webpack进行构建。

# 项目初始化

首先,创建项目目录并初始化npm:

mkdir react-webpack-demo
cd react-webpack-demo
npm init -y
1
2
3

安装必要的依赖:

npm install react react-dom
npm install --save-dev webpack webpack-cli @babel/core @babel/preset-env @babel/preset-react babel-loader html-webpack-plugin css-loader style-loader
1
2

# 项目结构

创建以下目录结构:

react-webpack-demo/
├── dist/
├── src/
│   ├── App.css
│   ├── App.js
│   ├── index.css
│   ├── index.js
│   └── index.html
├── webpack.config.js
└── package.json
1
2
3
4
5
6
7
8
9
10

# 编写代码

编写src/index.js:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);
1
2
3
4
5
6
7
8
9
10
11

编写src/App.js:

import React from 'react';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <h1>Hello, React + Webpack!</h1>
        <p>这是一个使用Webpack构建的React应用</p>
      </header>
    </div>
  );
}

export default App;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

编写样式文件src/index.css和src/App.css:

/* src/index.css */
body {
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
    sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

code {
  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
    monospace;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* src/App.css */
.App {
  text-align: center;
}

.App-header {
  background-color: #282c34;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  font-size: calc(10px + 2vmin);
  color: white;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

编写src/index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>React + Webpack Demo</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12

# 配置Webpack

编写webpack.config.js:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
    clean: true,
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env', '@babel/preset-react']
          }
        }
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
      filename: 'index.html'
    })
  ],
  devServer: {
    static: './dist',
    hot: true
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 配置Babel

创建.babelrc文件:

{
  "presets": ["@babel/preset-env", "@babel/preset-react"]
}
1
2
3

# 添加脚本

更新package.json中的脚本:

"scripts": {
  "start": "webpack serve --open",
  "build": "webpack"
}
1
2
3
4

# 运行项目

现在,我们可以通过npm start启动开发服务器,或者通过npm run build构建生产版本。

# 结语

通过本文的学习,我们了解了Webpack的核心概念、安装配置、常用加载器和插件,以及优化策略。我们还通过一个实战案例,学习了如何使用Webpack构建一个React应用。

🤔 Webpack虽然强大,但也可能让人感到复杂。记住,学习Webpack是一个渐进的过程,从简单的配置开始,逐步探索更高级的功能。

"工欲善其事,必先利其器。" - 掌握Webpack,让你的前端开发更加高效。 ::>

Webpack不仅仅是一个工具,它代表了一种现代前端开发的思维方式。通过模块化、组件化和工程化,我们可以构建更加可维护、可扩展的应用。

希望本文能够帮助你更好地理解和使用Webpack。如果你有任何问题或建议,欢迎在评论区留言交流!

#Webpack#前端工程化#构建工具
上次更新: 2026/01/28, 14:21:05
Vue.js 集成 TypeScript:构建类型安全的前端应用
前端工程化:构建现代化开发流程

← Vue.js 集成 TypeScript:构建类型安全的前端应用 前端工程化:构建现代化开发流程→

最近更新
01
LLM
01-30
02
intro
01-30
03
intro
01-30
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jorgen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式