Vue3-Vite
条评论vue3都做了哪些改变
- 重构响应式系统,使用Proxy替换Object.defineProperty
- 新增Composition API,setup,更好的逻辑复用和代码组织
- 重构了虚拟 DOM,模板编译优化,slot优化,diff算法优化
- 代码结构调整,将一些全局代码抽出来,更便于Tree shaking,使得体积更小,如nextTick
- 使用Typescript
- 支持在
<style></style>
里使用 v-bind,给 CSS 绑定 JS 变量(color: v-bind(str))
Vue3.0 里为什么要用 Proxy 替代 defineProperty
- 可直接监听数组类型的数据变化,及对象新增属性
- 监听的目标为对象本身,不需要像Object.defineProperty一样遍历每个属性,有一定的性能提升
- 可拦截apply、ownKeys、has等13种方法,而Object.defineProperty不行
Vue3.0 编译做了哪些优化?
- 模板编译时的优化,将一些静态节点编译成常量,渲染时只用关心动态节点。
- template中不需要唯一根节点,可以直接放文本或者同级标签
- slot优化,将slot编译为lazy函数,将slot的渲染的决定权交给子组件。
- diff算法优化,使用 最长递增子序列 优化了对比流程
- Vue2当中在父组件渲染同时,子组件也会渲染。 Vue3就可以单独渲染父组件、子组件。
为什么要新增Composition API,它能解决什么问题
- 更好的按业务逻辑去组织代码
- 解决mixins复用导致的问题,方法属性容易覆盖,不能传参,调试麻烦。
Composition API 与 React.js 中 Hooks的异同点
react hooks
- 每次组件重新渲染hooks都会执行
- 不能在循环、条件、嵌套函数中调用Hook
- 必须确保总是在你的React函数的顶层调用Hook
- useEffect、useMemo等函数必须手动确定依赖关系
Composition API
- 声明在setup函数内,一次组件实例化只调用一次setup。
- 可以在循环、条件、嵌套函数中使用
- 响应式系统自动实现了依赖收集,进而组件的部分的性能优化由Vue内部自己完成,而React Hook需要手动传入依赖,而且必须保证依赖的顺序,让useEffect、useMemo等函数正确的捕获依赖变量,否则会由于依赖不正确使得组件性能下降。
vite 是啥
- vite是一个开发构建工具,开发过程中它利用浏览器支持原生ES模块的特性导入组织代码,生产中利用rollup作为打包工具。
- 光速启动,没有打包步骤,不需要生成 bundle,esbuild 预构建
- 热模块替换
- 按需编译,只在需要某个模块的时候动态(借助 import() )的引入它,不需要提前打包
ES module
浏览器中可以直接使用export import 的方式导入和导出模块。在 script 标签里设置type=”module”,然后使用模块内容。1
2
3<script type="module">
import { bar } from './bar.js‘
</script>
当 html 里嵌入上面的 script 标签时候,浏览器会发起 http 请求,请求 htttp server 托管的 bar.js,bar.js中导出bar变量1
2// bar.js
export const bar = 'bar';
vite 如何处理 ESM
在浏览器里使用 ES module 是使用 http 请求拿到模块,所以 vite 必须提供一个 web server 去代理这些模块,vite 使用 koa 负责这个事情,通过对请求路径的劫持获取资源的内容返回给浏览器
esbuild 预构建
- Vite 的开发服务器将所有代码视为原生 ES 模块。因此,Vite 必须先将作为 CommonJS 或 UMD 发布的依赖项转换为 ESM
- Vite 将有许多内部模块的 ESM 依赖关系转换为单个模块,以提高后续页面加载性能。如lodash