当前位置: 首页 > news >正文

Vue 3实战:打造交互丰富的任务管理应用

Vue 3实战:打造交互丰富的任务管理应用

  • 前言
  • 搭建Vue 3项目
      • 步骤 1: 安装Vue CLI 3
      • 步骤 2: 创建Vue 3项目
      • 步骤 3: 进入项目目录
      • 步骤 4: 启动项目
      • 步骤 5: 查看项目结构
  • 组件设计与复用
      • 1. **组件的职责单一化:**
      • 2. **Props传递:**
      • 3. **插槽(Slots)的使用:**
      • 4. **Provide / Inject:**
      • 5. **事件(Events)的派发:**
  • Vue 3的响应性系统
      • 1. **ref API:**
      • 2. **reactive API:**
      • 3. **ref vs reactive:**
      • 4. **响应式数据的访问:**
      • 5. **toRefs:**
      • 6. **watchEffect:**
      • 7. **watch:**
  • 组合式API
      • 1. **setup 函数:**
      • 2. **响应式数据:**
      • 3. **生命周期钩子:**
      • 4. **计算属性:**
      • 5. **依赖注入:**
      • 6. **自定义函数:**
      • 7. **模板引用(refs):**
  • 路由与导航
      • 1. **安装 Vue Router:**
      • 2. **创建路由配置:**
      • 3. **创建视图组件:**
      • 4. **在主应用文件中使用 Router:**
      • 5. **创建导航菜单:**
      • 6. **路由守卫:**
  • 状态管理
      • 1. **安装 Vuex:**
      • 2. **创建状态管理模块:**
      • 3. **在主应用文件中使用 Vuex:**
      • 4. **在组件中使用全局状态:**
      • 5. **在组件中使用辅助函数:**
  • 动画与过渡
      • 1. **使用 `<transition>` 元素:**
      • 2. **使用 `transition` 函数:**
      • 3. **使用 `<transition-group>` 实现列表过渡:**
      • 4. **使用 `v-if` 和 `v-show` 过渡:**
  • 性能优化
      • 1. **模板编译优化:**
      • 2. **静态提升:**
      • 3. **树懒加载:**
      • 4. **事件监听器的缓存:**
      • 5. **响应式数据优化:**
      • 6. **Fragments:**
      • 7. **合并静态节点:**
      • 8. **Keep-Alive 的优化:**
      • 9. **缓存事件处理函数:**
      • 10. **生命周期函数的优化:**
  • 测试Vue应用
      • 1. **安装 Jest 和 Vue Test Utils:**
      • 2. **配置 Jest:**
      • 3. **编写测试文件:**
      • 4. **编写 Vue 组件:**
      • 5. **运行测试:**
      • 6. **其他注意事项:**
  • 部署与优化
      • 1. **生产环境构建:**
      • 2. **代码分割:**
      • 3. **CDN 加速:**
      • 4. **压缩静态资源:**
      • 5. **添加缓存策略:**
      • 6. **使用 CDN 加速服务:**
      • 7. **启用服务器端渲染 (SSR):**
      • 8. **移动端优化:**
      • 9. **启用预加载:**
      • 10. **监控与分析:**
  • 结尾

前言

在现代Web开发中,Vue 3已经成为构建交互丰富的用户界面的瑞士军刀。通过这个实战项目,我们将深入了解Vue 3的核心概念,为读者提供一个全方位的学习体验。让我们开始这个令人兴奋的旅程吧!
在这里插入图片描述

搭建Vue 3项目

搭建Vue 3项目可以通过使用Vue CLI 3来简化过程。以下是一个简单的步骤,帮助你初始化一个Vue 3项目并了解其基础项目结构:

步骤 1: 安装Vue CLI 3

确保你的环境中已经安装了Node.js和npm。然后,打开终端并执行以下命令安装Vue CLI 3:

npm install -g @vue/cli

步骤 2: 创建Vue 3项目

使用Vue CLI 3创建一个新的Vue 3项目:

vue create vue3-demo

根据提示选择配置,你可以选择默认配置或手动配置,如果是初学者,建议选择默认配置。

步骤 3: 进入项目目录

进入新创建的Vue 3项目的目录:

cd vue3-demo

步骤 4: 启动项目

运行以下命令启动项目:

npm run serve

步骤 5: 查看项目结构

