Skip to content

Commit 438228e

Browse files
committed
blog: webpack learn notes
1 parent 417407a commit 438228e

File tree

2 files changed

+189
-1
lines changed

2 files changed

+189
-1
lines changed

_posts/2024-10-25-WebpackNote.md

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
---
2+
title: Introduction to Webpack and Optimization Strategies
3+
date: 2024-10-25 01:33:19 +0800
4+
categories: [front-end]
5+
tags: [webpack] # TAG names should always be lowercase
6+
---
7+
8+
## 1. What is Webpack?
9+
Webpack is a module bundler for JavaScript applications. It processes all types of files (JavaScript, CSS, images, etc.) in a project and bundles them into one or more optimized files that can be served to the browser.
10+
11+
### Core Concepts
12+
- **Entry**: The starting point where Webpack begins to build its dependency graph. It defines the main file of the application.
13+
- **Output**: Specifies where the bundled files will be saved and how they will be named.
14+
- **Loaders**: Transformations applied to files before bundling, such as converting Sass to CSS or ES6+ to ES5 JavaScript.
15+
- **Plugins**: Extend Webpack's capabilities with more complex tasks, such as code minification or generating an HTML file.
16+
- **Mode**: Webpack has three modes: `development`, `production`, and `none`. The mode controls how Webpack optimizes the output.
17+
18+
## 2. Installing Webpack
19+
To get started with Webpack, install Webpack and its CLI:
20+
21+
```bash
22+
npm install --save-dev webpack webpack-cli
23+
```
24+
25+
## 3. Basic Webpack Configuration
26+
Create a `webpack.config.js` file to configure Webpack. A simple example looks like this:
27+
28+
```javascript
29+
const path = require('path');
30+
31+
module.exports = {
32+
entry: './src/index.js',
33+
output: {
34+
filename: 'bundle.js',
35+
path: path.resolve(__dirname, 'dist'),
36+
},
37+
mode: 'development', // For development, change to 'production' for production build
38+
module: {
39+
rules: [
40+
{
41+
test: /\.css$/,
42+
use: ['style-loader', 'css-loader'],
43+
},
44+
{
45+
test: /\.(png|jpg|gif)$/,
46+
use: ['file-loader'],
47+
},
48+
],
49+
},
50+
devServer: {
51+
contentBase: './dist',
52+
},
53+
};
54+
```
55+
56+
## 4. Running Webpack
57+
Once Webpack is set up, add the following script to `package.json` for easy execution:
58+
59+
```json
60+
{
61+
"scripts": {
62+
"build": "webpack"
63+
}
64+
}
65+
```
66+
67+
Run Webpack using:
68+
69+
```bash
70+
npm run build
71+
```
72+
73+
For development with hot reloading, use Webpack Dev Server:
74+
75+
```bash
76+
npm install --save-dev webpack-dev-server
77+
```
78+
79+
Add a new script:
80+
81+
```json
82+
{
83+
"scripts": {
84+
"start": "webpack serve --open"
85+
}
86+
}
87+
```
88+
89+
Run it using:
90+
91+
```bash
92+
npm start
93+
```
94+
95+
## 5. Further Optimization
96+
97+
### Code Splitting
98+
Code splitting is an essential optimization strategy in Webpack, especially as projects grow larger. It helps reduce initial loading times and improve page responsiveness. Webpack provides several ways to achieve code splitting.
99+
100+
#### Using `SplitChunksPlugin` or `optimization.splitChunks`
101+
102+
Webpack has a built-in `SplitChunksPlugin` that automatically packages shared dependencies into separate files to avoid duplicate loading.
103+
104+
To enable code splitting, you can add the following basic configuration in `webpack.config.js`:
105+
106+
```javascript
107+
module.exports = {
108+
// Other configuration options
109+
110+
optimization: {
111+
splitChunks: {
112+
chunks: 'all', // Split both asynchronous and synchronous dependencies
113+
minSize: 20000, // Minimum size (in bytes) for a chunk to be created
114+
maxSize: 0, // Maximum size for a chunk, set to 0 to not limit
115+
minChunks: 1, // At least 1 module needs to be shared for splitting
116+
maxAsyncRequests: 30, // Maximum number of async requests
117+
maxInitialRequests: 30, // Maximum parallel requests for entry points
118+
automaticNameDelimiter: '~', // Delimiter for file names
119+
cacheGroups: {
120+
vendors: {
121+
test: /[\\/]node_modules[\\/]/,
122+
priority: -10, // Priority, higher values have higher priority
123+
name: 'vendors',
124+
},
125+
default: {
126+
minChunks: 2,
127+
priority: -20,
128+
reuseExistingChunk: true,
129+
},
130+
},
131+
},
132+
},
133+
};
134+
135+
```
136+
137+
#### Dynamic Imports
138+
Webpack also supports dynamic imports (`import()`) to load modules on demand rather than including everything at the initial load. This method is useful for single-page applications (SPAs) and other scenarios to implement lazy loading.
139+
140+
```javascript
141+
// Static import
142+
import moduleA from './moduleA';
143+
144+
// Dynamic import (code splitting)
145+
import('./moduleA').then(moduleA => {
146+
moduleA.doSomething();
147+
});
148+
```
149+
150+
### Production Mode Optimization
151+
In production mode, Webpack automatically optimizes the output by:
152+
- **Minifying the code**: Removes unnecessary characters and spaces.
153+
- **Tree Shaking**: Eliminates unused code.
154+
- **Module Concatenation**: Combines small modules to reduce overhead.
155+
156+
Set the mode to `production` in `webpack.config.js`:
157+
158+
```javascript
159+
module.exports = {
160+
mode: 'production',
161+
// Other configurations...
162+
};
163+
```
164+
165+
### Source Maps for Debugging
166+
Source maps help trace the original code in the browser's developer tools, even after the code is minified.
167+
168+
Enable source maps in `webpack.config.js`:
169+
170+
```javascript
171+
module.exports = {
172+
devtool: 'source-map', // Full source maps for development
173+
mode: 'production',
174+
devtool: 'cheap-module-source-map', // Lightweight source maps for production
175+
};
176+
```
177+
178+
Different types of Source Maps impact performance and debugging experience differently:
179+
180+
- **source-map**: Generates complete Source Maps, offering the best debugging experience but slower to generate and larger in file size.
181+
- **cheap-module-source-map**: A lighter Source Map that maps only to the line and not to the exact column, suitable for production.
182+
- **eval-source-map**: Faster and suitable for development environments.
183+
184+
185+
That's all! Hope this guide helps you. Happy coding! ヾ(≧▽≦*)o
186+
187+
188+

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
---
1+
---
22
layout: home
33
# Index page
44
---

0 commit comments

Comments
 (0)