1. 为什么要学webpack
- 减少代码体积-原有代码体积很大,文件很大,压缩到没有空余空间
文件的数量减少- 几万个文件合并成几个文件- 转化合并
脚手架-辅助开发工具-代码量很大,不会被打包到项目中
提升浏览器访问速度
绝大多数的框架 vue/react/angular/uni-app-taro 都在使用webpack进行打包
gulp/grunt-只是一个工具,不具备webpack全家桶的能力
- webpack的生态异常强大
2. webpack是什么
是一个第三方的模块包-打包工具
作用是: 分析-转化-打包代码
让浏览器可以识别 很多框架的语言 vue-react-less-sass /es7/es8/es10…
要不要百分之百掌握?
- 面试-
- vue-uniapp-taro基于webpack进行了深度定制,很多理念和属性是一样的
- 会查文档就可以了
3. 初始化webpack环境
新建一个文件夹,初始化项目
$ npm init -y # 一路绿灯的创建一个项目
安装两个依赖包
$ npm i webpack webpack-cli -D #保存到开发依赖下
配置执行命令-package.json
"scripts": {
"build" : "webpack"
}
4.打包两个js文件为一个js文件
没有配置webpack的情况下,默认只能找到src/index.js
src 是源代码的存放目录,拿到项目先看src
新建add.js ```javascript // 求和函数 function add(num1, num2) { return num1 + num2 } module.exports = { add, }
3. 在index.js中引入add.js
```javascript
const obj = require("./add")
console.log(obj.add(1, 2))
- 打包-执行命令
$ npm run build
package.json中的name不能和安装的包名重名-安装失败
npm包-开发了一个模块,放到网上-别人来下载
webpack开发了一个叫webpack的名字放到网上了
个人可以开发包的- 一但别人占用了包名,
5.修改webpack的配置的入口和出口
默认的入口 src/index.js 默认的出口是 dist/main.js
- 新建webpack.config.js- 建在根目录上(和package.json同级的目录)
- 导出一个配置
https://webpack.javascriptc.com/concepts/
- 在webpack.config.js中修改配置 ```javascript const path = require(“path”)
// 导出一个配置 webpack 属于nodejs module.exports = { entry: “./src/main.js”, // 配置入口 output: { // 路径 + 文件名 path: path.resolve(__dirname, “build”), filename: “bundle.js”, }, }
4. 再次执行打包
```bash
$ npm run build
6.隔行换色案例
- 配置环境-参考第三章的初始化环境
- 安装jquery,编写隔行换色效果
$ npm i jquery # 安装到运行时依赖
- src/main.js ```javascript import $ from “jquery” $(function () { $(“li:nth-child(odd)”).css(“color”, “red”) //奇数设置成红色 $(“li:nth-child(even)”).css(“color”, “green”) //偶数设置成绿色 })
3. 修改webpack.config.js
```javascript
const path = require("path")
module.exports = {
// 导出配置
entry: "./src/main.js",
output: {
path: path.resolve(__dirname, "build"),
filename: "bundle.js",
},
}
- 新建public/index.html
```html
<!DOCTYPE html>
- 第1个li标签
- 第2个li标签
- 第3个li标签
- 第4个li标签
- 第5个li标签
- 第6个li标签
- 第7个li标签
- 第8个li标签
- 第9个li标签
- 第10个li标签
5. 执行打包命令
```bash
$ npm run build
- 将public下的index.html拷贝到build目录,引入打包好的文件,运行页面看效果
```html
<!DOCTYPE html>
- 第1个li标签
- 第2个li标签
- 第3个li标签
- 第4个li标签
- 第5个li标签
- 第6个li标签
- 第7个li标签
- 第8个li标签
- 第9个li标签
- 第10个li标签
![image.png](https://cdn.nlark.com/yuque/0/2022/png/8435673/1655524523065-c7ede871-8114-4771-8429-981263246270.png#clientId=u345b0f4a-b88a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=761&id=u849ba920&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1522&originWidth=2274&originalType=binary&ratio=1&rotation=0&showTitle=false&size=437810&status=done&style=none&taskId=ud235fe59-2bb9-45dd-b323-e7493d0ed30&title=&width=1137)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/8435673/1655524543490-c8096539-f780-49b7-90a4-0c629bd04717.png#clientId=u345b0f4a-b88a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=314&id=u801ecc1f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=628&originWidth=660&originalType=binary&ratio=1&rotation=0&showTitle=false&size=77711&status=done&style=none&taskId=ud3f032bb-044b-4d88-904c-b1b59bfb87d&title=&width=330)
<a name="MestT"></a>
## 7.按需导出的全部引入和箭头函数
- 按需导出
```javascript
export const a = 1
export const b = 2
export const c = 3
- 默认导出
导出const d = 4 export default d
```javascript import { a,b,c} from ‘地址’ import D from ‘地址’export const a = 1 export const b = 2 export const c = 3 const d = 4 export default d
// 以上代码优化
import D,{ a, b, c } from “地址”
// 导入所有的模块 import * as All from ‘地址’
All.a All.b All.c All.default 是 d
- 按需导出的另外一种写法
```javascript
const a = 1
const b = 2
const c = 3
export { a, b, c } //按需导出的另外一种写法
export const a = 1
export const b = 2
export const c = 3
箭头函数的实现原理
function People () { const call = function () { // this正常情况下 指向调用者 } const call2 = () => { // this指向People this.name = "张三" } var _this = this // 将父级作用的this 给了一个变量 const call2 = function() { // this指向People _this.name = "张三" } }
8.使用HtmlPlugin的插件自动生成html-自动引入文件
安装这个插件
$ npm i html-webpack-plugin -D
在webpack.config.js中配置该插件 ```javascript const path = require(“path”) const HtmlPlugin = require(“html-webpack-plugin”) module.exports = { entry: “./src/main.js”, output: { path: path.resolve(__dirname, “build”), filename: “bundle.js”, }, plugins: [ new HtmlPlugin({ template: “./public/index.html”, // 指向要复制的html文件 }), ], // 配置插件 }
<a name="dzTKZ"></a>
## 9.项目中引入css文件去除圆点
1. 新建一个css文件 css/index.css
```css
li {
list-style: none;
}
- 在入口处引入该文件 ```javascript import $ from “jquery” import “./css/index.css” $(function () { $(“li:nth-child(odd)”).css(“color”, “red”) //奇数设置成红色 $(“li:nth-child(even)”).css(“color”, “green”) //偶数设置成绿色 })
![image.png](https://cdn.nlark.com/yuque/0/2022/png/8435673/1655535327375-552f4222-e92f-46b8-a8de-d36b3008650f.png#clientId=u76a2b464-7d08-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=402&id=u5772ceae&margin=%5Bobject%20Object%5D&name=image.png&originHeight=804&originWidth=1754&originalType=binary&ratio=1&rotation=0&showTitle=false&size=340252&status=done&style=none&taskId=ua8a7acf8-1e79-45ee-ab68-9ff52cd0e8e&title=&width=877)
<a name="Ar7xz"></a>
## 10.使用加载器 loader处理css类型
1. 下加载器
```bash
$ npm i style-loader css-loader -D
css-loader让webpack处理css文件,引入css文件
style-loader 让webpack把得到的css样式插入dom中
- 给webpack进行配置
```javascript
const path = require(“path”)
const HtmlPlugin = require(“html-webpack-plugin”)
module.exports = {
// 导出配置
entry: “./src/main.js”,
output: {
path: path.resolve(__dirname, “build”),
filename: “bundle.js”,
},
plugins: [
new HtmlPlugin({
template: “./public/index.html”, // 指向要复制的html文件
}),
], // 配置插件
module: {
rules: [
{
}, ], }, }test: /\.css$/i, // 正则表达式 use: ["style-loader", "css-loader"], // 顺序不能调整
<a name="c7qp9"></a>
## 11.处理less
1. 安装加载器 less less-loader
```bash
$ npm i less less-loader -D
- 配置到webpack中
```javascript
const path = require(“path”)
const HtmlPlugin = require(“html-webpack-plugin”)
module.exports = {
// 导出配置
entry: “./src/main.js”,
output: {
path: path.resolve(__dirname, “build”),
filename: “bundle.js”,
},
plugins: [
new HtmlPlugin({
template: “./public/index.html”, // 指向要复制的html文件
}),
], // 配置插件
module: {
rules: [
{
}, {test: /\.css$/i, // 正则表达式 use: ["style-loader", "css-loader"], // 顺序不能调整
}, ], }, }test: /\.less$/i, // 正则表达式 use: ["style-loader", "css-loader", "less-loader"], // 顺序不能调整
3. 新建 less/index.less文件 设置字体大小
```less
ul {
li {
font-size: 20px
}
}
12.处理图片资源
webpack5.0内置了一些功能-比如图片资源处理
module.exports = {
module: {
// 规则
rules: [{
test: /\.(png|gif|jpg|jpeg)$/
type: 'asset', // 分析你的资源的大小 小于8kb转成base64 大于8kb不转化
}]
}
}
webpack 5 不需要针对资源再使用加载器了,原来webpack4还在用配置loader的方式
import $ from "jquery"
import "./css/index.css"
import "./less/index.less"
import HandSome from "./assets/test.jpeg"
// webpack 万物皆模块
$(function () {
$("li:nth-child(odd)").css("color", "red") //奇数设置成红色
$("li:nth-child(even)").css("color", "green") //偶数设置成绿色
})
// 创建一个元素
const imgObj = document.createElement("img")
imgObj.src = HandSome // src-路径或者base64 webpack帮我们处理
document.body.appendChild(imgObj) // 追加到元素中
13. webpack处理字体图标
- 拷贝准备好的字体图标到src目录下
- main.js中新建一个标签 i,设置它的字体图标 ```javascript import $ from “jquery” import “./css/index.css” import “./less/index.less” import HandSome from “./assets/test.jpeg” import “./assets/fonts/iconfont.css” // 引入字体图标的样式 // webpack 万物皆模块 $(function () { $(“li:nth-child(odd)”).css(“color”, “red”) //奇数设置成红色 $(“li:nth-child(even)”).css(“color”, “green”) //偶数设置成绿色 }) // 创建一个元素 const imgObj = document.createElement(“img”) imgObj.src = HandSome // src-路径或者base64 webpack帮我们处理
document.body.appendChild(imgObj) // 追加到元素中
// 创建字体图标的元素 const iObj = document.createElement(“i”) iObj.className = “icon-font icon-weixin” //设置className
document.body.appendChild(iObj) // 追加到元素中
3. 配置webpack
```javascript
const path = require("path")
const HtmlPlugin = require("html-webpack-plugin")
module.exports = {
// 导出配置
entry: "./src/main.js",
output: {
path: path.resolve(__dirname, "build"),
filename: "bundle.js",
},
plugins: [
new HtmlPlugin({
template: "./public/index.html", // 指向要复制的html文件
}),
], // 配置插件
module: {
rules: [
{
test: /\.css$/i, // 正则表达式
use: ["style-loader", "css-loader"], // 顺序不能调整
},
{
test: /\.less$/i, // 正则表达式
use: ["style-loader", "css-loader", "less-loader"], // 顺序不能调整
},
{
test: /\.(png|gif|jpg|jpeg)$/,
type: "asset", // 小于8kb =》 base64 大于8kb => 路径引用
},
{
test: /\.(eot|svg|ttf|woff|woff2)$/,
type: "asset/resource", // 直接输出目录
// 输出文件-设置文件名
generator: {
filename: "fonts/[name].[hash:6][ext]", // [ext]是带.的
},
},
],
},
}
14.降级js的处理-兼容低版本的浏览器
- babel
结合webpack + babel
使用babel-loader 核心包
安装 babel的包
$ npm i babel-loader @babel/core @babel/preset-env -D
写一些es6+的代码
function People() { const call = () => { this.name = "张三" } call() } console.log(People)
配置webpack ```javascript const path = require(“path”) const HtmlPlugin = require(“html-webpack-plugin”) module.exports = { // 导出配置 entry: “./src/main.js”, output: { path: path.resolve(__dirname, “build”), filename: “bundle.js”, }, plugins: [ new HtmlPlugin({ template: “./public/index.html”, // 指向要复制的html文件 }), ], // 配置插件 module: { rules: [ {
test: /\.css$/i, // 正则表达式 use: ["style-loader", "css-loader"], // 顺序不能调整
}, {
test: /\.less$/i, // 正则表达式 use: ["style-loader", "css-loader", "less-loader"], // 顺序不能调整
}, {
test: /\.(png|gif|jpg|jpeg)$/, type: "asset", // 小于8kb =》 base64 大于8kb => 路径引用
}, {
test: /\.(eot|svg|ttf|woff|woff2)$/, type: "asset/resource", // 直接输出目录 // 输出文件-设置文件名 generator: { filename: "fonts/[name].[hash:6][ext]", // [ext]是带.的 },
}, {
test: /\.m?js$/, exclude: /(node_modules|bower_components)/, use: { loader: "babel-loader", options: { presets: ["@babel/preset-env"], }, },
}, ], }, }
<a name="fK32Z"></a>
## 15. webpack开发服务器
1. 如果没有开发服务器,打包 => 生成物理文件
![image.png](https://cdn.nlark.com/yuque/0/2022/png/8435673/1655549053519-aa20b9cc-08f6-450a-8796-0b738d59736a.png#clientId=u944a2132-7103-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=388&id=u91aacd73&margin=%5Bobject%20Object%5D&name=image.png&originHeight=776&originWidth=2194&originalType=binary&ratio=1&rotation=0&showTitle=false&size=150941&status=done&style=none&taskId=u79106ad1-b115-44f7-b9d6-699b3290b06&title=&width=1097)<br />使用vscode插件-live-server启动服务<br />造成资源的浪费-缓慢
2. 开发服务器
> 打包速度快- 再也没有物理文件,而是将文件写入了内存
> 自动开启一个本地服务-类似于vscode中的liveserver, 直接访问地址就可以了
> 热更新-文件发生变化-重新打包-增量的模式-浏览器-直接更新
<a name="Lrwuq"></a>
## 16. 使用webpack-dev-server
1. 安装依赖包
```bash
$ npm i webpack-dev-server -D
- 配置启动服务的命令—
—open会自动打开浏览器
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"start": "webpack serve --open"
},
只要改变了webpack的配置,就得重启。
- 配置服务器的启动端口(不配也可以-8080)
```javascript
const path = require(“path”)
const HtmlPlugin = require(“html-webpack-plugin”)
module.exports = {
mode: “development”, //开发模式
// 导出配置
entry: “./src/main.js”,
output: {
path: path.resolve(__dirname, “build”),
filename: “bundle.js”,
},
plugins: [
new HtmlPlugin({
template: “./public/index.html”, // 指向要复制的html文件
}),
], // 配置插件
module: {
rules: [
{
}, {test: /\.css$/i, // 正则表达式 use: ["style-loader", "css-loader"], // 顺序不能调整
}, {test: /\.less$/i, // 正则表达式 use: ["style-loader", "css-loader", "less-loader"], // 顺序不能调整
}, {test: /\.(png|gif|jpg|jpeg)$/, type: "asset", // 小于8kb =》 base64 大于8kb => 路径引用
}, {test: /\.(eot|svg|ttf|woff|woff2)$/, type: "asset/resource", // 直接输出目录 // 输出文件-设置文件名 generator: { filename: "fonts/[name].[hash:6][ext]", // [ext]是带.的 },
}, ], }, devServer: { port: 8888, }, }test: /\.m?js$/, exclude: /(node_modules|bower_components)/, use: { loader: "babel-loader", options: { presets: ["@babel/preset-env"], }, },
```