通过浏览器访问 http://localhost:8080 来查看你的Vue 3项目。接下来,让我们了解项目结构:

  • src文件夹: 包含项目的主要源代码。

    • assets文件夹: 用于存放静态资源如图片、样式表等。
    • components文件夹: 用于存放Vue组件。
    • views文件夹: 通常包含多个页面级别的Vue组件。
    • App.vue: 根组件,包含应用的整体结构。
    • main.js: 项目的入口文件,用于初始化Vue应用。
  • public文件夹: 包含一些公共的静态资源,如 index.html 文件,它是整个Vue应用的主 HTML 文件。

  • node_modules文件夹: 包含项目的依赖项,通过 npm install 安装。

  • babel.config.js: Babel的配置文件,用于转译JavaScript代码。

  • package.json: 包含项目的配置信息和依赖项。

以上是一个基本的Vue 3项目结构,你可以根据实际需求对其进行调整和扩展。在项目中你将会看到Vue 3的新特性,如<script setup>语法等。

组件设计与复用

设计可复用的Vue 3组件是提高代码可维护性和可扩展性的重要步骤。以下是一些建议,帮助你设计和构建可复用的Vue 3组件:

1. 组件的职责单一化:

确保每个组件只关注单一的职责。这使得组件更容易理解、测试和维护。如果组件职责过多,考虑拆分成更小的组件。

2. Props传递:

使用 props 将数据从父组件传递到子组件。通过将数据作为 props 传递,使得组件更灵活和可复用。

<!-- Example.vue -->
<template><div><ChildComponent :dataProp="parentData" /></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent,},data() {return {parentData: 'Hello from parent!',};},
};
</script>
<!-- ChildComponent.vue -->
<template><div>{{ dataProp }}</div>
</template><script>
export default {props: {dataProp: {type: String,required: true,},},
};
</script>

3. 插槽(Slots)的使用:

使用插槽允许父组件在子组件中插入任意内容,使得组件更加灵活。你可以通过默认插槽和具名插槽实现不同的插入点。

<!-- ParentComponent.vue -->
<template><div><ChildComponent><p>This is inserted into the default slot.</p><template v-slot:customSlot><p>This is inserted into the custom slot.</p></template></ChildComponent></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent,},
};
</script>
<!-- ChildComponent.vue -->
<template><div><slot></slot><div class="custom-slot"><slot name="customSlot"></slot></div></div>
</template><script>
export default {};
</script>

4. Provide / Inject:

使用 provideinject 可以在组件树中传递数据,避免通过 props 层层传递。这特别适用于一些全局状态或配置信息的传递。

<!-- ParentComponent.vue -->
<template><div><ChildComponent /></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent,},provide() {return {globalData: 'Global Data',};},
};
</script>
<!-- ChildComponent.vue -->
<template><div>{{ injectedData }}</div>
</template><script>
export default {inject: ['globalData'],computed: {injectedData() {return this.globalData;},},
};
</script>

5. 事件(Events)的派发:

通过使用 emit 方法,子组件可以向父组件发送事件。这允许父组件在子组件发生某些操作时做出响应。

<!-- ChildComponent.vue -->
<template><div><button @click="triggerEvent">Click me</button></div>
</template><script>
export default {methods: {triggerEvent() {this.$emit('customEvent', 'Data to pass');},},
};
</script>
<!-- ParentComponent.vue -->
<template><div><ChildComponent @customEvent="handleCustomEvent" /></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent,},methods: {handleCustomEvent(data) {console.log('Received data:', data);},},
};
</script>

以上是一些建议,帮助你设计可复用的Vue 3组件。通过遵循这些最佳实践,你可以提高代码的可维护性,同时在不同项目中更方便地复用你的组件。

Vue 3的响应性系统

Vue 3的响应性系统是其核心功能之一,它使得数据和视图之间的绑定变得轻松且高效。Vue 3引入了新的 reactiveref API 来更灵活地处理响应性。

1. ref API:

ref 是一个用于创建响应式数据的函数。它可以包装基本类型(如数字、字符串等)或对象,并返回一个具有 .value 属性的对象。使用 ref 是为了明确标识数据是响应式的。

import { ref } from 'vue';const count = ref(0);console.log(count.value); // 输出:0count.value++; // 修改数据
console.log(count.value); // 输出:1

2. reactive API:

reactive 是用于创建响应式对象的函数。与 ref 不同,reactive 可以接受一个普通对象,并返回一个响应式对象。reactive 会递归地将对象的所有属性转换为响应式。

import { reactive } from 'vue';const state = reactive({count: 0,message: 'Hello',
});console.log(state.count); // 输出:0state.count++; // 修改数据
console.log(state.count); // 输出:1

3. ref vs reactive:

  • 使用 ref 主要用于创建基本类型的响应式数据。
  • 使用 reactive 主要用于创建包含多个属性的响应式对象。

4. 响应式数据的访问:

当你使用 refreactive 创建的响应式数据时,你需要通过 .value 属性来访问或修改数据。

const count = ref(0);
const state = reactive({ count: 0 });console.log(count.value); // ref
console.log(state.count); // reactivecount.value++;
state.count++;

5. toRefs:

toRefs 是一个实用函数,它可以将响应式对象的属性转换为普通的 ref 对象,以便在解构或传递给其他组件时保持响应性。

import { reactive, toRefs } from 'vue';const state = reactive({count: 0,message: 'Hello',
});const { count, message } = toRefs(state);console.log(count.value); // 输出:0
console.log(message.value); // 输出:'Hello'

6. watchEffect:

watchEffect 是一个用于监听数据变化的函数。它会在函数内部访问响应式数据,并在数据变化时自动重新运行。

import { ref, watchEffect } from 'vue';const count = ref(0);watchEffect(() => {console.log(count.value);
});count.value++; // 输出:1

7. watch:

watch 允许你对一个或多个数据进行监视,当数据变化时执行特定的操作。

import { ref, watch } from 'vue';const count = ref(0);watch(() => {console.log(count.value);
});count.value++; // 输出:1

以上是Vue 3的响应性系统的基础内容,通过 reactiveref API,你可以更加灵活地处理数据的响应性。watchEffectwatch 则用于监听数据的变化并执行相应的操作。深入理解这些概念将使你能够更好地利用Vue 3的强大功能。

组合式API

Vue 3 的组合式 API 是一种新的 API 风格,它使得组件的逻辑更清晰、易于组织,并且更容易进行测试。以下是一些使用组合式 API 的基本概念和示例:

1. setup 函数:

setup 函数是组合式 API 的入口,它用于替代 Vue 2 的 datamethods 等选项。setup 函数在组件实例创建之前执行,并且它是唯一能访问组件实例的地方。

