# Middlewares Os armazéns Vuex aceitam a opção `middlewares` que expõem hooks para cada mutação (Note que isso é completamente não relacionado aos middlewares Redux). Um middleware Vuex é simplesmente um objeto que implementam algumas funções de hook: ``` js const myMiddleware = { onInit (state, store) { // estado inicial do registro }, onMutation (mutation, state, store) { // chamado após todas mutações // A mutação vem no formato { type, payload } } } ``` E também pode ser utilizado assim: ``` js const store = new Vuex.Store({ // ... middlewares: [myMiddleware] }) ``` Por padrão, um middleware recebe o objeto `state` real. Um middleware também pode receber o `armazém` (`store`) para disparar mutações. Como os middlewares são primariamente utilizados para debug da sua aplicação ou persistência de dados, eles **não podem modificar o estado** Algumas vezes um middleware pode querer receber "snapshots" do estado, e também comparar o estádo pós-mutação com o pré-mutação. Esses middlewares precisam declarar a opção `snapshot: true`: ``` js const myMiddlewareWithSnapshot = { snapshot: true, onMutation (mutation, nextState, prevState, store) { // nextState and prevState are deep-cloned snapshots // of the state before and after the mutation. } } ``` **Middlwares que fazem snapshots devem apenas serem utilizados durante desenvolvimento** Quando você estiver utilizando Webpack ou o Browserify, você pode deixar que essas ferramentas cuidem disso para você: ``` js const store = new Vuex.Store({ // ... middlewares: process.env.NODE_ENV !== 'production' ? [myMiddlewareWithSnapshot] : [] }) ``` O middleware será utilizado por padrão. Para produção, utilize a build descrita [aqui](http://vuejs.org/guide/application.html#Deploying_for_Production) para converter o valor de `process.env.NODE_ENV !== 'production'` para `false` na build final. ### Middleware de Log Padrão O Vuex já vem com um middleware de log para o uso geral de debug: ``` js import createLogger from 'vuex/logger' const store = new Vuex.Store({ middlewares: [createLogger()] }) ``` A função `createLogger` recebe alguns parâmetros: ``` js const logger = createLogger({ collapsed: false, // auto-expand logged mutations transformer (state) { // transform the state before logging it. // for example return only a specific sub-tree return state.subTree }, mutationTransformer (mutation) { // mutations are logged in the format of { type, payload } // we can format it anyway we want. return mutation.type } }) ``` Note que o middleware logger faz snapshots do estado, então utilize-o apenas para desenvolvimento.