webpack的使用
1.2 静态资源多了带来的问题
- 网页加载速度慢, 因为 我们要发起很多的二次请求
- 要处理错综复杂的依赖关系
1.3 如何解决上述问题
- 合并、压缩(gzip)、精灵图、图片的Base64编码
- 可以使用webpack解决各个包之间的复杂依赖关系
1.4 什么是webpack
- webpack 是前端的一个项目构建工具,它是基于 Node.js 开发出来的一个前端工具;
- 借助于webpack这个前端自动化构建工具,可以完美实现资源的合并、打包、压缩、混淆等诸多功能。
2. webpack的使用
2.1 webpack的安装
- 全局安装运行
npm i webpack -g
这样就可以在全局使用webpack的命令了 - 在项目根目录中运行
npm i webpack --save-dev
安装到项目依赖中
备注:在webpack4之后的版本,不光需要安装webpack还需要安装webpack-cli
2.2 webpack的使用
2.2.1 案例描述
使用webpack实现列表的隔行换色,通过这个案例学习webpack的基本使用
2.2.2 项目搭建思路
- 在有了webpack之后,我们项目都是工程化管理,每个项目的结构是很清晰。
- 对于我们的项目来说会有很多依赖,这个时候我们需要通过npm去管理这些依赖,使用
npm init
构建项目,使用package.json管理项目。(npm前端的包管理工具) - 搭建项目的目录结构
- src下放我们的源代码
- src
- api 放置接口请求的
- assets 静态文件
- components 组件
- layout 界面布局
- router 路由配置
- styles 样式
- utils 工具类
- views 放界面
- index.html 根界面
- main.js 入口文件
- index.css / index.less / index.sass 全局样式
- ...
- 安装jquery插件
npm i jquery
- npm install
- -g 全局安装
- -S 或--save : 把这个依赖保存到package.json的dependence里
- -D 或 --dev-save : 把这个依赖保存到package.json的devDependence里
- 不在页面中引入jquery而是在main.js中引用jquery(使用es6高阶语法),这样做可以减少请求次数
- 编写js脚本
- 浏览器不认识es6的高级语法,所以使用webpack打包js文件,将这个js文件转化成浏览器可以认识的文件.
- 安装webpack
npm i webpack -D
- 安装webpack-cli
npm i webpack-cli -D
- 执行打包命令,
webpack 【需要打包的文件】 -o 【
输出的文件
】
- 因为webpack不是全局安装所以没有办法在命令行中直接执行webpack命令,这里可以借助npm提供的npx命令执行webpack命令
npx webpack 【需要打包的文件】 -o 【
输出的文件
】
- 在html中引入打包好的js文件
npx 可以执行项目已经安装的可执行工具
2.2.3 webpack为我们做了什么?
- 处理了js的依赖关系,对js做了合并。
- 让浏览器不识别的高级语法,转换成浏览器可以识别的语法。
$(function(){
$('li:odd').css('background-color','red')
$('li:even').css('background-color','blue')
})
2.3 webpack的配置文件webpack.config.js
2.3.1 webpack4有默认的配置文件
- 默认配置的入口文件是src目录。我们在src根目录下添加index.js,就会默认打包这个index.js文件
- 出口文件在dist目录下生成main.js
2.3.2 自定义配置文件
- 创建webpack.config.js的文件,放在项目的根目录
- 配置入口和出口,配置放在module.exports导出的对象里
- 入口entry,配置这个时候后面写的是路径,这里用到的是node提供的path的api进行路径的拼接
- 出口output
- path
- filename
// webpack的配置文件
const path = require('path');
// 为什么使用path提供的方法拼接路径
// /src/ ,/src , index.js. /index.js
// /src//index.js
// /src/index.js
module.exports = {
entry: path.join(__dirname, 'src/main.js'),
output: {
path: path.join(__dirname, 'dist'),
filename: 'bundle.js'
}
}
- 之后直接运行webpack即可打包
在node里__dirname是这个js的当前路径
使用了配置文件之后,我们就不用每次输入入口和出口了,可以简化我们的操作,也能避免不必要的错误
执行webpack之后发生了什么:
- 它会去项目的根目录里找webpack.config.js配置文件,如果没找到会使用默认的配置文件,这个默认的配置文件是在webpack4之后才有的。默认的入口是src/index.js,默认的出口是dist/main.js。
- 回去找到配置文件配置的入口entry和出口output。
- 执行webpack的打包命令,将入口文件转化成出口文件。
配置多个入口
应用场景:
- 业务代码和第三方代码分离。
- 多模块懒加载(单页面应用)
- 业务场景:在单页面应用中,如果不做懒加载首页加载时,会把所有的js都加载出来,导致首页加载过慢
- 解决: 加载首页的只加载首页的js,用到哪个模块就加在那个模块的js
如何配置:
- entry之前是单个的地址,只能对应一个文件,entry可以配置成一个对象,对象的key就打包的入口文件起的名字,value是文件对应的地址。
- output的filename改为[name].js ,这里[name]指向就是配置的key的名字。
module.exports = {
entry: {
bundle: path.join(__dirname, 'src/main.js'),
index: path.join(__dirname, 'src/index.js')
},
output: {
path: path.join(__dirname, 'dist'),
filename: '[name].js'
}
}
2.4 使用webpack-dev-server插件启动页面
2.4.1 问题
每次修改之后都要重新打包,之后刷新页面,操作很繁琐,使用webpack-dev-server就可以解决这个问题
2.4.2 如何使用
- 安装webpack-dev-server依赖
npm i webpack-dev-server -D
- 运行这个命令启动服务
- 通过npx运行脚本
npx webpack-dev-server
- 配置package.json脚本
- 配置之后通过
npm run 【配置的名字】
就可以启动
"scripts": {
"dev": "webpack-dev-server",
},
2.4.3 执行这个webpack-dev-server发生了什么
- 启动了一个服务,这个服务默认启动在8080端口
- 执行webpack命令,把输出的内容放在了内存里,我们直接通过localhost:8080/【输出的文件名】就可以访问到这个文件。
- 为什么要放在内存里:我们文件一保存就会进行打包编译,会频繁涉及到文件的读写,内存的读写效率要比硬盘高很多,所以放在内存里。
- 我们一修改入口文件,就会执行打包命令,界面就会进行刷新
2.5 实现自动打开浏览器以及热更新
- 通过命令行指定参数的方式实现
webpack-dev-server --open --port 3000 --contentBase src --hot
注意参数之间都有空格
- open 打开浏览器
- port 服务端口号
- contentBase 默认的界面
- hot 热部署,每次修改js文件只会打包修改的地方,提高效率,浏览器不刷新修改内容
- 使用配置文件配置devServer
module.exports = {
3. html的使用html-webpack-plugin
(首先确认命令行的路径)
- 安装html-webpack-plugin
npm i html-webpack-plugin -D
- 配置html-webpack-plugin
// 先引入
const htmlWebpackPlugin = require('html-webpack-plugin');
// webpack.config.js
plugins: [ // 配置插件的节点
new htmlWebpackPlugin({ // 创建一个 在内存中 生成 HTML 页面的插件
// 指定 模板页面,将来会根据指定的页面路径,去生成内存中的 页面
template: path.join(__dirname, './src/index.html'),
// 指定生成的页面的名称
filename: 'index.html'
})
],
- 生成的文件和之前文件的区别,生成的文件里面会自动引入打包好的js文件。