Webpack5学习笔记(二):Webpack开发环境基本配置
Author: 哇哇小仔
Date: 2021-03-18
Webpack版本:webpack 5.24.4
webpack-cli 4.5.0
说明:尚硅谷webpack视频教程总结的原创笔记
第3章:webpack开发环境基本配置
3.1 创建配置文件
- 创建文件 webpack.config.js
- 配置内容如下
const {resolve} = require('path'); // node内置核心模块,用来处理路径问题
module.exports = {
entry: './src/index.js', // 文件入口
output: { // 输出配置
filename: 'built.js', // 输出文件名
path: resolve(__dirname, 'build') // 输出文件路径配置
},
mode: 'development' // 开发环境
}
- 运行指令: webpack
- 结论:此功能和上一节一样
3.2 打包样式资源
- 创建文件:比如src中创建index.less和index.css,然后在index.js中引入:
import './index.css;'
,import './index.less'
- 下载安装四个loader包:
npm i style-loader css-loader less-loader less -D
- 修改配置文件
const {resolve} = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'built.js',
path: resolve(__dirname, 'build')
},
// loader 的配置
module:{
rules: [
{
test: /\.css$/,
use: [
// use中的loader从右向左,从下向上,依次执行
// 创建 style 标签, 将 js 中的样式资源插入进行, 添加到 head 中生效
'style-loader',
// 将 css 文件变成 commonjs 模块加载 js 中, 里面内容是样式字符串
'css-loader'
]
},
{
test: /\.less$/,
// 将 less 文件编译成 css 文件,需要下载 less-loader 和 less
use: ['style-loader', 'css-loader', 'less-loader']
}
]
},
plugins: [ ], // 详细plugins的配置
mode: 'development', // 开发模式
// mode: 'production', // 生产模式
}
- 运行指令 webpack
- 结论:可以打包css和less文件
3.3 打包html资源
- 创建文件:
./src/index.html
,./src/index.js
,webpack.config.js
- 下载安装plugin包
npm i --save-dev html-webpack-plugin
- 修改配置文件
const {resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry: './src/index.js',
output: {
filename: 'built.js',
path: resolve(__dirname, 'build')
},
module: {
rules: [],
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
})
],
mode: 'development'
}
- 运行:
webpack
- 结论:
html-webpack-plugiin
默认会创建一个空的HTML,自动引入打包输出的所有资源(css/js)- 如果需要生成一个有结构的html,可以定义template模板,比如复制 ‘./src/index.html’ 文件,并自动引入打包输出所有的资源
3.4 打包图片资源
- 创建文件:
./src/index.js
,./src/index.html
,./src/index.less
, 三张图片(angular.jpg, react.png, vue.jpg) - 下载安装loader包
url-loader
和file-loader
(处理样式中引入的图片,比如background-imgage)html-loader
(webpack4负责处理html中的img引入的图片)html-withimg-loader
(webpack 5.24.4负责处理html中的img引入的图片)
- 修改配置文件
const {resolve} = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index/js',
output: {
filename: 'built.js',
path: resolve(__dirname, 'build')
},
module: {
rules: [
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader']
},
{
// 处理样式中引入的图片资源
test: /\.(png|jpg|gif)/,
loader: 'url-loader',
options: {
// 当图片小于8kb时,就会被base64处理
limit: 8*1024,
esModule: false,
// [hash:10]取hash值的前十位,冒号后边一定不能有空格
// [ext]取文件原来的扩展名
name: "[hash:10].[ext]"
}
},
{
test: /\.html$/,
// 处理HTML文件的img图片,负责引入img,从而能被url-loader进行处理
loader: "html-withimg-loader"
}
]
},
plugins: [
new HtmlWebpackPlugin({template: './src/index.html'})
],
mode: 'development'
}
- 运行:
webpack
- 结论:
- limit 是设置图片处理成base64的图片大小上限。 通常小于8-12kb的图片都可以用base64处理。
- 优点:减少请求数量(减轻服务器压力)
- 缺点:图片体积更大(文件请求速度更慢)
- 课程视频中使用的是
html-loader
用来打包img中引入的图片,但是webpack 5.24.4中出错,使用html-withimg-loader
- 处理引入样式中图片资源的loader(也就是url-loader),默认使用es6模块化解析,而html-withimg-loader 引入图片是commonjs,解析时会出现
- 问题:img中的src会出现 一个object,例如{“default”:“c2f2c28284f319fafbe4ca4bb67b13b1.png”} 。
- 解决:关闭url-loader的es6模块化,使用commonjs解析
- limit 是设置图片处理成base64的图片大小上限。 通常小于8-12kb的图片都可以用base64处理。
3.5 打包其他资源
- 打包其他资源,比如字体等等,这个资源不需要webpack处理
- 修改配置文件
const {resolve} = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry: './src/index.js',
output: {
filename: 'built.js',
path: resolve(__dirname, 'build')
},
module: {
rules:[
{
test: /\.css$/,
use: ["style-loader", "css-loader"]
},
// 打包其他资源(除了html/js/css资源以外的资源)
{
// 排除 html, css, less, js资源
exclude: /\.(html|css|less|js)$/,
loader: "file-loader",
name: "[hash:10].[ext]"
}
]
},
plugins: [{
template: "./src/index.html"
}],
mode: "development"
}
- 运行指令:webpack
3.6 devServer
- 介绍
- 开发服务器 devServer: 用来自动化(自动编译,自动打开浏览器,自动刷新浏览器等功能)
- 特点: 只会在内存中编译打包,不会有任何输出到本地
- 安装:
npm i webpack-dev-server -D
- 配置
// 除了webpack的五大元素之外,多加一个devServer属性的设置
devServer: {
contentBase: resolve(__dirname, 'build'),
compress: true,
port: 3000,
open: true
}
- 运行指令:
npx webpack serve
(webpack@5的启动命令)npx webpack-dev-server
(webpack@4的启动命令)
3.7 开发环境配置
- 创建文件
- ./src
- ./src/css:所有css和less文件
- ./src/imgs:所有图片资源
- ./src/js:所有js文件
- ./src/media:其他资源
- ./webpack.config.js
- ./src
- 修改配置文件
const {resolve} = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/js/index.js',
output: {
filename: './js/built.js',
path: resolve(__dirname, 'build')
},
module{
rules: [
{ // less资源打包
// 打包后,样式资源合并在js中,不再有单独的css文件,因此不需要设置输出文件路径
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader"]
},
{ // css资源打包
test: /\.css$/,
use: ["style-loader", "css-loader"]
},
{ // 图片资源打包
test: /\.(jpg|png|gif)$/,
loader: "url-loader",
options: {
limit: 8 * 1024,
name: "[hash:10].[ext]",
esModule: false,
outputPath: "imgs"
}
},
{ // img链接中的图片资源
test: /\.html$/,
loader: "html-withimg-loader"
},
{ // 其他资源
exclude: /\.(html|css|less|js|jpg|png|gif)$/,
loader: "file-loader",
options: {
name: "[hash:10].[ext]",
outputPath: "media"
}
}
]
},
plugins: [
// 打包html资源
new HtmlWebpackPlugin({
template: "./src/index.html"
})
],
mode: "development", // 开发模式,默认的是生产模式production
devServer: {
contentBase: resolve(__dirname, "build"),
compress: true,
port: 3000,
open: true
}
}
- 运行命令:
npx webpack serve