文件资源打包
webpack依赖树
当我们使用webpack对资源进行打包时,默认只会将入口文件
进行打包
webpack中存在着一个重要的概念:依赖树
依赖树 是指以入口文件为根节点 通过import模块导入资源文件 的方式去延展的一种树结构
这样子webpack进行模块打包时 会从入口文件开始 将所有存在于依赖树中的文件资源进行模块打包(在webpack中 一个文件或者一张图片 称为一个模块
)
图片资源打包
在网页中使用图片的两种方式
方式1 js创建一个div元素 给该盒子添加background-image:url()
方式2 js创建一个img元素 添加src图片地址属性
不过以下方法添加图片的方法是错误的
这样子webpack在打包时 会在build打包文件中寻找图片地址
但是我们并没有将图片资源解析打包到文件包中
导致无法找到该图片 直接将图片地址作为一个字符串 渲染到页面上
必须了解的时当我们使用webpack加载文件时必须先将文件资源一起打包到资源文件夹下
依赖树中 是没有对图片资源进行依赖的 所以图片并没有被打包进资源文件包中
`这里需要将图片文件加入依赖树中`
复制代码
file-loader
仅仅将图片资源加入到依赖树是远远不够的,因为webpack并不知道怎么解析图片资源
这个时候我们就需要依赖一个对文件资源进行解析的loader —file-loader 帮助我们处理import/require()导入的文件资源
安装
npm install file-loader -D
配置&使用
rules规则简单配置
{
//文件类型
test: /\.(png|jpe?g|gif|svg)$/i,
use: {
loader:'file-loader'
}
}
复制代码
再次进行打包 发现没有报错 并且将图片文件打包到了出口文件
我们发现 直接打包的图片名是一串很长的十六进制哈希值
哈希值是为了防止文件资源名重复 导致不必要的麻烦
但是文件名只以哈希值表示 很难对图片进行分辨
我们可以使用PlaceHolders对文件名进行设置
{
test:/\.(png|jpe?g|gif|svg)$/i,
use:{
loader:'file-loader',
options:{
// img/ 创建一个目录文件夹 [name]显示原文件名
//[hash:8]设置8位哈希位 [ext扩展名]
name:"img/[name].[hash:8].[ext]"
}
}
}
复制代码
文件名已经可以分辨了 并添加了一个img的图片目录
设置目录文件路径 除了 /img (vue/react常用)
还可以通过 outputPath
设置
url-loader
url-loader跟file-loader工作方式很相似 但是url-loader可以将较小的文件转换成base64的URI
安装
npm install url-loader -D
配置使用
{
test: /\.(png|jpe?g|gif|svg)$/i,
use: {
loader: "url-loader",
options: {
name: "[name]-[hash:8].[ext]",
outputPath: "img"
}
}
}
复制代码
使用的方法是一样的 但是默认情况下 url-loader会将所有的图片文件转换为base64格式
这是输出文件中不存在打包的图片资源
打开打包文件bundle.js 所有的图片都被转换成了base64的格式
limit属性
实际开发中 我们往往是将较小的图片转换成base64格式传输 这样有利于减少加载每个小图片都需要发送的请求 造成的资源浪费
我们可以使用url-loader中options提供的limit属性对转换文件的大小进行限制
{
test: /\.(png|jpe?g|gif|svg)$/i,
use: {
loader: "url-loader",
options: {
// 限制 50k 以下的资源转换成base64格式
limit:50 * 1024,
name: "[name]-[hash:8].[ext]",
outputPath: "img"
}
}
}
这时有一张大于 50kb 的图片被打包
复制代码
而另外一张图片则转换成base64的方式
资源模块类型 asset module type
webpack5之后 我们使用资源模块类型(asset module type) 来代替file-loader,url-loader等文件资源加载的loader
assert/resource:
代替 file-loader 整文件导出
asset/inline:
代替 url-loader 导出全部默认为base64格式
asset/source:
代替 raw-loader
asset:
通过限制文件大小 确定导出方式(url-loader+limit属性) 默认使用file-loader加载方式
使用
因为asset为webpack5自带的文件加载方式 所以不需要安装loader
在rule中设置type属性为asset/resource
他的效果跟file-loader是一样的
{
test: /\.(png|jpe?g|gif|svg)$/i,
type: 'asset/resource'
// type: 'asset/inline' -> 默认url-loader加载方式(base64)
//asset 可设置文件大小限制
}
复制代码
更改文件名
方式一:更改output属性
output:{
filename:'js/bundle.js',
//使用资源模块类型 默认扩展名[ext]是带.的
assetModuleFilename:'img/[name]-[hash:8][ext]'
}
复制代码
方式二:直接rule中设置generator属性
{
test: /\.(png|jpe?g|gif|svg)$/i,
type:'asset',
generator:{
filename:"img/[name].[hash:8][ext]"
}
}
复制代码
asset -> url-loader的limit效果
首先需要设置type为asset类型
{
test: /\.(png|jpe?g|gif|svg)$/i,
type:'asset',
generator:{
filename:"img/[name].[hash:8][ext]"
},
//设置图片限制为 50kb 大于50kb作为文件打包 小于50kb转换位base6格式
parser:{
dataUrlCondition:{
maxSize:50 * 1024
}
}
复制代码
达到的效果和设置了limit属性 的url-loader是一样的
字体文件加载
可以使用file-loader或者资源文件类型asset/resouce
插件 plugin
认识webpack插件
loader是用于特定的模块类型进行转换
Plugin可以用于执行更加广泛的任务 比如 打包优化、资源管理、环境变量注入等
CleanWebpackPlugin
当我们每次修改一些配置信息的时候,进行重新打包之前,都需要手动删除打包的输入文件夹,不然就会文件夹重复 CleanWebpackPlugin
插件帮助我们清理文件夹
安装
npm install clean-webpack-plugin -D
配置
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
moudule.exports = {
plugins:{
new CleanWebpackPlugin()
}
}
复制代码
HtmlWebpackPlugin
在最终的打包文件中自动添加对应的入口文件 index.html
安装
npm install html-webpack-plugin -D
配置
//这里不需要进行解构 因为HtmlWebpackPlugin插件是一个独立的功能块
const HtmlWebpackPlugin = require('html-webpack-plugin')
plugins: [
new HtmlWebpackPlugin({
title:'webpack案例'
})
]
复制代码
配置好之后直接使用再次打包 发现出口文件中多了一个 index.html 文件
它使用的是html-webpack-plugin中默认的default_index.ejs模板
自定义HTML模板
当我们不想使用它默认的ejs模板时 我们根据自己的需要定义一个模板
首先,新建一个public文件夹 存放公共资源
创建一个index.html文件,添加自己想要的模板内容
插件配置 template:'./public/index.html'
html模板
语法<%变量%> 是EJS模板填充数据的放方式
DefinePlugin
配置好之后 运行 发现编译时报错了
因为我们在模板中使用到了BASE_URL的常量 他时EJS模块填充数据的
在template模板编译中 我们并没有定义 BASE_URL
的常量 所以会出现没有定义的错误
我们可以使用DefinePlugin 在编译时 对全局的常量进行配置
DefinePlugin是webpack内置的插件 不需要进行安装 直接配置
这样子就能读取到BASE_URL的值了
CopyWebpackPlugin
在vue的打包过程中,如果我们将一些文件放到public的目录下,那么这个目录会被复制到出口文件夹中。
提供复制功能的插件CopyWebpackPlugin
安装
npm install copy-webpack-plugin -D
配置
Mode配置
Mode配置选项 告知webpack使用响应模式的内置优化
默认 production
可选值:none | development | production