《中型 Vue 项目:挑战与成长》
一、引言
在当今的前端开发领域,Vue 作为一款渐进式 JavaScript 框架,以其强大的功能和灵活性备受开发者青睐。对于中型 Vue 项目而言,其重要性不言而喻。中型 Vue 项目通常在功能复杂度和规模上介于小型项目和大型项目之间,既需要应对一定的业务需求挑战,又要考虑开发效率和可维护性。
中型 Vue 项目面临着诸多挑战与机遇。挑战方面,随着项目规模的扩大,代码的复杂性增加,如何进行有效的状态管理、组件化开发以及优化性能成为关键问题。同时,团队协作也变得更加重要,需要确保不同开发人员的代码风格统一,避免出现冲突。机遇则在于,中型项目可以充分发挥 Vue 的优势,如响应式数据绑定、组件化开发和虚拟 DOM 等技术,提高开发效率和用户体验。
总之,中型 Vue 项目在前端开发中具有重要地位,其挑战与机遇并存,值得我们深入探讨和研究。
二、Vue.js 的底层原理与技术要点
1. Vue.js 的来龙去脉
- 诞生背景和动机。
Vue.js 是由尤雨溪开发的前端框架。最初的动机是为了简化开发人员在构建用户界面时的工作。尤雨溪之前在谷歌工作,参与了 AngularJS 项目,他意识到需要一种更加灵活和轻量的开发工具,能够在保持高效性能的同时,提供简洁的 API 和强大的数据绑定功能。于是,Vue.js 在 2014 年诞生了。
- 发展历程及各版本特点。
- Vue.js 1.0(2014 年):引入了响应式的数据绑定和组件化开发模式。
- Vue.js 2.0(2016 年):带来了虚拟 DOM 和更加优化的性能。
- Vue.js 3.0(2020 年):采用了基于 Proxy 的响应式系统,提升了性能和灵活性,同时引入了组合式 API(Composition API)。
- 核心理念介绍。
Vue.js 的核心理念包括渐进式框架、高性能、简洁的 API 和组件化。渐进式框架意味着 Vue.js 可以逐步引入,不需要一次性重构整个项目。高性能通过虚拟 DOM 和高效的差异化算法实现。简洁的 API 设计使开发者能够快速上手。组件化开发通过将 UI 拆分成独立的、可复用的组件,提升代码的复用性和可维护性。
2. Vue.js 的技术要点
- 响应式数据绑定的原理与实现。
Vue.js 的响应式系统是其核心特性之一。它通过数据劫持(data hijacking)和依赖追踪(dependency tracking)实现数据的双向绑定。数据劫持:Vue.js 使用 Object.defineProperty(Vue 3.0 中使用 Proxy)对数据对象的属性进行劫持,拦截属性的读取和写入操作。依赖追踪:当一个响应式属性被读取时,Vue.js 会记录下依赖该属性的组件或函数,当属性变化时,Vue.js 会通知这些依赖更新。
- 虚拟 DOM 的作用和 diff 算法。
- 虚拟 DOM 的作用:Vue.js 采用虚拟 DOM 来提升性能。当数据变化时,Vue.js 并不会立即操作真实 DOM,而是先在内存中创建一个虚拟 DOM 树,并通过 diff 算法比较新旧虚拟 DOM 树的差异,最后将变化部分更新到真实 DOM 上。
- diff 算法:Vue 的 diff 算法是用于比较虚拟 DOM 树的差异,并且有针对性的差异应用到真实 DOM 上的一种算法。它主要用于提高渲染性能,减少实际的 DOM 操作次数。优势包括减少实际 DOM 操作次数、最小化 DOM 操作的复杂度、提高渲染性能。比较过程会找出两个树之间的最小变化集,即哪些节点需要被添加、更新或删除。
- 组件化开发的优势和实现方式。
- 优势:通过将 UI 拆分成独立的、可复用的组件,提升代码的复用性和可维护性。
- 实现方式:Vue.js 支持单文件组件(.vue 文件),将模板、脚本和样式整合在一个文件中。组件通信通过 props 和 events 实现父子组件之间的通信,还可以使用插槽(Slots)在组件内部插入外部内容,提升组件的灵活性。
- 路由和状态管理的工具介绍。
- 路由:Vue Router 是 Vue.js 官方的路由管理库,用于实现单页面应用的路由功能。
- 状态管理:Vuex 是 Vue.js 的状态管理模式和库,用于管理应用的全局状态,提供集中式的状态管理方案。
三、中型 Vue 项目的技术难点
1. 响应式系统的性能优化
- 深度监听带来的性能问题及优化策略。
在 Vue 的响应式系统中,深度监听可能会导致性能问题。当对一个复杂的对象进行深度监听时,每次对象内部属性的变化都会触发响应式更新,这可能会带来较大的性能开销。优化策略可以考虑使用浅层响应式,例如shallowRef和shallowReactive。shallowRef不会对对象进行深度的响应式处理,只关心顶层的引用变化。shallowReactive也是类似,内部的属性发生变化时,本身不会触发重新渲染或响应式更新。这样可以在一些只有顶层引用需要响应式的场景中,减少不必要的响应式开销。
- 惰性计算的应用。
惰性计算可以在 Vue 的响应式系统中提高性能。例如,可以使用计算属性来实现惰性计算。计算属性只有在其依赖的数据发生变化时才会重新计算,避免了不必要的计算。同时,也可以使用自定义的ref对象,如通过customRef创建的具有复杂依赖跟踪和依赖更新逻辑的ref对象。比如实现一个有防抖功能的ref,在set方法中设置一个计时器,在延迟时间结束后更新值并触发依赖更新,从而减少频繁的计算。
2. 虚拟 DOM 的 diff 算法
- 同层比较的优势。
Vue 的 diff 算法只比较同层级的节点,这有很多优势。首先,减少了比较的范围,提高了比较的效率。其次,同层比较可以更好地处理节点的移动和插入操作,因为只需要在同一层级内进行比较,不需要考虑跨层级的情况。最后,同层比较可以更好地利用节点的key属性,通过key来判断哪些节点是新增的、删除的或移动的,从而减少不必要的操作。
- Key 的作用分析。
在 Vue 的虚拟 DOM 的 diff 算法中,key属性起着重要的作用。如果新旧虚拟 DOM 树的同级节点没有相同的首位节点,但使用了唯一的key属性,Vue 会通过key来判断哪些节点是新增的、删除的或移动的,从而减少不必要的操作。key可以帮助 Vue 更准确地识别节点,提高 diff 算法的效率。同时,key也可以避免不必要的重新渲染,因为 Vue 可以根据key来判断节点是否需要更新。
- Patch 操作的优化。
在 Vue 的 diff 算法中,当找到了两个节点的差异时,会进行Patch操作将这些差异应用到真实 DOM 上。优化Patch操作可以提高渲染性能。可以通过减少实际 DOM 操作次数、最小化 DOM 操作的复杂度来实现。例如,在对比同一层级的节点时,Vue 会应用一些优化策略来尽量减少比较的次数和操作的复杂度。如果新旧虚拟 DOM 树的同级节点的首位节点相同,Vue 会认为这两个节点是相同的,不会继续比较它们的子节点,而是直接比较下一个同级节点。
3. 组件的生命周期管理
- 生命周期钩子的顺序重要性。
Vue.js 中的每个组件都有自己的生命周期,从创建到挂载,更新和销毁。生命周期钩子的顺序非常重要,因为它决定了我们可以在哪个钩子函数中进行数据获取、操作 DOM 等操作。例如,如果我们想在组件挂载后操作 DOM,那么我们应该在mounted钩子函数中进行。当一个父组件包含一个子组件时,他们的生命周期钩子函数的执行顺序如下:beforeCreate:父组件首先执行beforeCreate钩子函数。created:父组件接着执行created钩子函数。beforeMount:父组件接着执行beforeMount钩子函数。然后开始处理子组件。beforeCreate:子组件执行beforeCreate钩子函数。created:子组件接着执行created钩子函数。beforeMount:子组件接着执行beforeMount钩子函数。mounted:子组件首先执行mounted钩子函数,然后父组件执行mounted钩子函数。这是因为父组件等待其所有子组件都挂载完成后,才会执行自己的mounted钩子函数。当组件更新时,执行顺序如下:beforeUpdate:父组件首先执行beforeUpdate,然后子组件执行beforeUpdate。updated:子组件首先执行updated,然后父组件执行updated。当组件销毁时,执行顺序如下:beforeDestroy:父组件首先执行beforeDestroy,然后子组件执行beforeDestroy。destroyed:子组件首先执行destroyed,然后父组件执行destroyed。
- 清理工作的必要性。
在组件的生命周期中,清理工作是非常必要的。例如,在beforeDestroy和destroyed钩子函数中,可以进行一些清理操作,如移除事件监听器或取消定时器。这样可以避免内存泄漏和不必要的资源占用。同时,在一些特殊的组件中,如使用了第三方库的组件,清理工作尤为重要。在组件销毁时,需要确保第三方库的资源也被正确地释放。
4. 组件通信和状态管理
- 父子、兄弟组件通信方式。
(1)父子组件通信方式:
-
- prop:父组件向子组件传递数据,可以通过Prop向子组件传递数据。这是单向数据流,数据只能从父组件流向子组件。
-
- $emit:子组件向父组件传递数据,可以通过$emit触发事件,将数据传递给父组件。
-
- .sync修饰符:在 vue@2.3.0 + 以上版本,.sync修饰符作为一个编译时的语法糖存在,它会被扩展为一个自动更新父组件属性的v-on监听器,实现了一种类似双向绑定的效果。
-
- 属性attrs和$listeners:父组件向子组件传递非Prop声明的属性时,可以通过$attrs和$listeners在子组件中获取这些属性和事件监听器。
-
- provide / inject:父组件通过provide提供数据,子组件通过inject接收数据。
-
- $parent和$children:子组件可以通过$parent访问父实例,父组件可以通过$children访问子组件实例,但这种方式不推荐在复杂项目中使用,因为可能会直接修改父组件中的数据,违反单向数据流原则。
-
- ref:在父组件中可以通过ref获取子组件实例,从而进行数据交互。
(2)兄弟组件通信方式:
- 全局事件总线$bus:声明一个全局Vue实例变量EventBus,把所有的通信数据,事件监听都存储到这个变量上,实现兄弟组件间的数据共享。但这种方式只适用于极小的项目,复杂项目推荐使用Vuex。
- Vuex:官方推荐的状态管理模式,用于管理应用的全局状态,实现兄弟组件间的数据共享。
- 全局状态管理的挑战。
全局状态管理在中型 Vue 项目中面临一些挑战。首先,状态的管理和维护变得更加复杂,需要确保状态的一致性和正确性。其次,在多人协作开发中,需要避免状态的冲突和混乱。同时,全局状态管理也可能会导致性能问题,因为状态的变化可能会引起大量的组件更新。为了解决这些挑战,可以采用一些策略,如合理划分状态模块、使用命名空间、优化状态更新的方式等。
5. 性能优化
- 懒加载的实现。
主要实现是通过IntersectionObserver实例,用于监听页面元素是否进入可视化窗口。当页面存在多个组件时,不使用懒加载,将会同时渲染,同时调用接口,会造成页面的卡顿,非常影响体验。而使用了懒加载后,只有当进入页面可视区域的组件才会初始化渲染,提高页面加载速度。例如:
<template>
<div style="height: calc(100vh - 60px); padding: 0; margin: 0">
<a-row :gutter="10" style="height: 100%; overflow: auto;">
<a-col :span="12" v-for="(item, index) in 50" :key="index" style="height: 500px">
<lazy-loader style="height:100px;width:100px">
<test style="height:100px;width:100px" />
</lazy-loader>
</a-col>
</a-row>
</div>
</template>
<script lang="ts" setup>
import Test from 'xxx/test.vue';
import LazyLoader from 'xxx/lazyLoader.vue';
</script>
<style scoped lang="less"></style>
在LazyLoader组件中,使用setTimeout是为了在组件初始化之前显示一个加载状态框,防止显示空白很突兀。同时懒加载组件需要设置宽度和高度和监听的组件高度宽度一致才能让加载框位于中心位置。
- 组件缓存的作用。
组件缓存可以提高性能,特别是在一些频繁切换的页面中。例如,使用keep-alive标签可以缓存组件,当组件再次被访问时,可以直接从缓存中获取,而不需要重新创建和渲染,从而提高页面的响应速度。在keep-alive缓存的组件中,有两个特殊的生命周期钩子函数:activated(组件激活时调用)和deactivated(组件停用时调用)。可以在activated里面进行一些初始化操作,在deactivated里面进行一些善后操作。
- 优化渲染的技巧。
(1)划分业务模块,通过路由异步加载模块,加速首屏以及其他页面加载速度。在Vue Router中将模块配置为懒加载模式,这样访问特定路由的时候才会加载对应的模块,而不是一次性加载所有模块,提高页面加载速度。
(2)开启组件懒加载,当需要特定组件的时候再加载。可以使用异步组件的方式,类似于路由懒加载,直接配置import组件即可,替换原有的静态import。这样可以在加载组件时给用户一个提示,提高用户体验。
(3)开启服务器gzip压缩,加速资源请求速度。目前大部分浏览器都支持gzip,可以开启服务器的gzip功能,服务器在传输资源之前先进行压缩。Vue-cli可以在打包时就将资源提前进行gzip打包,这样服务器直接返回打包后的资源不需要再次打包了。通过使用compression-webpack-plugin插件可以在打包时直接生成gz压缩文件。
四、中型 Vue 项目开发经验
1. 项目结构规划
在中型 Vue 项目中,合理的项目结构规划至关重要,它不仅影响开发效率,还关系到项目的可维护性和扩展性。
- 各层级目录的作用和划分原则:
-
- 一般来说,项目目录结构应遵循一些基本原则。首先,要保证文件夹和文件夹内部文件的语义一致性。例如,以路由模块划分的文件夹,如pages文件夹,应只包含路由模块,不应该有其他非路由模块的文件夹。这样可以一眼看出项目的路由有哪些。
-
- 遵循单一入口 / 出口原则。以模块文件夹为例,外部引入模块时,应从唯一的入口文件引入,如seller文件夹,应从seller/index.js作为唯一入口,这样可以实现模块内部的独立性,便于后续重构。
-
- 遵循就近原则,紧耦合的文件应该放到一起,且应以相对路径引用。例如,在模块内部使用相对路径引用样式文件import styles from './index.module.scss',这样如果模块的路径发生变化,只需移动文件夹,内部无需修改引用路径。
-
- 公共的文件应该以绝对路径的方式从根目录引用。例如公共组件,放在src/components下,在使用到的页面中,采用绝对路径的形式引用import Input from 'src/components/input'。这样在调整文件夹结构时,只需全局搜索替换,同时绝对路径有全局的语义,相对路径有独立模块的语义。
-
- src外的文件不应该被引入,前端项目通常将所有代码文件放在src文件夹内,src外放项目配置、依赖、环境等文件,方便划分项目代码文件和配置文件。
2. 性能优化策略
中型 Vue 项目的性能优化是提高用户体验和项目质量的关键。
- 网络请求相关优化:
-
- 可以对 axios 进行二次封装,以更好地管理网络请求。在请求拦截器中,可以设置请求头、添加 token 等操作。在响应拦截器中,根据响应状态码进行不同的处理,如处理错误码、清除 token 并跳转到登录页等。同时,可以在全局请求和响应拦截器中添加请求状态,如使用element-ui的加载组件显示请求状态。
- 构建相关优化:
-
- 使用代码分割功能,将代码按需加载,减少初始加载时间。例如,在Vue Router中将模块配置为懒加载模式,访问特定路由时才加载对应的模块,而不是一次性加载所有模块。同时,可以使用异步组件的方式进行组件懒加载,直接配置import组件即可,替换原有的静态import,在加载组件时给用户一个提示,提高用户体验。
-
- 开启服务器gzip压缩,加速资源请求速度。可以使用compression-webpack-plugin插件在打包时直接生成gz压缩文件,服务器直接返回打包后的资源,无需再次打包。
- 静态资源优化:
-
- 优化图片和资源,使用压缩和优化的图片资源,减少加载时间。同时,可以使用懒加载(如IntersectionObserver)来延迟加载非关键资源。
- 编码相关优化:
-
- 避免在模板中使用复杂的表达式,避免在模板中使用复杂的 JavaScript 表达式,这会增加编译器的负担。
-
- 利用计算属性(computed)来缓存复杂计算的结果,避免重复计算。使用侦听器(watch)来响应数据的变化,而不是在每个组件中手动处理。
-
- 使用keep-alive缓存组件,对于那些不需要重新创建的组件,可以使用keep-alive来缓存它们,减少初始化和销毁的开销。在keep-alive缓存的组件中,有两个特殊的生命周期钩子函数:activated(组件激活时调用)和deactivated(组件停用时调用)。可以在activated里面进行一些初始化操作,在deactivated里面进行一些善后操作。
3. 框架使用注意事项
在中型 Vue 项目中,正确使用框架的特性可以避免一些常见的问题。
- 动态路由参数变化处理:
-
- 当遇到动态路由参数变化时,页面数据可能不更新。解决方式是给<router-view>增加一个不同的key值,这样 Vue 就会识别这是不同的路由,从而更新页面组件。例如:<router-view :key="key"></router-view>...computed:{key(){return this.$route.path + Math.random();}}。
- 定时器销毁问题:
-
- 在组件中使用定时器时,如果不及时销毁,可能会导致内存泄漏。推荐的解决方式是通过$once这个事件侦听器在定义完定时器之后的位置来清除定时器。例如:const timer = setInterval(() => {// 定时器操作},1000)// 通过$once来监听定时器,在beforeDestroy钩子可以被清除。this.$once('hook:beforeDestroy', () => {clearInterval(timer);})。
- 按需加载组件方式:
-
- 有两种按需加载组件的方式。一种是使用resolve => require(['./ComponentA'], resolve),另一种是使用() => import('./ComponentA')。
- 组件通信方案:
-
- 组件之间的通信方案有多种。通过事件总线(bus),即通过发布订阅的方式进行通信;在父子组件中,父组件通过prop向子组件传递数据,子组件绑定自定义事件,通过this.$emit(event,params)来调用自定义事件;使用vue提供的$parent/$children & $refs方法来通信;通过provide/inject进行深层次组件间的通信;还可以使用$attrs, $listeners实现组件通信。
- 常用指令和修饰符的使用:
-
- 在组件上总是用key配合v-for,便于优化渲染,将可能的 DOM 变更降到最低。避免v-for和v-if在一个标签上同时使用。
- 工具函数总结:
-
- 可以总结一些常用的工具函数,如日期格式化函数dateFormater、获取 URL 参数函数GetUrlParam、全屏函数toFullScreen和退出全屏函数exitFullscreen等。
- axios 二次封装:
-
- 对 axios 进行二次封装可以更好地管理网络请求。在请求拦截器中,可以设置请求头、添加 token 等操作。在响应拦截器中,根据响应状态码进行不同的处理,如处理错误码、清除 token 并跳转到登录页等。同时,可以在全局请求和响应拦截器中添加请求状态,如使用element-ui的加载组件显示请求状态。
4. Vue 项目配置经验
- 配置开发、生产和测试环境:
-
- 在 Vue 项目中,可以通过配置不同的环境变量来区分开发、生产和测试环境。例如,可以在package.json中设置不同的脚本命令,分别对应不同的环境。在配置文件中,可以根据环境变量设置不同的 API 地址、请求超时时间等。
- 代理切换配置:
-
- 在开发环境中,可以通过配置代理来解决跨域问题。可以在vue.config.js文件中进行代理配置,根据不同的环境设置不同的代理规则。例如,可以设置开发环境的代理规则,将特定的请求转发到开发服务器上,从而实现跨域访问。
五、中型 Vue 项目实战总结
1. 项目框架确认
1. 公共头部和底部的封装。
在中型 Vue 项目中,公共头部和底部的封装可以提高代码的复用性和可维护性。以下是一些实现公共头部和底部封装的方法:
- 使用 Vue Router 的路由配置,可以在多个页面中引入公共头部和底部组件。例如,可以在路由配置文件中,为每个页面指定一个components属性,其中包含公共头部和底部组件。这样,在每个页面的渲染过程中,都会自动引入公共头部和底部组件。参考文章:"vue-router 配置公共头部、尾部_vue 公共头部组件 - CSDN 博客"。
- 在 App.vue 文件中,可以使用<KeepAlive>组件来缓存公共头部和底部组件,以提高性能。当页面切换时,公共头部和底部组件不会被重新创建,而是从缓存中获取,从而减少了渲染时间。参考文章:"vue-router 配置公共头部、尾部_vue 公共头部组件 - CSDN 博客"。
- 对于部分页面不需要显示公共头部或底部的情况,可以通过事件广播的方式来控制显示或隐藏。在 App.vue 文件中,可以定义一个header_show和footer_show变量来控制公共头部和底部的显示状态。在需要隐藏公共头部或底部的页面中,可以通过this.$emit('header', false)或this.$emit('footer', false)来通知 App.vue 文件隐藏相应的部分。参考文章:"vue 实现部分页面导入底部 vue 配置公用头部、底部,可控制显示隐藏"。
2. 导航切换的实现。
导航切换是中型 Vue 项目中常见的功能之一。以下是一些实现导航切换的方法:
- 使用 Vue Router 的<router-link>组件或编程式导航来实现页面之间的导航切换。<router-link>组件可以通过to属性指定目标路由,点击时会自动触发导航。编程式导航可以使用this.$router.push()或this.$router.replace()方法来实现导航切换。参考文章:"Vue 项目实现导航 切换以及相关文件配置 - CSDN 博客"。
- 通过定义导航栏组件,包含多个导航链接,并在链接上绑定点击事件,调用相应的导航方法来实现导航切换。在导航栏组件的点击事件处理方法中,可以使用this.$router.push()或this.$router.replace()方法来实现导航切换。参考文章:"vue 实现导航栏切换功能 - CSDN 文库"。
- 使用vue-router-links创建导航栏项目,通过定义不同的路由,并使用<router-link>组件来创建导航链接,实现页面间的导航切换。参考文章:"如何使用 vue-router-links 创建导航栏项目以切换导航栏?- 腾讯云"。
2. 样式引入与处理
1. 清除样式和公共样式的引入。
在 Vue 项目中,引入清除样式和公共样式可以提高页面的一致性和可维护性。以下是一些引入清除样式和公共样式的方法:
- 在入口文件main.js中引入公共样式文件,如import '../static/css/base.css'。这样可以在整个项目中全局引入公共样式。参考文章:"vue 引入公共样式的三种方法_vue 公共样式 - CSDN 博客"。
- 在index.html文件中引入公共样式文件,如<link rel=\"stylesheet\" type=\"text/css\" href=\"static/css/base.css\"/>。这样可以在页面加载时直接引入公共样式。参考文章:"vue 引入公共样式的三种方法_vue 公共样式 - CSDN 博客"。
- 在app.vue文件中引入公共样式文件,如<style>@import './../static/css/bse.css'; /*引入公共样式*/</style>。但是这种方法可能会在index.html的HEAD上多出一个空的标签。参考文章:"vue 引入公共样式的三种方法_vue 公共样式 - CSDN 博客"。
2. 图标字体的使用。
图标字体在 Vue 项目中可以提高页面的加载速度和可维护性。以下是一些使用图标字体的方法:
- 登录阿里巴巴图标库官网,创建一个自己的项目,并将对应的 svg 图片添加或上传到对应的项目中。然后点击下载至本地,将文件夹下载下来。在项目中src/assets目录下创建一个文件夹iconfont,将下载下来的文件粘贴到iconfont文件夹去。在main.js中引入字体图标样式:import'./assets/iconfont/iconfont.css'。最后,在页面中使用字体图标,如<i class=\"iconfont icon-arrow-left\"></i>。参考文章:"vue 项目中如何使用字体图标,简单清晰明了!-CSDN 博客"。
- 先在 iconfont-阿里巴巴矢量图标库 阿里巴巴矢量图标库下载 svg 图标后,在 Convert SVG Icons to Export as Icon Font, SVG, PNG, PDF, Sprite, etc. ❍ IcoMoon App 中新建集合,在新建集合中导入图标,点击Generate Font生成字体图标并下载解压后,将style.css重命名为icon.css。在vue项目中的assets文件夹中新建styles文件夹,将下载的icon.css和fonts放入styles文件夹中。在main.js中导入字体图标。import './assets/styles/icon.css'。最后,在页面中使用字体图标。参考文章:"在 vue 项目中如何使用字体图标 - 倦梦还 - 博客园"。
3. 伪类元素和清除浮动的应用。
伪类元素和清除浮动可以在 Vue 项目中实现一些特定的样式效果。以下是一些应用伪类元素和清除浮动的方法:
- 使用伪类元素before/after可以处理一些线条的效果。例如,可以使用#outer:after{content:\".\";height:0;visibility:hidden;display:block;clear:both;}来清除浮动。这种方法兼容性一般,但经过一些技巧可以应付不同浏览器。参考文章:"vue 项目实战总结笔记_对于 vue 项目的总结 - CSDN 博客"。
- 使用双伪元素清除浮动,如.clearfix:bofore,.clearfix:after {content:\"\";display: table;}.clearfix:after {clear: both;}.clearfix {*zoom:1;}。这种方法可以提高兼容性,同时保证html比较干净。参考文章:"vue 项目 css 公共样式和全局引入 - CSDN 博客"。
4. v-for 循环处理重复样式。
在 Vue 项目中,使用v-for循环可以处理重复的样式,简化代码。以下是一些使用v-for循环处理重复样式的方法:
- 在页面中,如果有一些重复样式的展示,可以使用v-for循环来简化代码。例如,如果有多个相同的组件需要展示,可以使用v-for循环来遍历数据,并渲染相应的组件。这样可以减少代码的重复,提高代码的可维护性。参考文章:"vue 项目实战总结笔记_对于 vue 项目的总结 - CSDN 博客"。
3. 双向数据绑定的灵活运用
1. 数据更新和上传的注意事项。
在 Vue 项目中,双向数据绑定是一个非常强大的功能,但在数据更新和上传时需要注意一些事项,以避免出现问题。以下是一些数据更新和上传的注意事项:
- 使用svn进行代码的更新上传时,注意先提交之后再进行文件的更新,不然很容易丢失更改的内容,产生冲突。参考文章:"vue 项目实战总结笔记_对于 vue 项目的总结 - CSDN 博客"。
- 在更新数组类型的数据时,如果直接通过索引修改数组元素,可能会导致页面未跟随改变。可以使用数组的变异方法(如push、splice等)或vm.$set方法来实现数据与页面的双向更新。参考文章:"vue 中数据与页面间双向绑定需要注意的点 - CSDN 博客"。
- 在更新对象类型的数据时,如果直接通过添加属性的方式修改对象,可能会导致页面未跟随改变。可以使用更改引用或vm.$set方法来实现数据与页面的双向更新。参考文章:"vue 中数据与页面间双向绑定需要注意的点 - CSDN 博客"。
六、中型 Vue 项目如何实现成长
1. 模块导入与外部资源利用
- 结合 externals 配置模块导入。
在 Vue 项目中,可以使用 externals 配置来引入外部模块,以减少打包时间。例如,在引入 echarts 文件时,可以在 index.html 文件中引入 cdn 上的 echarts 文件,然后在项目的 webpack.base.conf.js 或 vue.config.js 文件中配置 externals,将 echarts 作为外部模块引入。这样,在项目中使用 echarts 时,就可以直接使用 import echarts from 'echarts' 来引入,而不需要将 echarts 打包到项目中。
- 模拟数据的方法。
在 Vue 项目中,可以使用模拟数据的方法来模拟后端接口返回的数据,以便在开发过程中进行调试。有两种方法可以模拟数据:
- 将需要模拟的数据放入 mock 文件夹中,在 build 文件夹中的 webpack.dev.conf.js 文件中配置 Json,通过路由请求数据。引入成功后,加载数据,重新启动项目,就可以在项目中展示 Json 数据。
- 使用 webpack-dev-server 去模拟服务器,在根目录中的 vue.config.js 中书写代码,搭建一个小型的服务器,通过 axios 调用接口获取模拟数据。
2. 引入新组件和布局容器
- Element-plus 的引入和使用。
Element Plus 是一个流行的 Vue 组件库,可以为项目提供丰富的 UI 组件。引入 Element Plus 有以下几种方式:
- 全局导入:在 main.js 或 main.ts 中一次性导入 Element Plus 的所有组件及其样式,适合小型项目或需要使用大多数组件的情况。
- 按需导入:使用 unplugin-vue-components 和 unplugin-auto-import 插件,只导入实际项目中需要用到的组件和样式,可以显著减少打包文件体积,提升应用加载速度。
- 手动导入:如果不想使用插件,可以手动按需导入 Element Plus 的组件和样式,相对繁琐但不需要额外配置。
- 布局容器组件的应用。
- Container 布局容器:用于布局的容器组件,方便快速搭建页面的基本结构。包括 el-container、el-header、el-aside、el-main 和 el-footer 等组件,采用了 flex 布局,使用前需确定目标浏览器是否兼容。
- Layout 布局:通过基础的 24 分栏,迅速简便地创建布局。可以根据实际布局需要的栏数来设置,例如需要 4 栏,每栏占 6 栏即可实现 4 栏布局样式。
3. 高级进阶指南
- 深入学习 Vue 的路线规划。
对于初中级 Vue 工程师,可以按照以下路线进行深入学习:
- 入门:从官方文档入手,通过 CDN 方式引入 Vue 写 demo,熟悉基本语法。然后跟着培训机构在 B 站发的免费课程或付费课程进一步巩固基础,在实战案例中加深对知识点的理解。
- Vue2 -> Vue3:对于熟悉 Vue2 但不了解 Vue3 的同学,可以通过几篇文章了解两个大版本之间的差异,有助于进一步学习。
- 进阶:整体学习 Vue2 和 Vue3 的相关课程和小册,熟练运用 Vue 的高级 API,如 slot-scope、Vue.extend、JSX、nextTick、高阶组件和 Vuex 等。
- 熟练运用高级 API 和技巧。
- slot-scope:可以做一些数据和 UI 分离的封装,如以 vue-promised 库为例,通过传入的 slot-scope,在合适的时机把数据回抛给你,并展示传入的视图。
- Vue.extend:配合项目做一些命令式 API 的封装,知道它为什么可以这样用。
- JSX:使用 JSX 编写项目中的复杂组件,灵活性更强。官方插件提供了预览 Jsx 编译结果的网站 Vue 3 JSX Explorer。
- nextTick:深入了解 Vue 中 nextTick 的原理,知道为什么要用微任务队列优于宏任务队列,结合 eventloop 知识深度思考,并融入到异步合并优化的知识体系中。
- 高阶组件:理解 Vue 中的高阶组件,对于 Vuex 的使用必须非常熟练,知道什么时候该用 Vuex,根据需求编写 Vuex 的 plugin,合理使用 Vuex 的 subscribe 功能完成一些全局维度的封装。
七、中型 Vue 项目的挑战与展望
1. 中型 Vue 项目的挑战总结
- 技术难点和开发经验中的挑战归纳。
在中型 Vue 项目中,面临着诸多挑战。首先,响应式系统的性能优化是一个关键问题。深度监听可能导致性能开销,需要合理使用浅层响应式和惰性计算来优化。其次,虚拟 DOM 的 diff 算法在处理复杂结构时也存在挑战,同层比较虽然有优势,但需要注意 Key 的作用和 Patch 操作的优化。组件的生命周期管理也较为复杂,生命周期钩子的顺序和清理工作都需要谨慎处理。组件通信和状态管理方面,父子、兄弟组件通信方式多样,但全局状态管理面临状态一致性、多人协作冲突和性能问题等挑战。性能优化方面,懒加载、组件缓存和优化渲染等技巧需要综合运用。
2. 未来发展展望
- 对中型 Vue 项目未来发展的期待和趋势分析。
中型 Vue 项目未来发展充满期待。在技术方面,随着 Vue 的不断演进,新的特性和优化将持续涌现。例如,Vapor Mode 的发展可能为性能提升带来新的突破,去除虚拟 DOM 有望极大地提高应用性能。在生态系统方面,插件和工具将更加丰富多样,组件库的发展也将为开发者提供更多选择。同时,全栈开发中 Vue 的角色将更加重要,与后端技术的结合将更加紧密。社区的支持也将持续增强,频繁的版本更新将为项目带来更多的稳定性和新功能。未来,微前端架构的兴起将为 Vue 提供新的应用场景,强化 TypeScript 支持也将使开发更加安全高效。总之,中型 Vue 项目将在技术创新和生态完善的推动下,不断发展壮大。
相关文章:

《中型 Vue 项目:挑战与成长》
一、引言 在当今的前端开发领域,Vue 作为一款渐进式 JavaScript 框架,以其强大的功能和灵活性备受开发者青睐。对于中型 Vue 项目而言,其重要性不言而喻。中型 Vue 项目通常在功能复杂度和规模上介于小型项目和大型项目之间,既需要…...

配置 DNS over HTTPS阻止DNS污染
概念介绍 DOH简介 DNS(域名系统)的主要功能是将域名解析成IP地址,域名的解析工作由DNS服务器完成。从安全角度来看,域名解析的请求传输时通常不进行任何加密,这导致第三方能够很容易拦截用户的DNS,将用…...

Facebook广告文案流量秘诀
Facebook 广告文案是制作有效 Facebook 广告的关键方面。它侧重于伴随广告视觉元素的文本内容。今天我们的博客将深入探讨成功的 Facebook 广告文案的秘密! 一、广告文案怎么写? 正文:这是帖子的正文,出现在您姓名的正下方。它可…...

22. 五子棋小游戏
文章目录 概要整体架构流程技术名词解释技术细节小结 1. 概要 🔊 JackQiao 对 米粒 说:“今天咱们玩个五子棋小游戏,电脑与你轮流在一个 nn 的网格上放置棋子(X 或 O),网格由你输入的正整数n决定࿰…...

fastadmin框架同时使用 阿里云oss和阿里云点播
背景 项目的实际需求中既要用到阿里云oss产品又用到阿里云点播系统,实现完美的统一。设置两个地址downUrl,thirdCode。分别代表阿里云oss上传路径和阿里云点播系统vId。 实现 默认框架你已经集成好阿里云oss集成工作,前端html页面实现 <…...

Java-JMX 组件架构即详解
JMX架构由三个主要组件构成: MBeans(Managed Beans):代表可管理的资源,是JMX的核心。MBean可以是Java类或接口,提供了管理操作的接口,如获取系统信息、设置参数等。MBeanServer&#x…...

unity打包web,发送post请求,获取地址栏参数,解决TypeError:s.replaceAll is not a function
发送post请求 public string url "http://XXXXXXXXX";// 请求数据public string postData "{\"user_id\": 1}";// Start is called before the first frame updatevoid Start(){// Post();StartCoroutine(PostRequestCoroutine(url, postData…...

java+ssm+mysql校园物品租赁网
项目介绍: 使用javassmmysql开发的校园物品租赁网,系统包含管理员、用户角色,功能如下: 管理员:用户管理;物品管理(物品种类、物品信息、评论信息);订单管理࿱…...

Spring Boot中实现JPA多数据源配置指南
本文还有配套的精品资源,点击获取 简介:本文详细介绍了在Spring Boot项目中配置和使用JPA进行多数据源管理的步骤。从引入依赖开始,到配置数据源、创建DataSource bean、定义实体和Repository,最后到配置事务管理器和使用多数据…...

服务器加固
1.服务器密码复杂度 密码最小长度,密码复杂度策略 vim /etc/pam.d/system-auth --------------- #密码配置 #ucredit:大写字母个数;lcredit:小写字母个数;dcredit:数字个数;ocredit:…...

探索CSS中的背景图片属性,让你的网页更加美观
导语:在网页设计中,背景图片的运用能够丰富页面视觉效果,提升用户体验。本文将详细介绍CSS中背景图片的相关属性,帮助大家更好地掌握这一技能。 一、背景图片基本属性 1、background-image 该属性用于设置元素的背景图片。语法如…...

Oracle的打开游标(OPEN_CURSORS)
一、OPEN_CURSORS 概述 OPEN_CURSORS 指定会话一次可以拥有的打开游标(私有 SQL 区域的句柄)的最大数量。可以使用此参数来防止会话打开过多的游标。 OPEN_CURSORS参数说明 特性 描述 参数类型 Integer 默认值 50 修改方式 ALTER SYSTEM PDB级别…...

数值分析—数值积分
研究背景 积分的数学解法为牛顿莱布尼兹公式,数学表示为 ∫ a b f ( x ) d x F ( b ) − F ( a ) \int_{a}^{b} f(x)dxF(b)-F(a) ∫abf(x)dxF(b)−F(a),但应用该方法有如下困难: 1, f ( x ) f(x) f(x)的原函数有时不能用初等函…...

克服大规模语言模型限制,构建新的应用方法——LangChain
大模型 大模型的出现和落地开启了人工智能(AI)新一轮的信息技术革命,改变了人们的生 活方式、工作方式和思维方式。大模型的落地需要数据、算力和算法三大要素。经过几 年发展,大模型的数据集(包括多模态数据集)制作已经形成了规约,Meta、Go…...

计算机网络 —— HTTPS 协议
前一篇文章:计算机网络 —— HTTP 协议(详解)-CSDN博客 目录 前言 一、HTTPS 协议简介 二、HTTPS 工作过程 1.对称加密 2.非对称加密 3.中间人攻击 4.引入证书 三、HTTPS 常见问题 1.中间人能否篡改证书? 2.中间人能否调…...

React第十七章(useRef)
useRef 当你在React中需要处理DOM元素或需要在组件渲染之间保持持久性数据时,便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 访问ref的值 类似于vue的ref,Vue的ref是.value,其次就是vu…...

React第十五节useReducer使用详解差异
useReducer() 的用法注意事项 1、 概述: useReducer() 常用于管理复杂的状态更新逻辑,特别是在状态更新依赖于多个条件或动作时,useReducer 提供了一种更加结构化和可维护的方式来处理状态。可以将更新函数写在组件外面 它与 useState() 相…...

NanoLog起步笔记-5-客户端简要描述
nonolog起步笔记-5-客户端简要描述 客户端的简要的设计图路notify模式服务端最好分两个核 NanoLog::setLogLevel(NOTICE);从 NANO_LOG 开始NANO_LOGcompiling time的语句getNumNibblesNeeded:得到prompt中,number的数量countFmtParams:得到所…...

Flink:入门介绍
目录 一、Flink简介 2.1 Flink 架构 2.2 Flink 应用程序 运行模式 二、Flink 集群 部署 2.1 本地集群模式 2.1.1 安装JDK编辑 2.1.2 下载、解压 Flink 2.1.3 启动集群 2.1.4 停止集群 2.2 Standalone 模式 2.2.0 集群规划 2.2.1 安装JDK 2.2.2 设置免密登录 2…...

目标跟踪领域经典论文解析
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...

网络编程 | TCP套接字通信及编程实现经验教程
1、TCP基础铺垫 TCP/IP协议簇中包含了如TCP、UDP、IP、ICMP、ARP、HTTP等通信协议。TCP协议是TCP/IP协议簇中最为常见且重要的通信方式之一,它为互联网上的数据传输提供了可靠性和连接管理。 TCP(Transmission Control Protocol,传输控制协议…...

SAP导出表结构并保存到Excel 源码程序
SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果...

Linux下redis环境的搭建
1.redis的下载 redis官网下载redis的linux压缩包,官网地址:Redis下载 网盘链接: 通过网盘分享的文件:redis-5.0.4.tar.gz 链接: https://pan.baidu.com/s/1cz3ifYrDcHWZXmT1fNzBrQ?pwdehgj 提取码: ehgj 2.redis安装与配置 将包上传到 /…...

REDMI瞄准游戏赛道,推出小屏平板
近日,REDMI推出了一款8.8英寸的小屏平板,引发市场关注。该平板采用LCD屏幕,搭载天玑9400处理器,定位游戏市场,意在开拓小屏平板的新领域。 小屏平板新尝试 这款REDMI平板未追随大屏潮流,而是选择了8…...

springai结合ollama
目录 ollama 介绍 使用 下载: 安装: 点击这个玩意next就行了。 运行 spring ai使用ollama调用本地部署的大模型 加依赖 配置yml 写代码 ollama 介绍 官网:Ollama Ollama是一个用于部署和运行各种开源大模型的工具; …...

React第十三节开发中常见问题之(视图更新、事件处理)
一、视图更新有哪些方案? useState用法介绍 1、对于数据变量 正常的增删改查,只会让数据更新,但是不会触发 React 视图的更新; 如: <script lang"jsx">const baseTable [{name:Andy, age: 18, id…...

【Appium报错】安装uiautomator2失败
目录 1、通过nmp安装uiautomator2:失败 2、通过 Appium 的平台直接安装驱动程序 3、通过pip 来安装 uiautomator2 1、通过nmp安装uiautomator2:失败 我先是通过npm安装的uiautomator2,也显示已经安装成功了: npm install -g …...

DataSophon集成CMAK KafkaManager
本次集成基于DDP1.2.1 集成CMAK-3.0.0.6 设计的json和tar包我放网盘了. 通过网盘分享的文件:DDP集成CMAK 链接: https://pan.baidu.com/s/1BR70Ajj9FxvjBlsOX4Ivhw?pwdcpmc 提取码: cpmc CMAK github上提供了zip压缩包.将压缩包解压之后 在根目录下加入启动脚本…...

Ubuntu22.04深度学习环境安装【显卡驱动安装】
前言 使用Windows配置环境失败,其中有一个包只有Linux版本,Windows版本的只有python3.10的,所以直接选用Linux来配置环境,显卡安装比较麻烦,单独出一期。 显卡驱动安装 方法一:在线安装(操作…...

21届秋/校招面经
开篇先说一下我自身情况,东南大学本科计算机科学与技术专业毕业,gpa3.2/4.8。零零散散搞过一年多ACM,去年(2019)在icpc上海站拿了铜之后增加了信心(因为当时训练总时间半年不到),于是…...