菜鸡打卡
1.你了解到前端有哪些项目构建工具?
webpack,vite,gulp,grunt,
2.webpack 和 gulp 在进行代码合并的时候还有什么不同?
webpack 是基于 commonjs 模块化规范进行代码合并, 而 gulp 只是简单的代码合并.
3.列举几个 gulp 中常用的插件?
- 合并文件: gulp-concat;
- 压缩 js: gulp-uglify;
- 文件重命名: gulp-rename;
- 压 缩 css: gulp-minify-css
- 压缩 html: gulp-hmltmin
- 启动开发服务器: gulp-connect
- 拷贝文件: gulp-copy
4.webpack 有哪些常见的配置?
webpack.config.js:
const path = require('path')
const HtmlWebapckPlugin = require('html-webpack-plugin');
const htmlPlugin = new HtmlWebapckPlugin({
template: path.join(dirname, 'src/index.html'),
filename: 'index.html'
});
module.exports = {
// 打包模式, 可值:development(开发模式),production(生产模式)
mode: 'development',
// 插件配置节点
plugins: [
// html-webpack-plugin 作用:根据模板,在内存中创建一个 html 页面
htmlPlugin
],
resolve: {
// 配置省略的文件后缀
extensions: ['.js', '.jsx', '.json'],
// 配置根路径
alias: { '@': path.join(dirname, './src') }
},
module: {
// 配置 loader
rules: [
{
test: /\.js|jsx$/,
use: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.scss$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: {
localIdentName: '[name]-[local]-[hash:5]'
}
}
},
'sass-loader'
]
},
{
test: /\.(png|jpg|gif|svg|eot|ttf|woff|woff2)$/,
loader: 'url-loader', // 需 要 依 赖 file-loader
options: {
limit: 10000
}
}
]
}
}
5.说说你对vite了解
- 快速的冷启动
- 即时的模块热更新
- 真正的按需编译
- Vite 天然支持引入
.ts文件 - ...
原理:利用 ES6 的 import 会发送请求去加载文件的特性,拦截这些请求,做一些预编译,省去 webpack 冗长的> > 打包时间
6.扩展- vite的工作机制
由图也可以看到,vite实际上也是一个server,在启动vite构建web server(就是上面的localhost:3000)后,访问这个地址,该页面会向web server发送请求,请求对应的文件,可以从network中看到,如下
在请求这些资源后,这些资源并非是直接返回的,可以看看其中的App.vue,实际上可以看到,这里有两个App.vue,两个HelloWorld.vue,实际上这就是因为在请求这些文件的时候,被vite server拦截了,经过编译后才返回对应的内容
可以看看network中App.vue的内容
可以看到和项目中的App.vue其实是完全不同的
但仔细看的话会发现,在network中的App.vue,有一句
而实际上,这个工作机制也正是vite快的原因,在这里,由于视图只会请求到他使用到的文件,而vite只会拦截被请求到的文件,所以那些没有被引用到的文件就不会被编译,这就做到了按需编译
这里可以尝试修改main.js中的import的内容,不引入css文件
import { createApp } from 'vue'
import App from './App.vue'
// import './index.css'
createApp(App).mount('#app')
此时页面自动刷新,可以看看network的内容,发现没有请求index.css文件
但这样子,可能会提出一个问题,每次请求都拦截编译一次,不会造成多次重复的编译工作吗,这里可以仔细地看看图中,会发现,除了main.js和client,以及一个用来改变协议的websocket握手外,状态码都变成了304
304是什么?缓存啊,这样就意味着,当修改了页面的内容的时候,它只会重新编译其中发生了改变的文件,而其他文件通过缓存的方式,直接使用缓存资源,不需要进行额外的编译,这也是直接利用了浏览器的缓存机制
除了利用浏览器缓存外,vite本身也有一个缓存的机制,它会针对依赖的包做一个缓存,这里可以看一下network中main.js的response
可以发现,对vue的引用,变成了对@modules下的vue.js的引用,那么这个vue.js,是在哪里呢
回到项目的目录,找到node_modules下的.vite_opt_cache文件夹可以找到vue.js文件
而实际上,network中的vue.js文件,就是这个文件,这个是一个对vue进行编译后生成的js文件,如何证明最终请求到的是这个文件呢,其实也简单,直接在这个文件中添加一些代码
这里在第9行添加了一个注释,回到network中查看,可以发现,并没有发生任何改变,但实际上,这是因为这个文件的修改不会造成热更新,所以需要ctrl+R刷新一下
可以看到,果然出现了,实际上.vite_opt_cache就是用来存放被缓存的依赖包的,而这里不止缓存vue的依赖包,其他的依赖包也可以,比如这里引入一个axios
npm i axios -S
在main.js中简单加入一个axios请求(这里只是随便写个请求让axios能被用到)
import { createApp } from 'vue'
import App from './App.vue'
import axios from "axios"
// import './index.css'
axios.get("https://www.baidu.com")
createApp(App).mount('#app')
刷新根目录,可以看到,.vite_opt_cache下多了一个axios.js
vite就是通过这两种缓存,又一次提升了速度
等等,刚刚说了啥,websocket连接,怎么会有websocket连接,这个hello world页面好像没有什么websocket相关的东西啊,实际上,这是vite实现HMR的手段
vite通过使用websocket连接,当修改一个文件保存时,将这个修改的文件编译推送到浏览器,实现一个热更新.
那么到这里,基本了解完vite的使用和其整体的工作机制了.