(1)起步
1、安装
1.1、创建一个目录
输入命令:mkdir webpack_demo
1.2、进入目录
输入命令:cd webpack_demo
1.3、初始化 npm
生成package.json文件 输入命令:npm init -y
1.4、在本地安装 webpack webpack-cli
安装一些项目依赖的包在node_modules文件夹内
输入命令:npm install webpack webpack-cli --save-dev
2、构建文件目录
在根目录件夹中新建两个文件夹,分别为 src 文件夹和 dist 文件夹
index.html --放在 src 文件夹下;
main.js --放在 src 文件夹的js文件夹中;
common.css --放在 src 文件夹的css文件夹中;
3、配置 webpack.config.js
3.1、在当前项目的根目录下新建一个配置文件 webpack.config.js 配置如下:
const path = require('path'); // 处理绝对路径
module.exports = {
entry: './src/js/main.js', // 入口文件
output: {
path: path.resolve(__dirname, 'dist'), //打包后的文件存放的地方
filename: 'js/bundle.js', //打包后输出文件的文件名
},
};
输入命令:npx webpack --config webpack.config.js
会生在dist文件夹下生成 js文件夹下的bundle.js文件
注意:
生成的bundle.js文件路径和输出文件filename: 'js/bundle.js'设置有关 这里设置的是包含js的文件夹名bundle.js内容为空是因为我们创建main.js为空
3.2、设置打包快捷方式(代码红色部分为这次新增)
考虑到用 CLI 这种方式来运行本地的 webpack 副本并不是特别方便,我们可以设置一个快捷方式。调整 package.json 文件,添加一个 npm script:
{
"name": "webpack_demo5",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1"
}
}
现在,可以使用 npm run build 命令,来替代我们之前使用的 npx 命令
4、配置 mode
告知 webpack 使用相应模式的内置优化,如果没有设置,webpack 会给 mode 的默认值设置为 production(生产模式),页面会被压缩
4.1、webpack.config.js 配置如下:
红色代码为此次新增内容
const path = require('path'); // 处理绝对路径
module.exports = {
entry: './src/js/main.js', // 入口文件
output: {
path: path.resolve(__dirname, 'dist'), //打包后的文件存放的地方
filename: 'js/bundle.js', //打包后输出文件的文件名
},
mode: 'development', //设置为开发模式
};
(2)管理资源
代码红色部分为这次新增
1、加载 CSS
为了在 JavaScript 模块中 import 一个 CSS 文件,你需要安装 style-loader 和 css-loader,并在 module 配置 中添加这些 loader:
输入命令:npm install --save-dev style-loader css-loader
webpack.config.js配置如下:
const path = require('path'); // 处理绝对路径
module.exports = {
entry: './src/js/main.js', // 入口文件
output: {
path: path.resolve(__dirname, 'dist'), //打包后的文件存放的地方
filename: 'js/bundle.js', //打包后输出文件的文件名
},
module: {
rules: [
{
test: /\.css$/i,
use: ['style-loader', 'css-loader'],
},
],
},
};
完成后package.json文件内容如下:
{
"name": "webpack_demo5",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"css-loader": "^6.7.3",
"style-loader": "^3.3.2",
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1"
}
}
可以在src文件夹下common.css文件中写点东西了
html,body{
padding: 0;
margin: 0;
}
body{
background-color: red; //给body设置背景颜色
}
ul,li{
list-style: none;
}
然后在src文件夹下的main.js文件里引入common.css ,写法如下:
import '../css/common.css';
然后在src文件夹下的index.html文件里引入打包的js文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="../dist/js/bundle.js"></script> //注意引入的是打包生成的js文件
</body>
</html>
然后我们输入命令就可以直接打包
输入命令:npm run build
打开这个index.html 就可以看到页面背景色变成红色了
检查看下代码 会发现样式用style插入到页面
1.1、加载其他格式CSS
1.1.1、处理.less文件 webpack 将 .less 编译为 .css
安装 less 和 less-loader
输入命令:npm install less less-loader --save-dev
webpack.config.js配置如下:
const path = require('path'); // 处理绝对路径
module.exports = {
entry: './src/js/main.js', // 入口文件
output: {
path: path.resolve(__dirname, 'dist'), //打包后的文件存放的地方
filename: 'js/bundle.js', //打包后输出文件的文件名
},
module: {
rules: [
{
test: /\.css$/i,
use: ['style-loader', 'css-loader'],
},
{
test: /\.less$/i,
use: ['style-loader', 'css-loader','less-loader'],
},
],
},
};
完成后package.json文件devDependencies的内容如下:
"devDependencies": {
"css-loader": "^6.7.3",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"style-loader": "^3.3.2",
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1"
}
在src文件夹的css文件夹中新建less.less文件测试下是否成功
ul{
background-color: #ffffff;
li{
line-height: 24px;
color: #666a80;
}
}
然后在src文件夹下的main.js文件里引入less.less ,写法如下:
import '../css/less.less';
然后打包 输入命令:npm run build
检查看下代码 看看上边新写的.less样式是否会以style插入到页面
1.1.2、处理.sass文件 webpack 将 .sass 编译为 .css
和上边less步骤一样 我就简单写下
安装 sass 和 sass-loader
输入命令:npm install sass-loader sass webpack --save-dev
webpack.config.js新增配置如下:
{
test: /\.s[ac]ss$/i,
use: ['style-loader', 'css-loader','sass-loader'],
},
完成后package.json文件devDependencies的内容如下:
"devDependencies": {
"css-loader": "^6.7.3",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"sass": "^1.59.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.2",
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1"
}
完成后测试看看新写的.sass样式是否会以style插入到页面
2、加载 images 图像
在 webpack 5 中,可以使用内置的 Asset Modules,我们可以轻松地将这些内容混入我们的系统中
webpack.config.js新增配置如下:
{
test:/\.(png|jpg|jpeg|svg|gif)$/i,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 4 * 1024 // 小于4kb图片会转为base64格式
}
},
generator: {
filename: 'images/[name][hash:8][ext]'
}
},
预览效果:
3、加载 fonts 字体
使用 Asset Modules 可以接收并加载任何文件,然后将其输出到构建目录
webpack.config.js新增配置如下:
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
type: 'asset/resource',
generator: {
filename: 'font/[name][hash:8][ext]'
}
},
在阿里巴巴矢量图库https://www.iconfont.cn/ 下载图标代码
然后在项目页面使用
在src文件夹下的main.js文件里引入iconfont.css ,写法如下:
import '../css/iconfont.css';
还需要修改样式文件里的路径
预览效果:
(3)管理输出
设置 HtmlWebpackPlugin
1.1、安装插件
输入命令:npm install --save-dev html-webpack-plugin
完成后package.json文件devDependencies的内容如下:
"devDependencies": {
"css-loader": "^6.7.3",
"html-webpack-plugin": "^5.5.0",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"sass": "^1.59.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.2",
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1"
}
1.2、webpack.config.js新增配置如下:
const HtmlWebpackPlugin = require('html-webpack-plugin');
plugins: [
new HtmlWebpackPlugin({
inject:'body',
template:path.resolve(__dirname,'src/index.html') //指定模板文件
}),
],
然后删掉src文件夹下index.html文件中引入的js文件的
然后我们输入命令打包
输入命令:npm run build
dist文件夹下会生成一个以src下index.html文件为模板的index.html文件
dist/index.html内容如下:
和src文件下index.heml一样
清理 /dist 文件夹
在每次构建前清理 /dist 文件夹,这样只会生成用到的文件,使用 output.clean 配置项实现这个需求
2.1、webpack.config.js新增配置如下:
只需在output里加入:clean: true就行
output: {
path: path.resolve(__dirname, 'dist'), //打包后的文件存放的地方
filename: 'js/bundle.js', //打包后输出文件的文件名
clean: true,
},
注意clean: true是 webpack5的新特性
现在执行 npm run build,检查 /dist 文件夹,现在只会看到构建后生成的文件,而没有旧文件
(4)优化
1、将 CSS 提取到单独的文件中
为每个包含 CSS 的 JS 文件创建一个 CSS 文件
1.1、安装 mini-css-extract-plugin
输入命令:npm install --save-dev mini-css-extract-plugin
完成后package.json文件devDependencies的内容如下:
"devDependencies": {
"css-loader": "^6.7.3",
"html-webpack-plugin": "^5.5.0",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"mini-css-extract-plugin": "^2.7.3",
"sass": "^1.59.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.2",
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1"
}
建议 mini-css-extract-plugin 与 css-loader 一起使用
1.2、webpack.config.js配置如下:
const path = require('path'); // 处理绝对路径
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); //将CSS提取到单独的文件中
module.exports = {
entry: './src/js/main.js', // 入口文件
output: {
path: path.resolve(__dirname, 'dist'), //打包后的文件存放的地方
filename: 'js/bundle.js', //打包后输出文件的文件名
},
module: {
rules: [
{
test: /\.css$/i,
use: [MiniCssExtractPlugin.loader, 'css-loader'],
},
{
test: /\.less$/i,
use: [MiniCssExtractPlugin.loader, 'css-loader','less-loader'],
},
{
test: /\.s[ac]ss$/i,
use: [MiniCssExtractPlugin.loader, 'css-loader','sass-loader'],
},
],
},
plugins: [
new MiniCssExtractPlugin({
filename: 'css/[name]_bundle.css', //输出文件的文件名
}),
],
};
生成的index.html文件中会插入如下代码:
<link href="css/main_bundle.css" rel="stylesheet"></head>
替代了之前生成的<style>……</style>
2、将 HTML 导出为字符串
2.1、安装 html-loader
输入命令:npm install --save-dev html-loader
完成后package.json文件devDependencies的内容如下:
"devDependencies": {
"css-loader": "^6.7.3",
"html-loader": "^4.2.0",
"html-webpack-plugin": "^5.5.0",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"mini-css-extract-plugin": "^2.7.3",
"sass": "^1.59.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.2",
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1"
}
2.1、webpack.config.js新增配置如下:
module: {
rules: [
{
test: /\.html$/i,
loader: "html-loader",
},
],
},
配置完打包后 .html文件中的图片可正确显示出来
3、使用jquery
3.1、安装 jquery
输入命令:npm install jquery --save
完成后package.json文件新增内容如下:
"dependencies": {
"jquery": "^3.6.4"
}
3.2、安装expose-loader
允许暴露一个模块(整体或者部分)给全局对象
输入命令:npm install expose-loader --save-dev
完成后package.json文件devDependencies的内容如下:
"devDependencies": {
"css-loader": "^6.7.3",
"expose-loader": "^4.1.0",
"html-loader": "^4.2.0",
"html-webpack-plugin": "^5.5.0",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"mini-css-extract-plugin": "^2.7.3",
"sass": "^1.59.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.2",
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1"
},
3.3、webpack.config.js新增配置如下:
module: {
rules: [
{
test: require.resolve("jquery"),
loader: "expose-loader",
options: {
exposes: ["$", "jQuery"],
},
},
],
},
3.4、文件中引用
在src文件夹下的main.js文件里引入jquery ,写法如下:
import $ from "jquery";
添加代码看看效果:
$('img').css({
'width':'50%',
'display':'block',
'margin':'0 auto'
});
打包看看
4、添加厂商前缀
使用 PostCSS 处理 CSS 的 loader
4.1、安装postcss-loader
输入命令:npm install --save-dev postcss-loader postcss
完成后package.json文件devDependencies的内容如下:
"devDependencies": {
"css-loader": "^6.7.3",
"expose-loader": "^4.1.0",
"html-loader": "^4.2.0",
"html-webpack-plugin": "^5.5.0",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"mini-css-extract-plugin": "^2.7.3",
"postcss": "^8.4.21",
"postcss-loader": "^7.0.2",
"sass": "^1.59.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.2",
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.12.0"
},
4.2、安装postcss-preset-env
输入命令:npm install --save-dev postcss-preset-env
完成后package.json文件devDependencies的内容如下:
"devDependencies": {
"css-loader": "^6.7.3",
"expose-loader": "^4.1.0",
"html-loader": "^4.2.0",
"html-webpack-plugin": "^5.5.0",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"mini-css-extract-plugin": "^2.7.3",
"postcss": "^8.4.21",
"postcss-loader": "^7.0.2",
"postcss-preset-env": "^8.0.1",
"sass": "^1.59.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.2",
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.12.0"
},
4.3、webpack.config.js新增配置如下:
{
test: /\.css$/i,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: ['postcss-preset-env'],
},
},
},
],
},
4.4、在package.json文件中新增如下内容:
"browserslist": [
"iOS 7.1",
"last 2 versions",
">0%"
]
当前项目的浏览器兼容情况
5、热更新
快速开发应用程序
5.1、安装webpack-dev-server
输入命令:npm install --save-dev webpack webpack-dev-server
完成后package.json文件devDependencies的内容如下:
"devDependencies": {
"css-loader": "^6.7.3",
"expose-loader": "^4.1.0",
"html-loader": "^4.2.0",
"html-webpack-plugin": "^5.5.0",
"less": "^4.1.3",
"less-loader": "^11.1.0",
"mini-css-extract-plugin": "^2.7.3",
"sass": "^1.59.3",
"sass-loader": "^13.2.0",
"style-loader": "^3.3.2",
"webpack": "^5.76.1",
"webpack-cli": "^5.0.1",
"webpack-dev-server": "^4.12.0"
},
5.2、webpack.config.js新增配置如下:
devServer: {
compress: true,
port: 9000,
open: true
},
输入命令:npx webpack serve
就自动打开页面了
可以尝试下修改js、css文件浏览器是自动刷新的
5.3、修改.html文件 浏览器自动刷新
需在src文件夹下的main.js文件里引入.html文件 ,写法如下:
import '../index.html';
停止正在运行的本地服务器
命令行输入命令:Ctrl + C
6、优化css相关loader
封装方法 优化css相关loader
6.1、修改代码如下webpack.config.js:
function dealStyle(isvalue){
return [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: ['postcss-preset-env'],
},
},
},
isvalue
].filter(Boolean);
}
{
test: /\.css$/i,
use: dealStyle(),
},
{
test: /\.less$/i,
use: dealStyle('less-loader'),
},
{
test: /\.s[ac]ss$/i,
use: dealStyle('sass-loader'),
},
6.2、整体配置如下webpack.config.js:
const path = require('path'); // 处理绝对路径
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); //将CSS提取到单独的文件中
const HtmlWebpackPlugin = require('html-webpack-plugin');
//用来获取处理样式的loader
function dealStyle(isvalue){
return [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: ['postcss-preset-env'],
},
},
},
isvalue
].filter(Boolean);
}
module.exports = {
entry: './src/js/main.js', // 入口文件
output: {
path: path.resolve(__dirname, 'dist'), //打包后的文件存放的地方
filename: 'js/bundle.js', //打包后输出文件的文件名
clean: true,
},
module: {
rules: [
{
test: /\.css$/i,
use: dealStyle(),
},
{
test: /\.less$/i,
use: dealStyle('less-loader'),
},
{
test: /\.s[ac]ss$/i,
use: dealStyle('sass-loader'),
},
{
test:/\.(png|jpg|jpeg|svg|gif)$/i,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 4 * 1024
}
},
generator: {
filename: 'images/[name][hash:8][ext]'
}
},
{
test: /\.(woff|woff2|eot|ttf|otf)$/i,
type: 'asset/resource',
generator: {
filename: 'font/[name][hash:8][ext]'
}
},
{
test: /\.html$/i,
loader: "html-loader",
},
{
test: require.resolve("jquery"),
loader: "expose-loader",
options: {
exposes: ["$", "jQuery"],
},
},
],
},
plugins: [
new HtmlWebpackPlugin({
inject:'body',
template:path.resolve(__dirname,'src/index.html') //指定模板文件
}),
new MiniCssExtractPlugin({
filename: 'css/[name]_bundle.css',
}),
],
mode:'development',
devServer: {
compress: true,
port: 9000,
open: true //npx webpack serve命令打开热更新
},
};