Webpack 是目前前端项目构建中最流行的模块打包工具之一。它能将项目中的各种资源(JavaScript、CSS、图片等)打包成浏览器可以识别的静态文件,极大地提高了开发和部署效率。
Webpack 详解
1. 什么是 Webpack?
Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。它会递归地构建依赖关系图,将项目中的所有模块打包成一个或多个 bundle。
2. Webpack 的核心概念
概念 | 说明 |
---|---|
Entry | 入口起点,Webpack 从这里开始构建依赖图。 |
Output | 输出配置,指定打包后的文件保存路径和名称。 |
Loader | 加载器,用于处理非 JavaScript 文件(如 CSS、图片)。 |
Plugin | 插件,用于执行范围更广的任务,如代码压缩、打包优化。 |
Mode | 模式,development (开发)和 production (生产)。 |
3. Webpack 基本配置示例
// webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js', // 入口文件
output: {
filename: 'bundle.js', // 打包后文件名
path: path.resolve(__dirname, 'dist'), // 输出路径,必须是绝对路径
},
module: {
rules: [
{
test: /\.css$/, // 匹配 CSS 文件
use: ['style-loader', 'css-loader'], // 使用 Loader
},
{
test: /\.(png|jpg|gif)$/, // 匹配图片文件
use: [
{
loader: 'file-loader', // 处理图片资源
options: {
name: '[name].[ext]',
outputPath: 'images/',
},
},
],
},
],
},
mode: 'development', // 开发模式
};
4. 常用命令
webpack
— 使用配置文件打包webpack --mode production
— 生产环境打包,自动压缩代码webpack-dev-server
— 本地开发服务器,支持热更新
5. 生态系统与插件
HtmlWebpackPlugin
— 生成 HTML 文件并自动注入打包资源MiniCssExtractPlugin
— 分离 CSS 文件,适合生产环境CleanWebpackPlugin
— 构建前清理输出目录DefinePlugin
— 定义全局常量,支持环境变量替换
6. 优势
- 支持模块化(ES6、CommonJS、AMD 等)
- 丰富的 Loader 和插件生态
- 代码分割和懒加载,提高性能
- 热模块替换(HMR)提升开发体验
好的!这里给你写一个React + Webpack的完整项目配置示例,包含基本的项目结构、webpack 配置、React 代码,以及常用 Loader 和 Plugin 的使用。
React + Webpack 示例项目配置
1. 项目目录结构
my-react-app/
├── package.json
├── webpack.config.js
├── /public
│ └── index.html
└── /src
├── index.js
└── App.jsx
2. package.json(最简)
{
"name": "my-react-app",
"version": "1.0.0",
"scripts": {
"start": "webpack serve --mode development --open",
"build": "webpack --mode production"
},
"dependencies": {
"react": "^18.0.0",
"react-dom": "^18.0.0"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@babel/preset-env": "^7.20.0",
"@babel/preset-react": "^7.18.6",
"babel-loader": "^9.1.0",
"css-loader": "^6.7.3",
"style-loader": "^3.3.1",
"html-webpack-plugin": "^5.5.0",
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.11.1"
}
}
3. 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, // 构建时清理 dist 文件夹
},
resolve: {
extensions: ['.js', '.jsx'], // 支持导入 jsx 文件不用写扩展名
},
module: {
rules: [
{
test: /\.(js|jsx)$/, // babel 转译 js/jsx
exclude: /node_modules/,
use: 'babel-loader',
},
{
test: /\.css$/, // 处理 css
use: ['style-loader', 'css-loader'],
},
{
test: /\.(png|jpg|gif|svg)$/, // 处理图片
type: 'asset/resource',
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html', // 生成 HTML 并自动引入 bundle.js
}),
],
devServer: {
static: './dist', // 本地服务器根目录
hot: true, // 启用热模块替换(HMR)
open: true, // 启动后自动打开浏览器
port: 3000,
},
};
4. Babel 配置(.babelrc)
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
5. /public/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>React + Webpack Demo</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
6. /src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import './index.css';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
7. /src/App.jsx
import React from 'react';
import './App.css';
export default function App() {
return (
<div className="app">
<h1>Hello React + Webpack!</h1>
</div>
);
}
8. /src/index.css 和 App.css
你可以随意添加简单样式,比如:
/* index.css */
body {
margin: 0;
font-family: Arial, sans-serif;
}
/* App.css */
.app {
text-align: center;
margin-top: 50px;
}
9. 使用步骤
# 安装依赖
npm install
# 启动开发服务器(支持热更新)
npm start
# 打包生产环境代码
npm run build
发表回复