Vue之WebPack相关知识
一、webpack的基本使用
1、概念
webpack是前端项目工程化的具体解决方案。
2、主要功能
它提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览器端JavaScript的兼容性、性能优化等强大的功能。(也就是程序员可以写更高级地代码,而webpack则会将高级代码自动转换成低级代码)
3、优点
让程序员把工作的重心放到具体功能的实现上,提高了前端开发效率和项目的可维护性。
注意:目前Vue, React 等前端项目,基本上都是基于webpack进行工程化开发的。
二、webpack应用
1、实现隔行变色功能
1.1 新建项目空白目录
(1)在当前目录下,打开终端,并运行npm init -y命令,初始化包管理配置文件package.json
npm init -y
运行成功后,该文件夹下会出现package.json这个文件
1.2 新建src源代码目录
(1)在建好src文件夹后,如下图
(2)点击进入src文件夹,然后创建index.html和index.js两个脚本文件
如下图
1.3 初始化页面结构
(1)用VScode打开index.html文件,输入!号,再回车,便会自动出现如下代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
(2)在body标签下输入
ul>li{这是第$个li}*9
(3)再按回车,body标签内便会自动生成相关代码
完整结构代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul>
<li>这是第1个li</li>
<li>这是第2个li</li>
<li>这是第3个li</li>
<li>这是第4个li</li>
<li>这是第5个li</li>
<li>这是第6个li</li>
<li>这是第7个li</li>
<li>这是第8个li</li>
<li>这是第9个li</li>
</ul>
</body>
</html>
1.4 安装jQuery
运行npm install jquery -S命令,安装jQuery
npm i jquery -S
安装成功后,如下图
1.5 通过ES6模块化的方式导入jQuery
(1)在index.js这个文件里导入命令
// 1.使用ES6导入语法,导入jQuery
import $ from 'jquery'
注意:直接在html页面里也是用不了的,得用webpack打包后才能用。
(2)实现列表隔行变色效果
// 2.定义jQuery的入口函数
$(function () {
// 3.实现奇偶行变色
// 奇数行为红色
$('li:odd').css('background-color', 'red')
// 偶数行为粉红色
$('li:even').css('background-color', 'pink')
})
1.6 安装webpack模块
(1)在终端运行如下命令
npm install [email protected] [email protected] -D
或者
npm install [email protected] [email protected] --save-dev
注意:-D是–save-dev的缩写
(2)如果安装报错
解决方法
首先删除该项目中下载好的node_modules
再删除该项目中package-lock.json文件
以管理员权限执行下面的命令:
再清除npm缓存 npm cache clean --force
最后npm install
再重新执行npm install [email protected] [email protected] -D
应该就没问题了
1.7 在项目中配置webpack
(1)在项目根目录中,创建名为webpack.config.js的webpack配置文件,并初始化如下的基本配置。
同时代表webpack运行的模式,可选值有两个development 和 production。
开发时用development,打包时间快,但压缩包大
生产时用production,打包时间慢,但压缩包小
// 使用Node.js中的导出语法,向外导出一个webpack的配置对象
module.exports = {
mode: 'development'
}
(2)在package.json的scripts节点下,新增dev脚本如下
"scripts": {
"dev": "webpack"
}
注意:script节点下的脚本,可以通过npm run执行,例如npm run dev
1.8 运行命令,启动webpack进行项目的打包构建
(1)执行命令
npm run dev
得出结果,显示如下便执行成功
1.9 自定义打包的入口和出口
(1)webpack中的默认约定
在webpack 4.x和5.x的版本中,有如下的默认约定
默认的打包入口文件为src目录下的index.js文件
默认的输出文件路径为dist目录下的main.js
注意:可以在webpack.config.js中修改打包的默认约定
(2)可以指定打包的出入口
在webpack.config.js配置文件中,通过entry节点指定打包的入口,通过output节点指定打包的出口。
const path = require('path')
module.exports = {
// 代表webpack运行的模式,可选值有两个development 和 production
mode: 'development',
// 自定义打包入口文件的路径
entry: path.join(__dirname,'./src/index1.js'),
// 自定义生成的文件的存放路径
output: {
// 存放到目录
path: path.join(__dirname, 'dist'),
// 生成的文件名
filename: 'mian1.js'
}
}
1.10 代码里导入打包好的js文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../dist/main1.js"></script>
</head>
<body>
<ul>
<li>这是第1个li</li>
<li>这是第2个li</li>
<li>这是第3个li</li>
<li>这是第4个li</li>
<li>这是第5个li</li>
<li>这是第6个li</li>
<li>这是第7个li</li>
<li>这是第8个li</li>
<li>这是第9个li</li>
</ul>
</body>
</html>
结果如下
2、webpack中的插件
2.1 webpack插件的作用
通过安装和配置第三方的插件,可以拓展webpack的能力,从而让webpack用起来更方便。
2.2 webpack-dev-server插件
(1)介绍
每当修改了源代码,webpack会自动进行项目的打包和构建。
(2)命令
npm install [email protected] -D
注意:安装时要把VSCode或其他打开该文件夹的软件关掉。
(3)配置webpack-dev-server
修改package.json中的scripts下的dev命令
"scripts": {
"dev": "webpack serve"
},
(4)重新进行项目的打包
npm run dev
(5)在浏览器中访问http://localhost:8080地址,查看自动打包效果。
(6)如果报错,解决方案如下
重新安装 webpack-cli 依赖模块
npm install webpack-cli --save-dev
重新运行
npm run dev
注意:webpack-dev-server会启动一个实时打包的http服务器,会将打包好的文件放到内存里,所以通过本地打开页面的话,修改相关东西还是不会改变,只有通过http://localhost:8080/src才能看到实时的变化,而且引入的代码也得修改成
2.3 html-webpack-plugin插件
(1)介绍
webpack中的HTML插件(类似于一个模板引擎插件)
(2)命令
npm install [email protected] -D
(3)相关使用
// 1.导入HTML插件,得到一个构造函数
const HtmlPlugin = require('html-webpack-plugin')
// 2.创建HTML插件的实例对象
const htmlPlugin = new HtmlPlugin({
template: './src/index.html', // 指定原文件的存放路径
filename: './index.html', //指定生成的文件的存放路径
})
// 使用Node.js中的导出语法,向外导出一个webpack的配置对象
module.exports = {
// 代表webpack运行的模式,可选值有两个development 和 production
mode: 'development',
// 3.通过plugins节点,使htmlPlugin插件生效
// 插件的数组,将来webpack在运行时,会加载并调用这些插件
plugins: [htmlPlugin],
}
(4)运行命令
npm run dev
即可通过http://localhost:8080访问时,便直接就有页面出现。
(5)注意
使用html-webpack-plugin插件时,通过HTML插件复制到项目根目录中的index.html页面,也被放到了内存中。
HTML插件在生成的index.html页面,自动注入了打包的index.js文件。
所以代码里可以不用引入,会自动渲染。
2.4 devServer节点
(1)介绍
在webpack.config.js配置文件中,可以通过devServer节点对webpack-dev-server插件进行更多的配置
(2)相关代码
devServer: {
// 首次打包成功后,自动打开浏览器
open: true,
// 在http协议中,如果端口号是80,则可以被省略
port: 92,
// 指定运行的主机地址
host: '127.0.0.1'
}
(3)在webpack.config.js配置文件中的位置
module.exports = {
mode: 'development',
devServer: {
// 首次打包成功后,自动打开浏览器
open: true,
// 在http协议中,如果端口号是80,则可以被省略
port: 92,
// 指定运行的主机地址
host: '127.0.0.1'
}
}
结果
3、webpack中的加载器(loader)
3.1 loader概述
在实际开发过程中,webpack默认只能打包处理以 .js后缀名结尾的模块。其他非 .js后缀名结尾的模块,webpack默认处理不了,需要调用loader加载器才可以正常打包,否则会报错。
3.2 作用
loader加载器的作用是协助webpack打包处理特定的文件模块
css-loader可以打包处理 .css相关的文件
less-loader可以打包处理 .less相关的文件
babel-loader可以打包处理 webpack无法处理的高级JS语法
3.3 打包处理css文件
(1)安装处理css文件的loader命令
npm i [email protected] [email protected] -D
(2)在webpack.config.js的module中的rules数组中,添加loader规则。
module: {
rules: [
// 定义了不同模块对应的loader
// 文件名后缀名的匹配规则
{
test: /\.css$/, use:['style-loader','css-loader']}
]
}
其中,test表示匹配的文件类型,use表示对应要调用的loader
(3)在webpack.config.js配置文件中的位置
module.exports = {
mode: 'development',
module: {
rules: [
// 定义了不同模块对应的loader
// 文件名后缀名的匹配规则
{
test: /\.css$/, use:['style-loader','css-loader']}
]
}
}
(4)在index.js中的代码
import './css/index.css'
(5)对应css文件的代码
html,
body,
ul {
margin: 0;
padding: 0;
}
html li,
body li,
ul li {
line-height: 30px;
padding-left: 20px;
font-size: 12px;
}
结果
3.4 处理css的流程
(1)当webpack发现某个文件处理不了的时候,会查找webpack.config.js这个配置文件,看module.rules数组中,是否配置了对应的loader加载器。
(2)webpack把Index.css这个文件,先转交给css-loader进行处理
(3)当css-loader处理完毕之后,会把处理的结果,转交給style-loader
(4)当style-loader处理完毕之后,没有下一个loader了,便把处理的结果,转交给了webpack
(5)webpack把style-loader处理的结果,合并到/dist/index.js中,最终生成打包好的文件。
3.5 打包处理less文件
(1)安装处理less文件的命令
npm i [email protected] [email protected] -D
(2)在webpack.config.js的module中的rules数组中,添加loader规则。
module: {
rules: [
// 定义了不同模块对应的loader
// 处理 .less文件的loader
{
test:/\.less$/, use:['style-loader','css-loader','less-loader']}
]
}
(3)在webpack.config.js配置文件中的位置
module.exports = {
mode: 'development',
module: {
rules: [
// 定义了不同模块对应的loader
// 处理 .less文件的loader
{
test:/\.less$/, use:['style-loader','css-loader','less-loader']}
]
}
}
(4)在index.js中的代码
import './css/index.less'
(5)对应less文件的代码
html,
body,
ul {
margin: 0;
padding: 0;
li{
line-height: 30px;
padding-left: 20px;
font-size: 12px;
}
}
结果
3.6 打包处理url路径相关的文件
(1)安装处理url路径相关文件的命令
npm i [email protected] [email protected] -D
(2)在webpack.config.js的module中的rules数组中,添加loader规则。
module: {
rules: [
// 定义了不同模块对应的loader
// 处理 图片的loader
// 如果 需要调用的loader只有一个,则只传递一个字符串也行,如果有多个loader,则必须指定数组
{
test: /\.jpg|png|gif$/, use: 'url-loader?limit=22229'},
]
}
注意:
limit用来指定图片的大小,单位是字节(byte)
只有小于等于limit大小的图片,才会被转为base64格式的图片。
小图片建议转换成base64,方便快速加载,而不用多次发请求。
(3)在webpack.config.js配置文件中的位置
module.exports = {
mode: 'development',
module: {
rules: [
// 定义了不同模块对应的loader
// 处理 图片的loader
// 如果 需要调用的loader只有一个,则只传递一个字符串也行,如果有多个loader,则必须指定数组
{
test: /\.jpg|png|gif$/, use: 'url-loader?limit=22229'},
]
}
}
(4)在index.js中的代码
// 导入图片,得到图片文件
import logo from './images/logo.jpg'
// 给img标签的src动态赋值
$('.box').attr('src',logo)
(5)对应代码
<img src="" alt="" class="box">
结果
3.7 webpack处理样式的过程
导入样式(在webpack中,一切皆模块,都可以通过ES6导入语法进行导入和使用)
如果某个模块中,使用from接收到的成员为undefined,则不需要接收
3.8 打包处理js中的高级语法
(1)介绍
webpack只能打包处理一部分高级的JavaScript语法,对于一些webpack无法处理的高级js语法,则需要借助babel-loader进行打包处理。
(2)命令
npm i [email protected] @babel/[email protected] @babel/[email protected] -D
(3)在webpack.config.js的module中的rules数组中,添加loader规则。
module: {
rules: [
// 使用babel-loader处理高级js语法
// 在配置babel-loader的时候,只需要把自己的代码进行转换即可,要排除node_modules目录中的JS文件
// 因为第三方包中的JS兼容性,不需要关心
{
test: /\.js$/,
use: 'babel-loader', exclude: /node_modules/
},
]
}
(4)在webpack.config.js配置文件中的位置
module.exports = {
mode: 'development',
module: {
rules: [
// 使用babel-loader处理高级js语法
// 在配置babel-loader的时候,只需要把自己的代码进行转换即可,要排除node_modules目录中的JS文件
// 因为第三方包中的JS兼容性,不需要关心
{
test: /\.js$/,
use: 'babel-loader', exclude: /node_modules/
},
]
}
}
(5)在项目根目录下,创建名为babel.config,js的配置文件
module.exports = {
plugins: [['@babel/plugin-proposal-decorators', {
legacy: true}]]
}
(6)在index.js文件内写测试代码
// 定义装饰器函数
function info(target) {
target.info = 'Person info'
}
// 定义一个普通的类
@info
class Person{
}
console.log(Person.info)
结果
4、webpack的打包发布
4.1 配置build命令
(1)在package.json文件中的scripts节点下,build命令如下
"scripts": {
"dev": "webpack serve",
"build": "webpack --mode production"
},
–mode是一个参数项,用来指定webpack的运行模式。production代表生产环境,会对打包生成的文件进行代码压缩和性能优化。
注意:通过–mode指定的参数项,会覆盖webpack.config.js中的mode选项。–mode的优先级比mode选项高。
4.2 优化图片和js文件的存放位置
(1)修改webpack.config.js文件里的js文件生成路径
const path = require('path')
module.exports = {
// 代表webpack运行的模式,可选值有两个development 和 production
mode: 'development',
// entry: '指定要处理哪个文件'
entry: path.join(__dirname, './src/index.js'),
// 指定生成的文件要存放到哪里
output: {
// 存放的目录
path: path.join(__dirname, 'dist'),
// 生成的文件路径
filename: 'js/index.js'
},
}
生成成功后的结果
(2)修改webpack.config.js中的url-loader配置项,新增outputPath选项即可指定图片文件的输出路径。
明确指定把打包生成的图片文件,存储到dist目录下的image文件夹
module.exports = {
// 代表webpack运行的模式,可选值有两个development 和 production
mode: 'development',
module: {
rules: [
// 处理 图片的loader
{
test: /\.jpg|png|gif$/,
// 配置url-loader的时候,多个参数之间,使用&符号进行分隔
use: 'url-loader?limit=470&outputPath=images',
},
]
}
}
结果
4.3 配置和使用clean-webpack-plugin插件
(1)安装命令
npm install --save-dev clean-webpack-plugin
(2)在webpack.config.js中增加代码
const {
CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
// 代表webpack运行的模式,可选值有两个development 和 production
mode: 'development',
// 通过plugins节点,使htmlPlugin插件生效
// 插件的数组,将来webpack在运行时,会加载并调用这些插件
plugins: [htmlPlugin, new CleanWebpackPlugin()],
}
5、Source Map
5.1 介绍
Source Map是一个信息文件,里面存储着位置信息。也就是说Source Map文件中存储着压缩混淆后的代码,所对应的转换前的位置。如果出错,除错工具将直接显示原始代码,而不是转换后的代码,能够极大方便后期的调试。
5.2 开发环境下,精准定位到具体的错误行(建议)
在webpack.config.js中添加如下代码
module.exports = {
// 代表webpack运行的模式,可选值有两个development 和 production
mode: 'development',
// 此选项生成的Source Map能够保证“运行时报错的行数” 与 “源代码的行数”保持一致
devtool: 'eval-source-map',
}
5.3 生产环境下,出现错误时,即定位行数,也暴露源码(不建议)
在webpack.config.js中添加如下代码
module.exports = {
// 代表webpack运行的模式,可选值有两个development 和 production
mode: 'development',
// 此选项生成的Source Map能够保证“运行时报错的行数” 与 “源代码的行数”保持一致
devtool: 'source-map',
}
5.4 生产环境下,出现错误时,只定位行数,不暴露源码(建议)
在webpack.config.js中添加如下代码
module.exports = {
// 代表webpack运行的模式,可选值有两个development 和 production
mode: 'development',
// 此选项生成的Source Map能够保证“运行时报错的行数” 与 “源代码的行数”保持一致
devtool: 'nosources-source-map',
}
方便用户自己调试,提高网站安全性
5.5 注意
发布项目时,建议关闭devtool选项,则最终生成的文件中不包含Source Map。这样可以防止原始代码通过Source Map的形式暴露给其他人。
6、拓展
6.1 用@代替src目录
(1)代码如下
module.exports = {
// 代表webpack运行的模式,可选值有两个development 和 production
mode: 'development',
resolve: {
alias: {
// 用@符号表示src这一层目录
'@': path.join(__dirname, './src/')
}
}
}
(2)相关应用
例子如下:
import '@/css/index.css'