认识webpack
webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具
1.静态: 项目中的静态资源如css、图片等文件
2.模块: js文件(模块化开发中,一切js文件皆为模块)
3.打包: 主要帮你压缩代码,然后还会加密、混淆代码防止被人偷窥
打包还有一个意思: 就是会把你项目中很多个文件压缩成一个文件
使用webpack为了解决 后缀名.vue 文件的问题
webpack作用
分析、压缩、打包代码
webpack好处
1、减少文件体积、减少文件数量
2、提高网页加载速度
webpack基础使用步骤
注意:webpack是node环境中的一个工具类模块,它本身是基于nodejs的
运行webpack项目命令「npm run build」
1. 新建一个文件「不要英文名字」
2. 初始化文件: npm init -y 「会出现一个package.json的文件」
3.新建文件
:src文件夹中新建测试文件index.js「src中新建测试文件index.js 」
4.根目录中新建 webpack.config.js文件
代码块 :
注意: webpack.config.js中需要写配置文件
路径:'https://webpack.docschina.org/'
代码:
// webpack 的配置文件「在webpack官网的下面直接粘贴就行」
// 倒入一个路径模块
const path = require('path');
// 导出一个对象
module.exports = {
//人口文件: webpack要对那个文件进行处理
entry: './src/index.js',
// 出口文件: webpack 处理之后的文件存放路径
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
};
5. 下载一个启动命令 「在webpack官网中搜索:下载安装」
路径: ‘https://webpack.docschina.org/guides/getting-started/#basic-setup’;
下载包文件命令: npm install webpack webpack-cli --save-dev
注意:需要在package.json中新增一个内容 「有启动webpack的作用」
6. 注意: 如果有出要一个红色的报错需要设置"开发模式"
报错信息:「“mode’ option has not been set”」 路径:
‘https://webpack.docschina.org/configuration/mode/#root’
如下:解决方法需要在webpack.config.js 文件中设置 开发者模式
// 倒入一个路径模块
const path = require('path');
// 导出一个对象
module.exports = {
// 解决报错问题
// 设置开发模式
mode:'development',
//人口文件: webpack要对那个文件进行处理
entry: './src/index.js',
// 出口文件: webpack 处理之后的文件存放路径
output: {
path: path.resolve(__dirname, 'dist'),
// 输出的文件名字
filename: 'bundle111.js',
clean: true, // 在生成文件之前清空 output 目录
},
};
7. 设置开发模式 「解决报错问题」
注意:‘如果不清空的话,修改完文件之后还会有之前的文件,这时候需要加上清空的命令.’
8. 清空之前的打包文件
路径: ‘https://webpack.docschina.org/configuration/output/#outputclean’
注意: 需要测试一下打包的js文件,在根目录中新建一个html文件
9.碰到一个问题: js的文件还需要手动引入自动将打包出来的js文件引入html文件里面
代码:
解决方法:htmlwebpackplugin
处理html文件「将打包出来的js文件自动引入指定的html中」
路径: 'https://webpack.docschina.org/plugins/html-webpack-plugin/#root'
命令: 「npm install --save-dev html-webpack-plugin」
基本用法:
// webpack 的配置文件
// 倒入一个路径模块
const path = require('path');
// 倒入处理html 文件的插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 导出一个对象
module.exports = {
// 设置开发模式
mode:'development',
//人口文件: webpack要对那个文件进行处理
entry: './src/index.js',
// 出口文件: webpack 处理之后的文件存放路径
output: {
path: path.resolve(__dirname, 'dist'),
// 输出的文件名字
filename: 'bundle111.js',
clean: true, // 在生成文件之前清空 output 目录
},
// 引入解决body中自动嵌入js文件的插件
plugins: [new HtmlWebpackPlugin({ //「需要修改一下这里 需要传递参数」
//需要传递参数「将来打包之后的文件需要插入到那个html文件中」
// 注意:需要提供一个绝对路径
template:path.resolve(__dirname, 'index.html'),
})],
};
写完之后从新运行项目: 「npm run build」
注意:
就会把index.html文件复制一份,放到dist文件中并且js自动过插入成功
效果:
10. 解决处理文件后缀 .vue的项目问题
解决方法:
下载配置vue-loader「处理.vue单文件组件」
路径: ‘https://vueloader.vuejs.org/zh/guide/#vue-cli’
下载命令: 'npm install -D vue-loadervue-template-compiler
11. 包括下载 vue的包
下载命令「npm i vue」
webpack 配置:
代码:
**写完的js文件
// webpack 的配置文件
// 倒入一个路径模块
const path = require('path');
// 倒入处理html 文件的插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 导入 VueLoaderPlugin : 处理 .vue 文件的插件
const {VueLoaderPlugin} = require('vue-loader')
// 导出一个对象
module.exports = {
// 设置开发模式
mode: 'development',
//人口文件: webpack要对那个文件进行处理
entry: './src/index.js',
// 出口文件: webpack 处理之后的文件存放路径
output: {
path: path.resolve(__dirname, 'dist'),
// 输出的文件名字
filename: 'bundle111.js',
clean: true, // 在生成文件之前清空 output 目录
},
// 引入解决 .vue 文件的modeule模块
module: {
rules: [
// ... 其它规则
// 规则: 匹配 .vue ,然后处理.vue的文件
{
test: /\.vue$/,
loader: 'vue-loader'
}
]
},
// 引入解决body中自动嵌入js文件的插件
plugins: [
new HtmlWebpackPlugin({
//需要传递参数「将来打包之后的文件需要插入到那个html文件中」
// 注意:需要提供一个绝对路径
template: path.resolve(__dirname, 'index.html'),
}),
// 请确保引入这个插件!// 处理 .vue文件的插件
new VueLoaderPlugin()
],
};**
12. 需要在 src文件中新建一个 app.vue的文件
13. 在app.vue文件中需要写的内容
14. 在src 的 idnex.js 中写的内容
15. 需要在index.html中有挂载vue实例的内容
16. 打印结果
18. 如果想在vue文件中设置style的时候需要使用一个webpack中的一个插件否在就报错
路径:‘https://www.webpackjs.com/plugins/mini-css-extract-plugin/#root’;
命令:npm install --save-dev mini-css-extract-plugin
注意:安装完这个之后还需要安装一个插件
命令:npm i css-loader
代码:
webpack.config.js文件
修改代码:
// webpack 的配置文件
// 倒入一个路径模块
const path = require('path');
// 倒入处理html 文件的插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 导入 VueLoaderPlugin : 处理 .vue 文件的插件
const {VueLoaderPlugin} = require('vue-loader')
// 导入处理css的插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// 导出一个对象
module.exports = {
// 设置开发模式
mode: 'development',
//人口文件: webpack要对那个文件进行处理
entry: './src/index.js',
// 出口文件: webpack 处理之后的文件存放路径
output: {
path: path.resolve(__dirname, 'dist'),
// 输出的文件名字
filename: 'bundle111.js',
clean: true, // 在生成文件之前清空 output 目录
},
// 引入解决 .vue 文件的modeule模块
module: {
rules: [
// ... 其它规则
// 规则: 匹配 .vue ,然后处理.vue的文件
{
test: /\.vue$/,
loader: 'vue-loader'
},{
//引入处理css的loader文件
test: /\.css$/i,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
]
},
// 引入解决body中自动嵌入js文件的插件
plugins: [
new HtmlWebpackPlugin({
//需要传递参数「将来打包之后的文件需要插入到那个html文件中」
// 注意:需要提供一个绝对路径
template: path.resolve(__dirname, 'index.html'),
}),
// 请确保引入这个插件!// 处理 .vue文件的插件
new VueLoaderPlugin(),
// 处理css的插件
new MiniCssExtractPlugin()
],
};
效果:
19. 遇到一个问题,每次改完之后就要从新打包,
注意:需要借助一个插件:帮助我们自动打包
路径:‘https://www.webpackjs.com/configuration/dev-server/#root’
命令: npm i webpack-dev-server
代码:
在这之后会有一些其他的配置内容
左侧的内容: hot文件、open文件、proxy文件
配置代码:「需要写在webpack.config.js中并且需要写到抛出中」
// webpack中自动打包工具
devServer: {
// compress:对打包文件进行压缩
compress: true,
// port指定开发服务器监听的端口
port: 9000,
// hot:模块热替换「修改的打包,没修改的不打开」
hot:true,
// 告诉 dev-server 在服务器已经启动后打开浏览器
open: true,
// 配置代理
// 当我们访问 /api地址的时候,自动将这个请求发送给: http://localhost:3000/api这个地址上
proxy: {
'/api': 'http://localhost:3000',
},
},
代码:
20. 自动启动文件,自动保存文件
注意: 需要在package.jone 中重新配置一个命令 「只要修改完之后就可以帮助我们自动打包」
21. 在webpack.config.js文件中需要配置多入口文件
原因: 以后开发的时候万一有很多个js文件
22. 给scr设置别名
代码:
代码:「需要写在webpack.config.js中并且需要写到抛出中」
// 配置别名
resolve: {
// 给src目录配置别名: @
alias: {
'@':path.resolve(__dirname,'src'),
},
},
23.配置可以省略的文件后缀
注意: 也可以省率文件的后缀名
代码:
// 配置别名
resolve: {
// 给src目录配置别名: @
alias: {
'@': path.resolve(__dirname, 'src'),
},
// 配置省略文件后缀的内容
extensions: ['.js', '.json', '.wasm', '.vue'],
},
22~23的步骤图片
如果想把文件文件后缀略的话需要进行内容的配置,需要在src的index.js中进行内容的修改
代码:
24. 可以使用vant组件组件库的内容
注意: 需要下载: 「npm i vant」
需要导入到index.js中使用
25. 编写数据接口
在webpack.config.js中写数据接口的内容
包括下载mock.js的包 「npm i mock.js」
链接: 'https://www.webpackjs.com/configuration/dev-server/#devserversetupmiddlewares';
代码:
// 编写数据接口
setupMiddlewares: (middlewares, devServer) => {
if (!devServer) {
throw new Error('webpack-dev-server is not defined');
}
// 模拟数据
var data = Mock.mock({
// 属性 list 的值是一个数组,其中含有 1 到 10 个元素
'list|4': [
{
img:"@image(100x100,@color)"
}
]
})
// get请求 //数据返回信息 //
devServer.app.get('/imgsss', (req, res) => {
res.send(data.list);
});
return middlewares;
},
注意: 数据虽然是模拟完了,但是我们现在还没有办法进行访问,需要通过一个个axios的方法进行访问内容.
26. 使用axios访问模拟好的接口内容
下载: npm i axios
注意: 需要在src中新建一个utis的文件夹 然后新建一个 http.js 文件
在axios 中直接粘贴内容:「axios的二次封装」
1. 先倒入axios
import axios from 'axios';
2. axios实例中粘贴
const instance = axios.create({
baseURL: 'https://some-domain.com/api/',
timeout: 1000,
headers: {'X-Custom-Header': 'foobar'}
});
3. 在axios中的拦截器中粘贴内容 //「需要把前面的axios改成:‘instance’」
// 添加请求拦截器
instance.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
instance.interceptors.response.use(function (response) {
// 2xx 范围内的状态码都会触发该函数。
// 对响应数据做点什么
return response;
}, function (error) {
// 超出 2xx 范围的状态码都会触发该函数。
// 对响应错误做点什么
return Promise.reject(error);
});
4. 最后导出axios模块
export default axios;
27.同时需要对axios的方法进行二次的封装
注意: 需要在utis中新建一个api文件写内容
代码:
import axios from './http';//导入axios
// 请求轮播图的列表的接口
export function getimgs(){
return axios({
url:'/imgsss'
})
}
// 注意:在哪里调用 getimgs() 这个方法就会生效
28. App.vue 中编写内容
代码:
<template>
<div>
<van-swipe class="my-swipe" :autoplay="3000" indicator-color="white">
<van-swipe-item v-for="(item, index) in list" :key="index">
<img style="height: 200px; width: 100%" :src="item" alt="" />
</van-swipe-item>
</van-swipe>
<h1>{{ msg }}</h1>
<van-button type="primary" @click="handler">更新数据</van-button>
<hr />
</div>
</template>
<script>
// 导出语句
import { ref } from "vue";
// 导入请求轮播图列表数据的方法
import { getimgs } from "./utils/api";
export default {
setup() {
var msg = ref("hello vue!!!");
var list = ref([]);
getimgs().then((res) => {
// console.log(res.data,123);
list.value = res.data;
});
// axios({
// url:'/imgs'
// })
return {
msg,
list,
handler() {
msg.value = "你好, vuejs!!!";
},
};
},
};
</script>
<style>
h1 {
color: red;
background: yellow;
}
</style>
效果:
29. 配置source-map
路径:‘https://www.webpackjs.com/configuration/devtool/#root’
注意:在webpack.confing.js中新增内容
代码:
// 生成source-map映射文件
devtool:‘source-map’,
操作完成之后使用启动命令:'npm run build’操作
之后在总文件里有一个dist文件夹中出现后缀待着.map的文件
30. 使用scss 在webpack中需要解析scss文件
代码:
路径:'https://www.webpackjs.com/loaders/sass-loader/#root'
命令:'npm install sass-loader sass --save-dev'
代码:
module: {
rules: [
// ... 其它规则
// 匹配.vue文件, 然后处理.vue文件
{
test: /\.vue$/,
loader: 'vue-loader'
},
// 处理css文件的loader
{
test: /\.css$/i,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
// 处理 scss文件的loader
{
test: /\.s[ac]ss$/i,
use: [
// 将 JS 字符串生成为 style 节点
// 'style-loader', // 替换成:MiniCssExtractPlugin.loader
MiniCssExtractPlugin.loader,
// 将 CSS 转化成 CommonJS 模块
'css-loader',
// 将 Sass 编译成 CSS
'sass-loader',
],
},
]
},
注意:设置完成之后可以在其他的地方使用
代码:
注意:需要在style后面加上内容
<style lang='scss'>
$a:#fff;
$b:red;
h1 {
color: $a;
background: $b;
}
</style>
31. webpack配置中的压缩css文件
路径:'https://www.webpackjs.com/plugins/css-minimizer-webpack-plugin/#getting-started'
下载命令:'npm install css-minimizer-webpack-plugin --save-dev'
注意:需要在webpack.config.js中引入内容
图片:
并且需要在里面新增一个内容
内容:‘minimize: true,’
完整代码:
// webpack的配置文件
// 导入路径处理模块path
const path = require('path');
// 导入处理html文件的插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 导入VueLoaderPlugin: 处理.vue文件的插件
const { VueLoaderPlugin } = require('vue-loader');
// 导入处理css的插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// 导入压缩css的插件
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
// 引入mockjs
var Mock = require('mockjs');
// 导出一个对象
module.exports = {
// 生成source-map映射文件
devtool:'source-map',
// 设置打包环境为:开发模式
mode: 'development',
// 单入口: webpack要对那个文件进行处理
// entry: './src/index.js',
// 多入口
entry: {
index: './src/index.js',
},
// 出口: webpack处理之后的文件的存放目录
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
// 在生成文件之前清空 output 目录
clean: true,
},
module: {
rules: [
// ... 其它规则
// 匹配.vue文件, 然后处理.vue文件
{
test: /\.vue$/,
loader: 'vue-loader'
},
// 处理css文件的loader
{
test: /\.css$/i,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
// 处理 scss文件的loader
{
test: /\.s[ac]ss$/i,
use: [
// 将 JS 字符串生成为 style 节点
// 'style-loader', // 替换成:MiniCssExtractPlugin.loader
MiniCssExtractPlugin.loader,
// 将 CSS 转化成 CommonJS 模块
'css-loader',
// 将 Sass 编译成 CSS
'sass-loader',
],
},
]
},
plugins: [
// 将打包处理的js文件自动引入某个html中
new HtmlWebpackPlugin({
// 此处需要提供一个绝对路径
template: path.resolve(__dirname, 'index.html'),
}),
// 处理.vue文件的插件
new VueLoaderPlugin(),
// 处理css的插件
new MiniCssExtractPlugin()
],
// devserver配置
devServer: {
// 对打包文件继续进行压缩
compress: true,
// 指定开发服务器监听的端口
port: 8080,
// 模块热替换
hot: true,
// 自动打开默认浏览器
open: true,
// 配置代理
// 当我们访问 /api地址的时候, 自动将这个请求发送给 http://localhost:3000/api
proxy: {
'/api': 'http://localhost:5000',
},
setupMiddlewares: (middlewares, devServer) => {
if (!devServer) {
throw new Error('webpack-dev-server is not defined');
}
// 编写数据接口的示例代码
// devServer.app.get('/setup-middleware/some/path', (_, response) => {
// response.send('setup-middlewares option GET');
// });
// 轮播图列表
var data = Mock.mock({
'list|4': [
"@image(400x200,@color)"
]
});
//编写数据接口
devServer.app.get('/imgs', (req, res) => {
res.send(data.list);
});
return middlewares;
},
},
resolve: {
// 给src目录配置别名:@
alias: {
'@': path.resolve(__dirname, 'src'),
},
// 配置可以省略的文件后缀
extensions: ['.js', '.json', '.wasm', '.vue'],
},
// 压缩css的配置
optimization: {
minimizer: [
// 在 webpack@5 中,你可以使用 `...` 语法来扩展现有的 minimizer(即 `terser-webpack-plugin`),将下一行取消注释
// `...`,
new CssMinimizerPlugin(),
],
minimize: true,
},
};
注意:需要从新使用命令进行启动'npm run build'
32. 设置gizp压缩
路径:‘https://www.webpackjs.com/plugins/compression-webpack-plugin/#root’
命令:'npm install compression-webpack-plugin --save-dev
’
注意: 在webpack.config.js中写内容
代码:
代码:
plugins: [
// 将打包处理的js文件自动引入某个html中
new HtmlWebpackPlugin({
// 此处需要提供一个绝对路径
template: path.resolve(__dirname, 'index.html'),
}),
// 处理.vue文件的插件
new VueLoaderPlugin(),
// 处理css的插件
new MiniCssExtractPlugin(),
// 开启gzip压缩
new CompressionPlugin()
],
33. webpack处理本地资源图片
路径:‘https://www.webpackjs.com/guides/asset-management/#loading-images’
注意:需要赋值的内容
注意:如果有其他的后缀名可以进行新增
34. 设置icon图标
路径:‘https://www.webpackjs.com/guides/asset-management/#loading-fonts’
图片:
35. 解析es6和js的一些高级语法
路径:‘https://www.webpackjs.com/loaders/babel-loader/#root’ 命令:‘npm
install -D babel-loader @babel/core @babel/preset-env’
复制的内容:
36. webpack设置’tree shaking’
路径:‘https://webpack.docschina.org/guides/tree-shaking/’
作用:‘让webpack打包的时候, 将没有用到的代码剔除掉’
图片: