Vue Devtools 是 Vue.js 官方提供的浏览器开发者工具扩展,专门用于调试 Vue 应用程序。它提供了直观的界面来检查组件层次结构、跟踪状态变化、调试性能问题等。
// main.js / main.ts
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
// 开发环境下启用 Devtools
if (process.env.NODE_ENV === 'development') {
// Vue Devtools 会自动检测,但可以手动设置
app.config.devtools = true
// 或者通过全局变量
window.__VUE_DEVTOOLS_GLOBAL_HOOK__ = true
}
app.mount('#app')
F12 打开开发者工具
Vue Devtools 标签位置
Components 面板显示了当前页面的 Vue 组件树结构。可以:
// 在 Devtools 中可以直接编辑
export default {
data() {
return {
// 可以直接在 Devtools 中修改这些值
count: 0,
message: 'Hello Vue',
user: {
name: 'John',
age: 25
}
}
}
}
在 Components 面板中找到对应的组件,展开 data 部分,双击值即可编辑。
<template>
<button @click="handleClick">
点击我
</button>
</template>
<script>
export default {
methods: {
handleClick() {
this.$emit('custom-event', 'data')
console.log('按钮被点击')
}
}
}
</script>
// Pinia store 示例
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', {
state: () => ({ count: 0 }),
actions: {
increment() {
this.count++ // 可以在 Devtools 中跟踪
}
}
})
Pinia 调试面板
// Vue Router 配置
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(),
routes: [
{ path: '/', component: Home },
{ path: '/about', component: About }
]
})
在 Devtools 的 Routing 标签中可以:
v-memo 或优化计算属性。
性能时间线分析
// 在组件中添加性能标记
export default {
name: 'MyComponent',
// 生命周期钩子中可以添加性能标记
created() {
if (process.env.NODE_ENV === 'development') {
console.time('MyComponent-render')
}
},
mounted() {
if (process.env.NODE_ENV === 'development') {
console.timeEnd('MyComponent-render')
}
}
}
使用 $0 快速访问当前选中的 DOM 元素对应的 Vue 组件:
// 在控制台中
$0.__vue__ // 访问组件实例
在控制台中直接操作 Vue 实例:
// 获取根组件实例
const app = document.querySelector('#app').__vue_app__
// 获取特定组件实例
const vm = $0.__vueParentComponent
点击组件可以直接跳转到源码:
// 在构建配置中启用生产环境 Devtools
// vite.config.js / vue.config.js
export default defineConfig({
build: {
sourcemap: true // 生成 source maps
},
// Vue 插件配置
plugins: [
vue({
reactivityTransform: true,
template: {
compilerOptions: {
// 生产环境启用 Devtools
devtools: process.env.NODE_ENV === 'production'
}
}
})
]
})
可能的原因:
readonly 包装时间旅行仅支持 Vuex,Pinia 使用不同的调试机制。Pinia 可以通过快照功能实现类似效果:
// 手动创建状态快照
const snapshot = JSON.stringify(store.$state)
// 恢复状态
store.$state = JSON.parse(snapshot)