<script>
import { ref } from 'vue';export default {setup() {// 使用 ref 创建响应式数据const count = ref(0);// 返回数据和方法return {count,increment: () => {count.value++;},};},
};
</script>

2. 响应式数据:

使用 refreactive 创建响应式数据。

<script>
import { ref } from 'vue';export default {setup() {const count = ref(0);return {count,};},
};
</script>

3. 生命周期钩子:

通过 onMountedonUpdatedonUnmounted 等函数来执行生命周期钩子。

<script>
import { ref, onMounted, onUnmounted } from 'vue';export default {setup() {const message = ref('Hello');// 在组件挂载时执行onMounted(() => {console.log('Component mounted');});// 在组件卸载时执行onUnmounted(() => {console.log('Component unmounted');});return {message,};},
};
</script>

4. 计算属性:

使用 computed 函数创建计算属性。

<script>
import { ref, computed } from 'vue';export default {setup() {const count = ref(0);// 创建计算属性const doubledCount = computed(() => count.value * 2);return {count,doubledCount,};},
};
</script>

5. 依赖注入:

使用 provideinject 在组合式 API 中进行依赖注入。

<script>
import { ref, provide, inject } from 'vue';const key = Symbol();export function useExample() {const data = ref('Example Data');provide(key, data);return {data,};
}export function useChild() {const data = inject(key);return {data,};
}
</script>

6. 自定义函数:

将逻辑拆分成可复用的函数。

<script>
import { ref } from 'vue';function useCounter() {const count = ref(0);function increment() {count.value++;}return {count,increment,};
}export default {setup() {const { count, increment } = useCounter();return {count,increment,};},
};
</script>

7. 模板引用(refs):

通过 ref 函数引用模板中的 DOM 元素或组件实例。

<script>
import { ref, onMounted } from 'vue';export default {setup() {const myButton = ref(null);onMounted(() => {console.log(myButton.value); // 引用按钮元素});return {myButton,};},
};
</script><template><button ref="myButton">Click me</button>
</template>

以上是使用 Vue 3 的组合式 API 的基本概念和示例。通过这些概念,你可以更灵活地组织组件的逻辑,使其更易于理解和测试。组合式 API 的引入是 Vue 3 中一个强大的改进,能够更好地满足大型应用的需求。

路由与导航

集成 Vue Router 4 是在 Vue 3 中进行应用导航和页面切换的常用方式。以下是一些基本步骤,帮助你集成 Vue Router 4:

1. 安装 Vue Router:

在项目目录下执行以下命令安装 Vue Router:

npm install vue-router@4

2. 创建路由配置:

创建一个 router 文件夹,并在其中创建一个 index.js 文件,用于配置路由。

// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import About from '../views/About.vue';const routes = [{path: '/',name: 'Home',component: Home,},{path: '/about',name: 'About',component: About,},
];const router = createRouter({history: createWebHistory(),routes,
});export default router;

3. 创建视图组件:

views 文件夹下创建与路由配置中对应的视图组件。

<!-- views/Home.vue -->
<template><div><h2>Home</h2><p>Welcome to the home page!</p></div>
</template><!-- views/About.vue -->
<template><div><h2>About</h2><p>This is the about page.</p></div>
</template>

4. 在主应用文件中使用 Router:

在主应用文件(通常是 main.js)中导入并使用创建的路由。

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';const app = createApp(App);app.use(router);app.mount('#app');

5. 创建导航菜单:

在应用中创建导航菜单,使用 <router-link> 来实现页面导航。

<!-- App.vue -->
<template><div id="app"><router-link to="/">Home</router-link><router-link to="/about">About</router-link><router-view></router-view></div>
</template><script>
export default {name: 'App',
};
</script>

6. 路由守卫:

Vue Router 提供了路由守卫,可以在导航过程中进行一些操作,如权限验证、页面加载等。

// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import About from '../views/About.vue';const router = createRouter({history: createWebHistory(),routes: [// ...],
});// 路由守卫
router.beforeEach((to, from, next) => {// 可以在这里进行权限验证等操作console.log(`Navigating from ${from.path} to ${to.path}`);next();
});export default router;

以上是基本的 Vue Router 4 集成和配置的步骤。你可以根据实际需求扩展配置,添加路由守卫、嵌套路由等功能。通过使用 Vue Router,你可以方便地实现应用的导航和页面切换。

状态管理

引入 Vuex 4 是在 Vue 3 中进行全局状态管理的主要方式。以下是一些基本步骤,帮助你引入 Vuex 4 并使用新的 createStore API:

1. 安装 Vuex:

在项目目录下执行以下命令安装 Vuex:

npm install vuex@4

2. 创建状态管理模块:

store 文件夹下创建一个 index.js 文件,用于创建和导出 Vuex 的 store。

// store/index.js
import { createStore } from 'vuex';const store = createStore({state() {return {count: 0,};},mutations: {increment(state) {state.count++;},},actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment');}, 1000);},},getters: {getCount: state => state.count,},
});export default store;

3. 在主应用文件中使用 Vuex:

在主应用文件(通常是 main.js)中导入并使用创建的 Vuex store。

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';const app = createApp(App);app.use(store);app.mount('#app');

4. 在组件中使用全局状态:

在组件中使用 mapStatemapMutationsmapActionsmapGetters 等辅助函数,或直接使用 store 对象。

<!-- MyComponent.vue -->
<template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button><button @click="incrementAsync">Increment Async</button></div>
</template><script>
import { mapState, mapMutations, mapActions } from 'vuex';export default {computed: {...mapState(['count']),},methods: {...mapMutations(['increment']),...mapActions(['incrementAsync']),},
};
</script>

5. 在组件中使用辅助函数:

Vuex 4 提供了更简单的辅助函数来访问全局状态。

<!-- MyComponent.vue -->
<template><div><p>Count: {{ getCount }}</p><button @click="increment">Increment</button><button @click="incrementAsync">Increment Async</button></div>
</template><script>
import { useStore } from 'vuex';export default {setup() {const store = useStore();return {getCount: store.getters.getCount,increment: () => store.commit('increment'),incrementAsync: () => store.dispatch('incrementAsync'),};},
};
</script>

以上是基本的 Vuex 4 的引入和配置的步骤。你可以根据实际需求扩展配置,添加模块、插件等功能。通过使用 Vuex,你可以方便地管理全局状态,实现组件间的通信和共享数据。

动画与过渡

Vue 3 提供了强大的动画系统,使得为应用增加流畅的过渡效果变得更加容易。以下是一些建议,帮助你在 Vue 3 中利用动画系统实现过渡效果:

1. 使用 <transition> 元素:

Vue 3 的动画系统依然支持 <transition> 元素。你可以在组件的模板中使用 <transition> 元素来包裹需要过渡的元素。

<template><div><transition name="fade"><p v-if="show">This will fade</p></transition><button @click="toggle">Toggle</button></div>
</template><script>
export default {data() {return {show: true,};},methods: {toggle() {this.show = !this.show;},},
};
</script><style>
.fade-enter-active, .fade-leave-active {transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {opacity: 0;
}
</style>

2. 使用 transition 函数:

在 Vue 3 中,你还可以使用 transition 函数来动态地应用过渡效果,这使得过渡更加灵活。

<template><div><div :style="transitionStyles"><p>This will fade</p></div><button @click="toggle">Toggle</button></div>
</template><script>
import { ref } from 'vue';export default {setup() {const show = ref(true);const toggle = () => {show.value = !show.value;};return {show,toggle,transitionStyles: {transition: 'opacity 0.5s',opacity: show.value ? 1 : 0,},};},
};
</script>

3. 使用 <transition-group> 实现列表过渡:

如果你需要对列表进行过渡,可以使用 <transition-group> 元素。

<template><div><transition-group name="list" tag="ul"><li v-for="item in items" :key="item.id">{{ item.text }}</li></transition-group><button @click="addItem">Add Item</button></div>
</template><script>
import { ref } from 'vue';export default {setup() {const items = ref([{ id: 1, text: 'Item 1' },{ id: 2, text: 'Item 2' },]);const addItem = () => {items.value.push({ id: Date.now(), text: `Item ${items.value.length + 1}` });};return {items,addItem,};},
};
</script><style>
.list-enter-active, .list-leave-active {transition: opacity 1s;
}
.list-enter, .list-leave-to {opacity: 0;
}
</style>

4. 使用 v-ifv-show 过渡:

通过设置 <transition> 元素上的 mode 属性,可以更灵活地使用 v-ifv-show 进行过渡。

<template><div><transition name="fade" mode="out-in"><p v-if="show">This will fade</p><p v-else>Another text</p></transition><button @click="toggle">Toggle</button></div>
</template><script>
export default {data() {return {show: true,};},methods: {toggle() {this.show = !this.show;},},
};
</script><style>
.fade-enter-active, .fade-leave-active {transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {opacity: 0;
}
</style>

这些是一些基本的 Vue 3 动画系统的使用示例。你可以根据实际需求和复杂度,更进一步地使用 Vue 3 提供的高级动画功能,如自定义过渡类名、JavaScript 钩子等,以满足更复杂的动画场景。

性能优化

Vue 3 在性能方面进行了许多改进,包括编译性能、运行时性能以及渲染性能。以下是一些建议,帮助你深入了解 Vue 3 的性能优化策略:

1. 模板编译优化:

Vue 3 的模板编译器进行了重写,生成的代码更加紧凑和高效。通过将模板编译为更优化的渲染函数,Vue 3 可以更快地进行渲染。

2. 静态提升:

Vue 3 通过静态提升(Static Hoisting)进一步优化渲染性能。在编译阶段,Vue 3 能够检测和提升那些在渲染过程中不会发生变化的部分,以减少运行时的开销。

3. 树懒加载:

Vue 3 允许你将组件树的一部分进行懒加载,这意味着只有在组件实际需要渲染时才会加载相应的代码。这可以显著减少初始加载时的文件大小。

const MyComponent = () => import('./MyComponent.vue');

4. 事件监听器的缓存:

Vue 3 使用了事件监听器的缓存,避免了在每次渲染时都重新创建新的事件监听器。这有助于减少内存开销和提高渲染性能。

5. 响应式数据优化:

Vue 3 使用 Proxy 替代了 Object.defineProperty 来实现响应式数据。Proxy 具有更好的性能和更丰富的特性。在大型数据集下,Vue 3 的响应式系统相比 Vue 2 有更好的性能表现。

6. Fragments:

Vue 3 引入了 Fragments,允许组件返回多个根节点,而无需额外的包装元素。这有助于减少生成的 DOM 元素数量,提高渲染性能。

<template><><div>First child</div><div>Second child</div></>
</template>

7. 合并静态节点:

Vue 3 在编译阶段能够更好地合并静态节点,减少生成的渲染函数中的重复代码,从而提高运行时性能。

8. Keep-Alive 的优化:

Vue 3 对 Keep-Alive 进行了一些优化,包括异步组件的 Keep-Alive,以及在组件被激活时才创建组件实例。

9. 缓存事件处理函数:

Vue 3 在事件处理函数上进行了缓存,避免了在每次渲染时都重新创建新的函数,提高性能。

10. 生命周期函数的优化:

Vue 3 通过静态提升等技术对生命周期函数进行了优化,避免了不必要的开销。

这些是一些 Vue 3 中的性能优化策略。在实际开发中,你可以根据应用的具体情况采用这些策略,提高应用的加载速度和渲染性能。同时,了解 Vue 3 的内部优化原理也有助于更好地理解框架的工作方式。

测试Vue应用

测试是确保应用稳定性和可维护性的重要组成部分。Vue 3 提供了 Vue Test Utils 作为官方的测试工具,而 Jest 则是一个流行的 JavaScript 测试框架。以下是使用 Jest 和 Vue Test Utils 编写 Vue 应用的单元测试的基本步骤:

1. 安装 Jest 和 Vue Test Utils:

首先,确保你的项目中已经安装了 Jest 和 Vue Test Utils:

npm install --save-dev jest vue-jest @vue/test-utils

2. 配置 Jest:

在项目根目录下创建 jest.config.js 文件,配置 Jest 的基本设置:

module.exports = {moduleFileExtensions: ['js', 'json', 'vue'],transform: {'^.+\\.js$': 'babel-jest','^.+\\.vue$': 'vue-jest',},moduleNameMapper: {'^@/(.*)$': '<rootDir>/src/$1',},testMatch: ['<rootDir>/tests/**/*.spec.js'],transformIgnorePatterns: ['/node_modules/'],
};

3. 编写测试文件:

在项目中创建测试文件,通常位于 tests 文件夹下。例如,创建一个 MyComponent.spec.js 文件:

// MyComponent.spec.js
import { mount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';describe('MyComponent', () => {it('renders correctly', () => {const wrapper = mount(MyComponent);expect(wrapper.html()).toMatchSnapshot();});it('increments count when button is clicked', async () => {const wrapper = mount(MyComponent);await wrapper.find('button').trigger('click');expect(wrapper.vm.count).toBe(1);});
});

4. 编写 Vue 组件:

在项目中创建 Vue 组件,例如 MyComponent.vue

<!-- MyComponent.vue -->
<template><div><p>{{ count }}</p><button @click="increment">Increment</button></div>
</template><script>
export default {data() {return {count: 0,};},methods: {increment() {this.count++;},},
};
</script>

5. 运行测试:

package.json 中添加测试脚本:

"scripts": {"test": "jest"
}

然后运行测试:

npm test

6. 其他注意事项:

  • 使用 mount 函数来挂载组件,并通过选择器或 Vue Test Utils 提供的方法来测试组件行为。
  • 使用 Jest 的快照测试来比较组件渲染结果,确保 UI 不发生意外更改。
  • 可以使用 @vue/test-utils 提供的工具函数来模拟用户行为,如点击、输入等。

以上是使用 Jest 和 Vue Test Utils 编写 Vue 应用的单元测试的基本步骤。你可以根据项目的具体需求和组件的复杂性,编写更多详细的测试用例来确保应用的稳定性。

部署与优化

将 Vue 应用部署到生产环境时,有一些优化技巧可以提高用户体验并优化性能。以下是一些建议:

1. 生产环境构建:

确保在生产环境中使用优化过的构建。通常,你可以使用如下命令来构建生产版本:

npm run build

构建完成后,你会在项目的 dist 目录下找到优化过的文件。

2. 代码分割:

使用 Vue 的异步组件和路由的懒加载特性,实现代码分割。这样能够减小初始加载的文件大小,使得页面更快地加载。

// 异步组件
const MyComponent = () => import('./MyComponent.vue');// 路由懒加载
const Home = () => import('./views/Home.vue');
const About = () => import('./views/About.vue');const routes = [{ path: '/', component: Home },{ path: '/about', component: About },
];

3. CDN 加速:

将一些公共库(如 Vue、Vue Router)通过 CDN 引入,以减少你的应用包的大小,提高加载速度。

<!-- 在 index.html 中引入 Vue 的 CDN -->
<script src="https://cdn.jsdelivr.net/npm/vue@3"></script>

4. 压缩静态资源:

使用压缩工具(如 gzip)来压缩静态资源,减小文件大小,加快下载速度。

5. 添加缓存策略:

配置服务器端缓存策略,例如使用 HTTP 头中的 Cache-Control 和 ETag。这能够减少不必要的网络请求,提高页面加载速度。

6. 使用 CDN 加速服务:

考虑使用 CDN 加速服务,将静态资源分发到全球节点,提高用户访问速度。

7. 启用服务器端渲染 (SSR):

对于需要更好性能的应用,考虑使用 Vue 的服务器端渲染 (SSR)。SSR 可以提供更快的首屏加载速度和更好的搜索引擎优化 (SEO)。

8. 移动端优化:

对于移动端应用,确保你的应用是响应式的,并考虑使用移动端专用的优化技术,如移动端适配、懒加载图片等。

9. 启用预加载:

在合适的时机,使用 <link rel="preload"> 标签来预加载一些关键资源,提前获取资源并加速后续加载。

<link rel="preload" href="your-critical-resource.js" as="script">

10. 监控与分析:

使用监控工具和性能分析工具,如 Google Analytics、Webpack Bundle Analyzer 等,以便深入了解应用的性能和用户行为。

通过综合使用这些优化技巧,你可以显著提升 Vue 应用在生产环境中的性能和用户体验。记得在应用上线前进行全面的测试,确保在生产环境中的稳定性和性能。

结尾

通过这个实际项目,你将不仅仅学到Vue 3的核心概念,还能够将这些知识应用到一个真实的应用场景中,为你的Vue技能提升注入新的活力。

相关文章:

Vue 3实战:打造交互丰富的任务管理应用

Vue 3实战&#xff1a;打造交互丰富的任务管理应用 前言搭建Vue 3项目步骤 1: 安装Vue CLI 3步骤 2: 创建Vue 3项目步骤 3: 进入项目目录步骤 4: 启动项目步骤 5: 查看项目结构 组件设计与复用1. **组件的职责单一化:**2. **Props传递:**3. **插槽&#xff08;Slots&#xff09…...

python之列表

列表常用操作 l [1,2,3,4,5]# 列表之切片 l1 l[:3] print(l1) # [1, 2, 3],结果为下标0到2 l2 l[3:] print(l2) # [4, 5] ,从下标3开始直到结束 l3 l[1:-1] print(l3) # [2, 3, 4] , 去头去尾...

想要保护服务器的安全,使用哪个软件比较好?

随着互联网的发展普及&#xff0c;网络安全问题也越发凸显&#xff0c;相信不少使用服务器的用户&#xff0c;有遇到过或是听过服务器被入侵导致数据丢失或是被植入病毒木马程序被用来挖矿的情况。那么面对这类情况&#xff0c;我们该如何做好安全工作来保障我们服务器的使用安…...

gitlab图形化界面使用

gitlab使用 创建用户 上面是创建用户基本操作 修改密码 创建组 给组添加用户 创建项目 选择空白项目 退出root用户&#xff0c;切换其他用户 在服务器上创建ssh密钥 使用ssh-ketgen 命令 新服务器上创建的 [rootgitlab ~]# ssh-keygen Generating public/private rsa key …...

Vue使用基本教程(基本介绍及对比,初步使用,构建项目,编辑器等)

一、Vue及与其他前端框架的异同。 Vue.js&#xff08;通常简称为Vue&#xff09;是一个用于构建用户界面的渐进式JavaScript框架。它专注于视图层&#xff0c;采用简单的API设计&#xff0c;使得开发者能够更轻松地构建交互式的单页面应用&#xff08;SPA&#xff09;和用户界…...

基恩士软件的基本操作(四,快速编辑plc技巧)

目录 单元软原件注释快速添加 双击单元配置&#xff0c;进入单元编辑器 KV一键添加注释 双击软元件注释 进入软元件编辑界面 &#xff0c;对弹出的列表中软元件打勾点击登录 元件注释就自动添加了 注释收索&#xff0c;快速编辑软元件 自定义注释收索 空软元件快速查找 …...

通达信的ebk文件

我们在通达信软件中 调出 “自定义板块设置” 这个菜单&#xff0c;点击“导出”&#xff0c;会提示你存储 “自选股.EBK”&#xff0c;其实就是对自定义板块里的目录进行备份的一种方式&#xff0c; 当我们打开 这个文件&#xff0c;你会发现其实就是存储了 股票代码&#xff…...

城市易涝点怎么安装万宾科技内涝积水监测仪?

城市内涝是多个城市广泛存在的问题&#xff0c;经常给城市的居民和基础设施带来一些安全威胁。暴雨引发的道路积水和交通中断、财产损失&#xff0c;甚至公共安全威胁都是城市管理者需要提前预防的问题。为了解决这些问题&#xff0c;内涝积水监测仪的应用是一大重要的举措&…...

css取消移动端长按元素背景色

在开发微信小程序的时候&#xff0c;发现有的元素长按之后&#xff0c;出现了讨厌人的背景色&#xff0c;这就很奇怪&#xff0c;就想把它去掉&#xff0c;所以这里教一下方法&#xff1a; 在所在元素添加css样式&#xff1a; // 取消长按的背景色-webkit-tap-highlight-color:…...

inBuilder低代码平台新特性推荐-第九期

各位知乎的友友们&#xff0c;大家好~ 今天来给大家带来的是inBuilder低代码平台特性推荐系列第九期——子表弹出新增&#xff01; 01 概述 子表弹出新增&#xff0c;是低代码平台提供的一种前端输入组件&#xff0c;在子表字段较多的场景中&#xff0c;有时为了方便…...

C语言——递归实现汉诺塔游戏

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 比别人多一点努力&#xff0c;你…...

使用MONAI轻松加载医学公开数据集,包括医学分割十项全能挑战数据集和MedMNIST分类数据集

在深度学习中&#xff0c;使用公开数据集具有以下优点&#xff1a; 提供了一个标准化的基准来比较不同算法或模型的性能&#xff0c;因为这些公共数据集被广泛使用&#xff0c;许多研究人员都使用它们来评估他们的方法。可以节省大量的时间和金钱&#xff0c;因为这些数据集已…...

dvwa 代码注入impossible代码审计

dvwa 代码注入impossible代码审计 <?phpif( isset( $_POST[ Submit ] ) ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ user_token ], $_SESSION[ session_token ], index.php ); // 检查token值是否正确// Get input$target $_REQUEST[ ip ]; $target stripslas…...

909-2015-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 线性表使用公式化描述方式存储。编写一个函数&#xff0c;从一给定的线性表A中删除值在x ~ y&#xff08;x到y&#xff0c;x<y&#xff09;之间的所有元素&#xff0c;要求以较高的效率来实现。提示&#…...

selenium下载安装对应的chromedriver并执行

文章目录 selenium对应版本chrome驱动下载114以及之前的chrome版本119/120/121的chrome版本 chromedriver安装执行selenium代码 selenium Selenium是广泛使用的模拟浏览器运行的库&#xff0c;它是一个用于Web应用程序测试的工具。 Selenium测试直接运行在浏览器中&#xff0c…...

1.什么是Angular?

Angular Angular 是一个应用设计框架与开发平台&#xff0c;旨在创建高效而精致的单页面应用。 什么是Angular&#xff1f; Angular 是一个基于 TypeScript 构建的开发平台。它包括&#xff1a; 一个基于组件的框架&#xff0c;用于构建可伸缩的 Web 应用。一组完美集成的库&am…...

Qt ListWidget

先创建QListWidgetItem&#xff1a; QListWidgetItem* pListItem1 new QListWidgetItem(QIcon(":/resources/editor.png"),u8"editor");QListWidgetItem* pListItem2 new QListWidgetItem(QIcon(":/resources/env.png"),u8"env");Q…...

微服务实战系列之加密RSA

前言 在这个时代&#xff0c;我们选择的人生目标已丰富多彩&#xff0c;秉持的人生态度也千差万别&#xff1a; 除了吃喝玩乐&#xff0c;还有科技探索&#xff1b; 除了CityWalk&#xff0c;还有“BookWalk”&#xff1b; 除了走遍中国&#xff0c;还有走遍世界&#xff1b; …...

Centos 里面为什么有的磁盘命名/dev/vda 有的是/dev/sda ?

环境&#xff1a; Centos7.9 问题描述&#xff1a; Centos 里面为什么有的磁盘命名/dev/vda 有的是/dev/sda ? 解决方案&#xff1a; 1.盘命名为/dev/vda或/dev/sda的差异主要取决于系统的安装方式和硬件架构。 /dev/sda是传统的磁盘命名方案&#xff0c;用于标识IDE、S…...

P9232 [蓝桥杯 2023 省 A] 更小的数(区间DP)

求大数字某连续部分反转后&#xff0c;比原数字小的个数 思路&#xff1a;自前向后遍历 ai是位于数字第i位的数字 aj是位于数字第j位的数字&#xff08;i<j&#xff09; ai>aj f[ai][aj]1; ai<aj f[ai][aj]0; aiaj f[ai][aj]f…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...