什么是webpack
模块打包器。用户构建前端工程化的构建工具(更适用于单页面应用),将网页依赖变成了webpack依赖,在webpack中,构建成浏览器可以识别的静态资源。
安装
全局安装和本地安装 -》 本地安装
全局安装可以去cmd中直接运行
但是本地安装需要在package.json中定义脚本
所以scripts的作用有以下两点的作用:
保存一些快速启动单词较长的指令
想要运行本地依赖
"scripts":{
"build": "webpack"
}
4.x开始默认入口文件src下面的index.js
如何自定义webpack配置
项目根目录下新建一个webpack.config.js
const path = require("path")
module.exports = {
mode: ''
}
mode: ''
两种模式:production development
production 模式可以压缩 development模式不压缩
entry 入口文件
自定义配置文件
因为自定义的入口文件是src下面的index.js
this.所以我们将入口自定义设置成我们想要的自定义的src下面的mian.js
entry: path.join(__dirname, 'src/main.js')
记住需要引入path const path = require("path")
在终端执行npm run build以后,生成了dist文件,main.js压缩了
entry多入口文件
将entry写成一个对象:属性名为入口文件的名称,属性值为具体的地址
entry:{
entry1: path.join(__dirname, 'src/main.js'),
entry2: path.join(__dirname, 'src/main2.js')
}
生成了两个压缩文件
output出口
没有自定义设置出口时:
出口自定义为根目录下面的dist文件,压缩文件名为入口文件名。
自定义出口设置:
针对单入口
output:{
path:path.join(__dirname,'src/build'),
filename:'bundle.js'
}
path属性:出口文件的文件地址放在哪里
filename属性:出口文件的文件名
多入口
entry:{
entry1: path.join(__dirname, 'src/main.js'),
entry2: path.join(__dirname, 'src/main2.js')
}
output:{
path:path.join(__dirname,'src/build'),
filename:'bundle.js'
}
按照上面的写法,会出现生成两个bundle.js文件,产生冲突!
解决:
webpack预定义一些类似于es6模板字符串语法,同时预设了一些变量
"[预设好的变量]" "[name]"
output:{
path:path.join(__dirname,'src/build'),
filename:'[name].js'
}
这样,生成了两个出口文件 文件名默认为为多入口定义的入口文件名
But 还是会有很大的问题!
什么问题:当我们修改文件以后,第二次 打包上线的时候,虽然压缩内容也更新了,可是浏览器打开的内容还是上一次的文件内容,因为浏览器有缓存
"[hash]"构建时 根据文件的内容生成随机数,内容变化时重新生成新的hash值
"[hash:8]" 限制hash值得个数
两个文件用的hash值是一样得,如果我改了入口文件中的第一个入口文件得内容,重新打包,那么两个出口文件都会生成新的文件
"[chunkhash]"根据每个入口文件内容变化生成单独的hash
"[chunkhash:8]"
修改入口main2.js以后:
plugins插件 定义网页模板文件
下载
npm i html-webpack-plugin
引入
const HtmlWebpackPlugin = require('html-webpack-plugin')
配置文件中新增plugins属性:
plugins: [
new HtmlWebpackPlugin()
]
设置title的内容和项目html文件的地址
plugins: [
new HtmlWebpackPlugin({
// html的title内容
title: 'webpack',
// 定义项目html文件的路径
template: path.join(__dirname, 'public/index.html')
})
]
根目录下新建public文件夹,在public文件夹下新建index.html文件
title使用node模板渲染出页面标题
打包生成:
webpack loader
解析器
为什么用这个:因为引用css文件时发现不可用,需要解析
功能
在webpack构建项目中 在js引入其他资源时 对其他资源进行解析 不同的资源需要不同的loader来解析 其中解析 .vue结尾文件组件是 vue-loader
配置css-loader
安装
npm i css-loader style-loader -D
配置文件中新增module属性:
module:{
// 不同loader的配置位置
rules:[
{
// 什么类型的文件 所有以.css结尾的文件
test:/.css$/,
// 执行顺序从后向前
use:[
'style-loader',
'css-loader'
// use的使用顺序是从后向前的
]
}
]
}
css-loader作用:在js中解析css
style-loader作用:将解析好的css 创建一个style标签 定义在style标签中插入到head中
使用顺序:先使用css-loader 然后使用style-loader use中的使用顺序是从后向前的
配置sass loader
安装loader
npm i sass sass-loader -D
sass 编译sass语法
(编译sass 除了sass包还有一个node-sass特别不建议使用 资源服务减慢 经常下载不下来 node新版本不支持 node-sass会报错)
sass-loader将sass或者scss文件解析成css文件
配置文件新增module属性
module:{
rules:[
{
test:/.(sass|scss)$/,
use:[
'style-loader',
'css-loader',
'sass-loader'
// 使用顺序是从后向前的
]
}
]
}
新建一个sass文件,在main.js文件中引入此sass文件,重新打包即可,打开html查看样式是否更改
配置less
同sass,参照上文
clean-webpack-plugin
功能:每次build前删除上次build的代码
安装
npm i clean-webpack-plugin -D
引入
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
plugins: [
new HtmlWebpackPlugin({
// html得title内容
title: 'webpack',
// 定义项目html文件的位置
template: path.join(__dirname, 'public/index.html')
}),
new CleanWebpackPlugin()
]
配置Babel
Babel是干啥的? es6转成es5
新建一个b.js文件,定义一个类Person (es6语法)
打包完成以后,还是es6的语法
咋办?
安装
npm i -D babel-loader @babel/core @babel/preset-env
@babel/core :基于core.js封装的常用js工具函数的一个库
@babel/preset-env:es6转es5的预设包
module属性下配置:
module:{
rules:[
{
test: /.m?js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [
['@babel/preset-env', { targets: "defaults" }]
]
}
}
}
]
}
转成了es5的语法:
静态资源处理
静态资源:比如 字体图标 音频 视频
静态资源:开发时一般存储在src/assets中,但是build以后,assets就没有了,静态资源该如何处理
在webpack5.x以前静态资源处理 安装file-loader和url-loader来处理 5.x以后内置了静态资源的处理模块
在module属性下配置:
module:{
rules:[
{
test: /.(png|svg|jpg|jpeg|gif)$/i, // 处理图片
type: 'asset',
generator:{
filename: 'static/imgs/[hash][ext]'
},
parser: {
dataUrlCondition: {
// 转换成base64最大体积限制
maxSize: 4 * 1024 // 4kb 图片小于4kb时,压缩后的文件中没有image文件,超出4kb时,没有产生image文件
}
}
},
{
test: /.(mp3|mp4|wmv)$/i, // 音频视频
type: 'asset',
generator:{
filename: 'static/aa/[hash][ext]'
}
},
{
test: /.(ttf|eot|svg)$/i, // 字体图标格式
type: 'asset',
generator:{
filename: 'static/fonts/[hash][ext]'
}
},
]
}
没有超出maxSize值:线上图片
超出maxSize值:本地图片
webpack-dev-server启动开发环境服务器
安装
npm i webpack-dev-server -D
配置文件中新增属性devServer
// 配置服务器
devServer: {
// index.html存储目录
static: {
directory: path.join(__dirname, 'public'),
},
compress: true, // 使用启功gzpi压缩
// port: 9000
proxy: {
}
}
在脚本中添加serve(不理解,见上文):
"scripts": {
"build": "webpack",
"serve": "webpack-dev-server"
},
通过http://localhost:8080/路径访问(ps:端口号因人而异的去改变)
引入后缀名省略以及自定义别名设置
在配置文件中新增resolve属性
resolve: {
// 定义哪些文件引入时可以省略后缀名
extensions: ['.js', '.json', '.vue'],
// 自定义路径别名
alias: {
"@": path.join(__dirname, 'src')
}
}
修改了src路径为@: