Webpack 是一款现代 JavaScript 应用程序的静态模块打包工具。在 Web 开发中,我们的项目会包含各种类型的文件,如 JavaScript、CSS、图片等。Webpack 可以将这些文件打包成一个或多个文件,以便在浏览器中高效加载。它就像是一个超级管家,把项目中的各种资源整理打包,让它们能更好地协同工作。
npm install webpack webpack - cli -g
在src/index.js中编写如下代码:
function add(a, b) {
return a + b;
}
const result = add(1, 2);
console.log(result);
在项目根目录下创建webpack.config.js文件,内容如下:
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
}
};
这里配置了入口文件entry为src/index.js,表示从这个文件开始打包;output指定了打包后的文件名filename为bundle.js,输出路径path为dist文件夹。
在命令行中进入项目根目录,执行以下命令:
webpack - - config webpack.config.js
执行成功后,会在dist文件夹下生成bundle.js文件。这个文件就是打包后的文件,包含了src/index.js中的代码以及相关依赖。
npm install css - loader style - loader --save - dev
body {
background - color: lightblue;
}
import './styles.css';
function add(a, b) {
return a + b;
}
const result = add(1, 2);
console.log(result);
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/,
use: ['style - loader', 'css - loader']
}
]
}
};
这里module.rules配置了一个规则,test表示匹配所有.css文件,use指定了使用style - loader和css - loader来处理这些文件。css - loader负责解析 CSS 文件,style - loader负责将解析后的 CSS 插入到 HTML 页面中。
npm install html - webpack - plugin --save - dev
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')
},
module: {
rules: [
{
test: /\.css$/,
use: ['style - loader', 'css - loader']
}
]
},
plugins: [
new HtmlWebpackPlugin({
title: 'Webpack Demo',
template: './src/index.html'
})
]
};
这里引入了HtmlWebpackPlugin插件,配置了title为页面标题,template指定了使用src/index.html作为模板来生成 HTML 文件。在src文件夹下创建index.html文件:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF - 8">
<title><%= htmlWebpackPlugin.options.title %>title>
head>
<body>
<script src="bundle.js">script>
body>
html>
再次执行打包命令,会在dist文件夹下生成一个 HTML 文件,并且自动引入了打包后的bundle.js文件。
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
const TerserPlugin = require('terser - webpack - plugin');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/,
use: ['style - loader', 'css - loader']
}
]
},
plugins: [
new HtmlWebpackPlugin({
title: 'Webpack Demo',
template: './src/index.html'
})
],
optimization: {
minimizer: [
new TerserPlugin()
]
}
};
npm install mini - css - extract - plugin --save - dev
在webpack.config.js中配置如下:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
const MiniCssExtractPlugin = require('mini - css - extract - plugin');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css - loader']
}
]
},
plugins: [
new HtmlWebpackPlugin({
title: 'Webpack Demo',
template: './src/index.html'
}),
new MiniCssExtractPlugin({
filename:'styles.css'
})
]
};
npm install clean - webpack - plugin --save - dev
在webpack.config.js中配置如下:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
const MiniCssExtractPlugin = require('mini - css - extract - plugin');
const { CleanWebpackPlugin } = require('clean - webpack - plugin');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css - loader']
}
]
},
plugins: [
new HtmlWebpackPlugin({
title: 'Webpack Demo',
template: './src/index.html'
}),
new MiniCssExtractPlugin({
filename:'styles.css'
}),
new CleanWebpackPlugin()
]
};
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'),
// 为动态导入的代码块指定输出路径和文件名
chunkFilename: '[name].[chunkhash].js'
},
module: {
rules: [
{
test: /\.css$/,
use: ['style - loader', 'css - loader']
}
]
},
plugins: [
new HtmlWebpackPlugin({
title: 'Webpack Demo',
template: './src/index.html'
})
],
optimization: {
splitChunks: {
chunks: 'all'
}
}
};
optimization.splitChunks.chunks: 'all’表示对所有类型的 chunk(入口 chunk、异步 chunk 等)都进行代码拆分。这里output.chunkFilename用于指定非入口 chunk(动态导入的代码块)的输出文件名,[name]会被替换为代码块的名称,[chunkhash]会根据代码块内容生成哈希值,用于缓存控制。
export function multiply(a, b) {
return a * b;
}
import './styles.css';
function add(a, b) {
return a + b;
}
const result = add(1, 2);
console.log(result);
// 点击按钮时动态导入math.js模块并调用multiply函数
document.addEventListener('DOMContentLoaded', function () {
const button = document.createElement('button');
button.textContent = '点击计算乘法';
document.body.appendChild(button);
button.addEventListener('click', function () {
import('./math.js').then((module) => {
const product = module.multiply(3, 4);
console.log('乘法结果:', product);
});
});
});
这里使用import(‘./math.js’)动态导入math.js模块,这是 ES2020 引入的动态导入语法,Webpack 会自动将其拆分成一个单独的代码块。当用户点击按钮时,才会加载这个代码块,实现了按需加载。执行打包命令后,在dist文件夹下会生成除了bundle.js之外的math.[chunkhash].js文件,这就是拆分出来的代码块。
通过以上步骤,我们对 Webpack 的基础和核心功能有了初步了解。Webpack 还有很多高级特性,如代码优化、热模块替换等,后续可以进一步深入学习。希望这篇文章能帮助大家顺利入门 Webpack,开启高效的 Web 开发之旅。