webpack classC
图片的处理
const img = new Image();
img.src = pic;
console.log(pic);
const root = document.getElementById('app');
root.append(img);
文件的使用
import pic from './images/duck.jpg'
文件的引入
// 图片
// 使用file-loader 处理图片, 打包后的图片路径为:
// index.js:10 72facbe7b5933be3ddf11fec9db79d38.jpg
// 使用url-loader
// 改变图片的存储位置: outputPath ---> 引发出css引入图片的
// 路径有问题 --> 分析出路径问题 ,通过publickPath 问题进行
基本使用file-loader, 加强版本的是url-loader
// 解决
/// outputPath: 定义了图片的路径, 打包后的路径
// publickPath: 定义了css文件使用图片的真实路径
// url-loader 整体的配置 同file-loader 相同
// 但多了一个limit 字段, 当图片小于limit时, 图片转化为base64
// 存储在css文件, 大于数值, 不会转base, 转化为base64 , 将减少http请求
// url-loader 相对于
{
test: /\.(jpg|gif|pne?g|webp)$/, // 处理各种图片
use: { loader: 'url-loader', options: {
name: "[name]-[hash].[ext]",
publicPath: '../images', // 图片的路径前缀, 在css 文件中的增加
outputPath: 'images', // 对所有的图片, 在css 中引用可以都增加../ , 才能遭到路径, 打包后的路径
limit: 1024 * 3
} }
},
url-loader
{
// 图片的处理
test: /\.(jpg|gif|pne?g|webp)$/, // 处理各种图片
use: { loader: 'url-loader', options: { // 进行配置项的配置
name: "[name]-[hash].[ext]", // 名称, 对应的hash 值, 扩展名称, 使用占位符
publicPath: '../images', // 图片的路径前缀, 在css 文件中的增加
// webpack 打包的时候, 会获取真实的图片, 需要在前面增加对应的真实位置, 所以加 '../images' , 获取
// dist 打包中的images 目录
outputPath: 'images', // 对所有的图片, 在css 中引用可以都增加../ , 才能遭到路径
// outputPath 打包后文件存放文件的目录, 默认值为undefind, dist 目录存放的位置
limit: 1024 * 3
// name: 'images/[name]-[hash].[ext]' //或生成一个images 目录
} }
},
{
test: /\.(woff|woff2|svg|eot)$/, // 处理各种图片
use: { loader: 'file-loader', options: {
name: "[name].[ext]",
publicPath: '../',
} }
}
file-loader
/// outputPath: 定义了图片的路径, 定义了图片在 dist 中 是否被文件夹包裹,
// 默认为undefind
// publickPath: 定义了css文件使用图片的真实路径前缀,自动添加
// publickPath: 定义了css 文件,设置background 中引入 图片时, 增加的在dist 中对应的目录
outputPath 是打包输出路径
如果不设置path, 打包出来的图片都是扁平化的
outputPath 是dist输出的 目录
publicPath ,是css 中文件应用的路径
总结
/ 图片
// 使用file-loader 处理图片, 打包后的图片路径为:
// index.js:10 72facbe7b5933be3ddf11fec9db79d38.jpg
// 使用url-loader
// 改变图片的存储位置: outputPath ---> 引发出css引入图片的
// 路径有问题 --> 分析出路径问题 ,通过publickPath 问题进行
// 解决
/// outputPath: 定义了图片的路径, 定义了图片在 dist 中 是否被文件夹包裹,
// 默认为undefind
// publickPath: 定义了css文件使用图片的真实路径
// publickPath: 定义了css 文件,设置background 中引入 图片时, 增加的在dist 中对应的目录
url-loader 相对于file-loader 是一种加强, 多了一些配置, 最主要的是max
{
// 图片的处理
test: /\.(jpg|gif|pne?g|webp)$/, // 处理各种图片
use: { loader: 'url-loader', options: { // 进行配置项的配置
name: "[name]-[hash].[ext]", // 名称, 对应的hash 值, 扩展名称, 使用占位符
publicPath: '../images', // 图片的路径前缀, 在css 文件中的增加
// webpack 打包的时候, 会获取真实的图片, 需要在前面增加对应的真实位置, 所以加 '../images' , 获取
// dist 打包中的images 目录
outputPath: 'images', // 对所有的图片, 在css 中引用可以都增加../ , 才能遭到路径
// outputPath 打包后文件存放文件的目录, 默认值为undefind, dist 目录存放的位置
limit: 1024 * 3 // 大图将将会不转, 小图讲会转换, 转换为 base64, 存储在css
// name: 'images/[name]-[hash].[ext]' //或生成一个images 目录
} }
},
如果css文件没有独立, 就在分支对应的js上, 其次在独立css
htmlWebpackPlugin 的使用, 使用现在的模版生成html w
const htmlWebpackPlugin = require('html-webpack-plugin');
倒入的
// 两个文件的打包
new htmlWebpackPlugin( // 打包生成两个文件, 生成的文件, 并未对文件做取法
{
template: './src/index.html',
filename: 'index.html',
chunks: ['main'] // 标示放入的文件
}
),
使用
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id = 'app'></div>
</body>
</html>
模版的使用
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link href="css/main-de796909.css" rel="stylesheet"></head>
<body>
<div id = 'app'></div>
<script src="main-fedebdd3.js"></script></body>
</html>
生成的模版
字体的使用, 第三方字体的使用
1 使用, 阿里巴巴的普惠体
https://www.iconfont.cn/webfont?spm=a313x.7781069.1998910419.23&puhui=1#!/webfont/index
字体文件的使用
将内部文件的加入, 将webfont.woff 文件放在src 下, 针对chrome 游览器
// 使用font-face声明字体
@font-face {
font-family: 'webfont';
font-display: swap;
src: url('../webfont/webfont.eot'); /* IE9 */
src: url('../webfont/webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('../webfont/webfont.woff2') format('woff2'),
url('../webfont/webfont.woff') format('woff'), /* chrome、firefox */
url('../webfont/webfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('../webfont/webfont.svg#webfont') format('svg'); /* iOS 4.1- */
}
lesss 文件的使用, 使用font-face 字体
body {
font-family: 'webfont' !important; // 定义使用 webfont 的样式
div {
height: 540px;
border: 2px solid yellow;
background: url('../images/logo.png') no-repeat
}
}
第二步:定义使用 webfont 的样式
{
test: /\.(woff|woff2|svg|eot)$/, // 处理各种图片
use: { loader: 'file-loader', options: {
name: "[name].[ext]",
publicPath: '../webfont',
outputPath: 'webfont'
} }
}
webpack.config.js 中的配置
基础的配置
<div id = 'app'></div>
<div><i class="web-font">明月几时有,自己抬头瞅</i></div>
使用
// 第三方字体 iconfont.cn, 阿里巴巴的普惠体
// 第一步:使用font-face声明字体 // 定义了各种类型的字体
/*
@font-face {
font-family: 'webfont';
font-display: swap;
src: url('webfont.eot'); /* IE9 */
// src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
// url('webfont.woff2') format('woff2'),
// url('webfont.woff') format('woff'), /* chrome、firefox */
// url('webfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
// url('webfont.svg#webfont') format('svg'); /* iOS 4.1- */
// }
// 第二步:定义使用 webfont 的样式
/*
第二步:定义使用 webfont 的样式
.web-font {
font-family: "webfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
*/
// 第三步:为文字加上对应的样式
/*
第三步:为文字加上对应的样式
<i class="web-font">明月几时有,自己抬头瞅</i>
*/
自由主题
目录的清理
npm install clean-webpack-plugin -D
目录清理, 清理dist 目录
引入
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
plugins: [
new CleanWebpackPlugin(),
]
效果, 每次打包时,都会清除原来dist目录下所有的文件
hash
webpack 中的 output 或图片, 都可增加hash
// 两种hash 的方式
// hash策略是以项目位单位的, 项目内容改动, 则会, 项目内容改动, 则生成新的hash
// 生成新的hash, 内容不变,则hash值不变, 代码结构更改,则hash 值更改
// 对于多个入口的文件
// filename: "[name]-[hash:8].js"// 给output 增加hash hash配置
/*
entry: {
main: "./src/index.js",
a: './src/a.js'
},
*/
1 普通的hash
当使用hash , 对于多chunk , 都统一用一个hash,
以项目为单位的, 项目内容更改了则会生成新的hash , 内容不变则hash 不变
2 多入口的chunkhash
每一个chunk 上代码更改了, 对应的chunkhash则会修改, 没有修改的则不变
以chunk 为单位, 当一个文件的内容改变了, 则整个chunk组的模块hash 都会改变
当csss 文件, 也使用chunkhash ,
图片不支持chunkhash
js 内容更改时, 对应的 对应的css 的chunkhash 也会修改
3 css 文件 的contenthash
如果只需要修改css 文件, 如果使用chunkhash, 则 对应chunk也会需要发布, 如果使用contenthash
css修改, 对应的 chunkhash 也会修改, contenthash 会更改, js 更改时, chunkhash 会更改, contenthash 不会更改
css 使用 contenthash, 单页面或者多页面都是用chunkhash, 图片使用 hash
图片上传后, 基本不改, 可以考虑不修改
自由主题
自由主题
多页面的打包的通用方案
entry
entry: {
main: "./src/index.js",
list: './src/list.js'
},
entry 对应两个
output
entry: {
main: "./src/index.js",
list: './src/list.js'
},
output: {
path: path.resolve(__dirname, './dist'),
filename: "[name]-[chunkhash:8].js"// 给output 增加hash
// hash 码很长, 只取前面的6位 , 当代码,没有改变的时候, hash 码不变,
// filename: "[name].js"
},
对应多个 output
创建src/ index.html 和 src/list.html
基础模版的配置
plugins 的模版配置
plugins: [
// 两个文件的打包
new htmlWebpackPlugin( // 打包生成两个文件, 生成的文件, 并未对文件做取法
{
template: './src/index.html', // 模版配置
filename: 'index.html', // 文件名配置
chunks: ['main'] // 标示放入的文件, 配置的哪一个chunk 放入 对应的html
}
),
new htmlWebpackPlugin( // 打包生成两个文件
{
template: './src/list.html', // 模版配置
filename: 'list.html', // 文件名配置
chunks: ['list'] 配置的哪一个chunk 放入 对应的html
}
),
)]
基本的配置, 两个页面, 这样的配置
动态的配置plugins
webpack.mpa.config.js 多页面的配置文件
package.json 中添加命令 script : map: 'webpack --config ./webpack.map.config.js'
在src 下创建文件夹, index, detail , list 里面包含文件, index.js 和index.html 文件
const path = require('path');
const glob = require('glob'); // 过滤路径
// 将css 抽离出独立的css文件
const htmlWebpackPlugin = require('html-webpack-plugin');
const mincssExtractPlugin = require('mini-css-extract-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
// 函数定义
const setMPA = () => {
const entry = {}; // 对象
const htmlwebpackplugins = []; // 获取数组
// 获取符合条件的路径规则的数组 * 标示通配符,目录
const entryFiles = glob.sync(path.join(__dirname, './src/*/index.js')); // 绝对路径的获取
// 快速的过滤路径, 对应的文件具有index.js 文件, 或index.html 文件
// 返回结果为一个数组
entryFiles.map((item, index) => {
const entryFile = entryFiles[index];
const match = entryFile.match(/src\/(.*)\/index\.js$/);
// 获取对应的key
const pageName = match[1]
entry[pageName] = entryFile; // entry 配置
// 使用配置
htmlwebpackplugins.push(new htmlWebpackPlugin({
// 对应的模版
template: path.join(__dirname, `./src/${pageName}/index.html`),
// 文件设置
filename: `${pageName}.html`, // 模版配置
// chunks 设置
chunks: [pageName]
}))
})
return {
entry,
htmlwebpackplugins
}
}
// 获取 entry, 和htmlwebpackplugins
// htmlwebpackplugins 对应一个数组
const { entry, htmlwebpackplugins} = setMPA();
module.exports = {
entry,
output: {
path: path.resolve(__dirname, './mpa'),
filename: "[name]-[chunkhash:8].js"// 给output 增加hash
// hash 码很长, 只取前面的6位 , 当代码,没有改变的时候, hash 码不变,
// filename: "[name].js"
},
mode: "development",
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /.\less$/,
// loader 的替换
use: [mincssExtractPlugin.loader, 'css-loader', 'less-loader']
// use: ['style-loader', 'css-loader', 'less-loader']
// use: ['kkb-style-loader', 'kkb-css-loader', 'kkb-less-loader']
},
{
test: /.\scss$/,
use: ['style-loader', {loader: 'css-loader', options: {}}, 'sass-loader']
},
{
test: /\.(jpg|gif|pne?g|webp)$/, // 处理各种图片
use: { loader: 'url-loader', options: {
name: "[name]-[hash].[ext]",
publicPath: '../images', // 图片的路径前缀
outputPath: 'images', // 对所有的图片, 在css 中引用可以都增加../ , 才能遭到路径
limit: 1024 * 3
} }
},
{
test: /\.(woff|woff2|svg|eot)$/, // 处理各种图片
use: { loader: 'file-loader', options: {
name: "[name].[ext]",
publicPath: '../',
} }
}
]
},
plugins: [
...htmlwebpackplugins, // htmlWebpackPlugin 的生成
new CleanWebpackPlugin(),
new mincssExtractPlugin({ // 插件的使用
// filename: "css/[name].css"
filename: "css/[name]-[contenthash:8].css" // 对css 的chunkhash
})]
}
动态的创建entry , htmlwebpackplugin
对应的文件, html 都可以放到对应的目录
const path = require('path');
// 将css 抽离出独立的css文件
const htmlWebpackPlugin = require('html-webpack-plugin');
const mincssExtractPlugin = require('mini-css-extract-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
entry: {
main: "./src/index.js",
list: './src/list.js'
},
output: {
path: path.resolve(__dirname, './dist'),
filename: "[name]-[chunkhash:8].js"// 给output 增加hash
// hash 码很长, 只取前面的6位 , 当代码,没有改变的时候, hash 码不变,
// filename: "[name].js"
},
mode: "development",
resolveLoader: { // 增加配置后, 可以增加一个可以处理url的方法
// 默认去node_modules 寻找, 找不到去下一个
modules: ["node_modules", './myLoaders']
},
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /.\less$/,
// loader 的替换, 形成的独立的
use: [mincssExtractPlugin.loader, 'css-loader', 'less-loader']
// use: ['style-loader', 'css-loader', 'less-loader']
// use: ['kkb-style-loader', 'kkb-css-loader', 'kkb-less-loader']
},
{
test: /.\scss$/,
use: ['style-loader', {loader: 'css-loader', options: {}}, 'sass-loader']
},
{
// 图片的处理
test: /\.(jpg|gif|pne?g|webp)$/, // 处理各种图片
use: { loader: 'url-loader', options: { // 进行配置项的配置
name: "[name]-[hash:8].[ext]", // 名称, 对应的hash 值, 扩展名称, 使用占位符
publicPath: '../images', // 图片的路径前缀, 在css 文件中的增加
// webpack 打包的时候, 会获取真实的图片, 需要在前面增加对应的真实位置, 所以加 '../images' , 获取
// dist 打包中的images 目录
outputPath: 'images', // 对所有的图片, 在css 中引用可以都增加../ , 才能遭到路径
// outputPath 打包后文件存放文件的目录, 默认值为undefind, dist 目录存放的位置
limit: 1024 * 3 // 大图将将会不转, 小图讲会转换, 转换为 base64, 存储在css
// name: 'images/[name]-[hash].[ext]' //或生成一个images 目录
} }
},
{
test: /\.(woff|woff2|svg|eot)$/, // 处理各种图片
use: { loader: 'file-loader', options: {
name: "[name].[ext]",
publicPath: '../webfont',
outputPath: 'webfont'
} }
}
]
},
plugins: [
// 两个文件的打包
new htmlWebpackPlugin( // 打包生成两个文件, 生成的文件, 并未对文件做取法
{
template: './src/index.html', // 模版配置
filename: 'index.html', // 文件名配置
chunks: ['main'] // 标示放入的文件, 配置的哪一个chunk 放入 对应的html
}
),
new htmlWebpackPlugin( // 打包生成两个文件
{
template: './src/list.html', // 模版配置
filename: 'list.html', // 文件名配置
chunks: ['list']// 配置的哪一个chunk 放入 对应的html
}
),
new CleanWebpackPlugin(),
new mincssExtractPlugin({ // 插件的使用
// filename: "css/[name].css"
filename: "css/[name]-[contenthash:8].css" // 对css 的chunkhash
})]
}