還剩餘vue
/module
/plugins
store.js
const devtoolHook = typeof window !== 'undefined' && window.__VUE_DEVTOOLS_GLOBAL_HOOK__ export default function devtoolPlugin (store) { if (!devtoolHook) return store._devtoolHook = devtoolHook devtoolHook.emit('vuex:init', store) devtoolHook.on('vuex:travel-to-state', targetState => { store.replaceState(targetState) }) store.subscribe((mutation, state) => { devtoolHook.emit('vuex:mutation', mutation, state) }) }
repeatvuex
function repeat (str, times) { return (new Array(times + 1)).join(str) }
解析:瀏覽器
pad工具
function pad (num, maxLength) { return repeat('0', maxLength - num.toString().length) + num }
解析:源碼分析
createLoggercode
import { deepCopy } from '../util' export default function createLogger ({ collapsed = true, filter = (mutation, stateBefore, stateAfter) => true, transformer = state => state, mutationTransformer = mut => mut, logger = console } = {}) { return store => { let prevState = deepCopy(store.state) store.subscribe((mutation, state) => { if (typeof logger === 'undefined') { return } const nextState = deepCopy(state) if (filter(mutation, prevState, nextState)) { const time = new Date() const formattedTime = ` @ ${pad(time.getHours(), 2)}:${pad(time.getMinutes(), 2)}:${pad(time.getSeconds(), 2)}.${pad(time.getMilliseconds(), 3)}` const formattedMutation = mutationTransformer(mutation) const message = `mutation ${mutation.type}${formattedTime}` const startMessage = collapsed ? logger.groupCollapsed : logger.group // render try { startMessage.call(logger, message) } catch (e) { console.log(message) } logger.log('%c prev state', 'color: #9E9E9E; font-weight: bold', transformer(prevState)) logger.log('%c mutation', 'color: #03A9F4; font-weight: bold', formattedMutation) logger.log('%c next state', 'color: #4CAF50; font-weight: bold', transformer(nextState)) try { logger.groupEnd() } catch (e) { logger.log('—— log end ——') } } prevState = nextState }) } }
console
的一些報錯處理模板store.subscribe
監控的是commit
,每次commit都會執行一次檢測