Vuex adalah perpustakaan manajemen negara aplikasi resmi dan terdokumentasi dengan baik yang dirancang khusus untuk Vue.js. Penulis bahan, terjemahan yang kami terbitkan hari ini, percaya bahwa menggunakan perpustakaan ini jauh lebih menyenangkan daripada Redux, karena, pertama, Vuex membutuhkan lebih sedikit kode boilerplate, dan kedua, karena fakta bahwa ia berfungsi dengan mekanisme asinkron, tidak ada perpustakaan tambahan yang diperlukan di sini. Selain itu, karena perpustakaan Vuex dibuat oleh tim yang sama yang sedang mengerjakan Vue, perpustakaan ini terintegrasi dengan sangat baik dengan kerangka kerja ini. Sayangnya, dalam bekerja dengan Vuex Anda masih dapat menemukan satu kesulitan, yang terdiri dari mempersiapkan dengan benar struktur proyek di mana Anda berencana untuk menggunakan pustaka ini.

Pada artikel ini Anda akan menemukan deskripsi metodologi untuk menyusun proyek besar menggunakan Vuex, dan skrip yang dirancang untuk mengotomatisasi proses pembuatan modul Vuex.
Pola Vue-enterprise-boilerplate dan masalah struktur proyek
Salah satu pengembang Vue, Chris Fritz, menciptakan 
templat yang sangat baik untuk Vue, struktur proyek yang disajikan yang dirancang untuk menggunakan Vuex. Secara khusus, template ini memungkinkan Vuex untuk secara otomatis mendaftarkan modul berdasarkan file dalam folder 
modules . Struktur folder proyek mungkin terlihat seperti gambar berikut.
Struktur proyek dan penempatan kode yang tidak nyamanSaat menggunakan templat ini, perlu bahwa status, getter, aksi, dan mutasi berada dalam file yang sama. Secara pribadi, saya lebih suka menyimpannya dalam file terpisah, yang memungkinkan, mengingat fakta bahwa modul Vuex kadang-kadang cukup besar, lebih mudah untuk menavigasi program, tanpa harus menggulir melalui potongan kode yang besar. Mengikuti ide ini, kami akan mengubah kode dari template sehingga yang terkait dengan modul individual dapat diurutkan ke dalam folder yang ditujukan untuk modul-modul ini. Artinya, struktur proyek akan berubah dan akan mirip dengan yang ditunjukkan di bawah ini.
Struktur proyek dengan rincian materi modul menjadi file terpisah yang ada di folder modulPengembangan templat yang mendukung struktur proyek yang nyaman
Jadi, kita akan mengatur kerja dengan Vuex sehingga kita dapat menggunakan folder dan struktur file yang mirip dengan yang ditunjukkan pada gambar sebelumnya di proyek-proyek kita. Untuk melakukan ini, pertama buat proyek baru menggunakan 
Vue CLI 3 .
Setelah Anda memiliki templat proyek yang siap untuk dikerjakan lebih lanjut, instal Vuex dan Lodash dengan menjalankan 
npm install vuex lodash -save di terminal. Untuk bekerja dengan modul, kita membutuhkan fungsi camelCase dari Lodash, yang dirancang untuk mengubah string menjadi gaya unta.
Sekarang buat folder dan struktur file yang mirip dengan yang ditunjukkan pada gambar sebelumnya.
Mari kita mulai dengan file 
store.js . Ini kodenya:
 import Vue from 'vue' import Vuex from 'vuex' import modules from './modules' Vue.use(Vuex) const store = new Vuex.Store({ modules, strict: process.env.NODE_ENV !== 'production' }) //    `init`     for (const moduleName of Object.keys(modules)) { if (modules[moduleName].actions.init) {   store.dispatch(`${moduleName}/init`) } } export default store 
Vue dan Vuex diimpor di sini, karena kita tidak dapat melakukannya tanpa mereka. Selain itu, kami mengimpor modul dari 
/modules/index.js . Selanjutnya, kami menginisialisasi penyimpanan dan loop melalui semua modul. Jika modul memiliki aksi 
init , kami menginisialisasi modul. Ini ternyata sangat berguna untuk modul-modul yang perlu diinisialisasi ketika aplikasi dimulai. Akibatnya, tentu saja, kami mengekspor 
store , setelah itu, biasanya, diimpor ke file 
main.js dan ditambahkan ke instance Vue.
Sekarang saatnya untuk bekerja dengan file 
index.js , yang terletak di folder 
/store/modules .
 //    Vuex     ,    . import camelCase from 'lodash/camelCase'; //    const requireModule = require.context( //      '.', //     true, //   index.js,    ,    //   'actions', 'mutations',  'getters' . //  ,      .js /^(?!.*(actions|mutations|getters|index)).*\.js$/ ); const modules = {}; requireModule.keys().forEach(fileName => { //     if (/\.unit\.js$/.test(fileName)) return; //            modules[camelCase(fileName.split('/')[1].replace(/(\.\/|\.js)/g, ''))] = {   namespaced: true,   ...requireModule(fileName).default }; }); export default modules; 
Dalam kode ini, pertama-tama kita mengimpor fungsi camelCase dari Lodash. Kemudian kami menggunakan metode 
require.context untuk menghubungkan modul. Sebagai parameter ketiga, kami memberikan ekspresi reguler yang akan memfilter file 
index.js , serta file yang namanya berisi 
actions baris, 
mutations , dan 
getters . Mereka akan diimpor ke file status, misalnya, di 
auth.js , dan kemudian diekspor. Sebagai contoh, berikut adalah bagaimana file 
auth.js dari folder 
src/store/modules/auth/ terlihat seperti pada awal pekerjaan:
 import actions from './actions'; import mutations from './mutations'; import getters from './getters'; const state = {   user: null }; export default {   state,   mutations,   getters,   actions }; 
Sekarang tinggal memeriksa semua modul dan membentuk satu objek dengan semuanya. Di sini Anda perlu mengecualikan semua file atas nama yang ada 
unit garis, karena mereka diperlukan hanya untuk pengujian, dan bukan untuk pengembangan atau untuk menyebarkan proyek dalam produksi. Setelah itu, kami menambahkan properti baru ke objek 
modules , yang akan memiliki nama file status, misalnya, 
auth atau 
users . Selain itu, kami menggunakan fungsi 
camelCase untuk membuat nama properti terlihat konsisten. Kemudian kita mengisi objek 
modules , 
requireModule melalui 
requireModule dan menggunakan 
...requireModule(fileName).default , dan kemudian mengekspor 
modules .
Sebagai soal fakta, ini adalah bagaimana sebuah proyek dapat disusun di mana negara, pengambil, tindakan dan mutasi disimpan secara terpisah dan diatur dengan mudah. Sekarang mari kita bicara tentang cara menulis skrip untuk secara otomatis membuat modul Vuex.
Script untuk membuat modul Vuex secara otomatis
Buat folder baru di folder proyek dengan 
scripts nama, di dalamnya buat file 
generateVuexModule.js . Untuk proyek ini kita akan memerlukan Node.js, oleh karena itu, jika Anda belum menginstal platform ini, sekarang saatnya untuk 
memperbaikinya . Skrip kami hanya memiliki satu ketergantungan - paket 
chalk , yang digunakan untuk merancang materi yang ditampilkan di konsol. Anda dapat menginstal paket ini dengan 
npm install -save-dev chalk .
▍Langkah 1
Dalam file 
generateVuexModule.js , Anda perlu menghubungkan tiga modul: 
fs , 
path dan 
chalk . Juga di sini Anda memerlukan konstanta dengan path ke folder modules ( 
src/store/modules ) dan konstanta - 
args , yang akan membuat argumen diteruskan ke skrip ketika dijalankan.
 const fs = require('fs'); const path = require('path'); const chalk = require('chalk'); const modulesPath = 'src/store/modules'; const args = process.argv.slice(2); const error = (...args) => { console.log(chalk.red(...args)); }; const success = (...args) => { console.log(chalk.green(...args)); }; if (!args.length) { error('You must provide a name for the module!'); return; } 
Seperti yang Anda lihat, kami menulis semua argumen ke 
args kecuali dua argumen pertama, karena argumen tersebut mewakili path ke 
node.exe dan file skrip, dan kami tidak memerlukan informasi ini. Kami hanya tertarik pada parameter ketiga - nama modul baru. Selain itu, ada beberapa fungsi, 
error dan 
success , yang menggunakan paket 
chalk disebutkan di atas untuk menampilkan pesan dengan teks dengan warna berbeda.
Di sini Anda perlu memeriksa panjang array 
args untuk mengetahui apakah nama modul diteruskan ke skrip kami, dan jika tidak, berikan pesan kesalahan. Oleh karena itu, jika Anda mencoba menjalankan skrip ini menggunakan perintah 
node generateVuexModule.js , tanpa meneruskannya, Anda akan melihat pesan kesalahan di terminal.
▍Langkah 2
Pada titik ini, kita memiliki nama untuk module dan path yang diberikan oleh konstanta 
modulesPath . Namun, kami masih harus bekerja dengan data ini. Yaitu, ekstrak nama dari array 
args dan kumpulkan path lengkap ke modul, belum lagi pembentukan isinya.
 const moduleName = args[0]; const modulePath = path.join(__dirname, '../', modulesPath, moduleName); if (fs.existsSync(modulePath)) { error(`${moduleName} directory already exists!`); return; } const stateContent = `import getters from './getters'; import actions from './actions'; import mutations from './mutations'; const state = {}; export default { state, getters, actions, mutations }; `; const exportFileContent = `import * as types from '@/store/types'; export default { }; `; 
Nama modul akan berada di elemen array 
args dengan indeks 0. Pada tahap program ini, kita dapat mengandalkan keberadaan elemen ini, seperti yang sebelumnya kita coba untuk mengekstraknya dari 
process.argv , dan kemudian memeriksa panjang array 
args . Selain itu, kami menyiapkan path lengkap menggunakan modul 
path dan metode 
join . Kami mendapat direktori saat ini menggunakan 
__dirname construct, naik satu tingkat ke atas, karena file 
generateVuexModule.js terletak di folder proyek 
scripts . Kemudian kita tambahkan saja hasilnya, isi dari 
modulesPath dan nama module. Pada titik ini, konstanta 
modulePath harus berisi sesuatu seperti 
pathToYourProject/project/src/store/modules/moduleName . Di sinilah modul akan dibuat. Sekarang, karena kita memiliki path lengkap, kita dapat memeriksa apakah direktori ini ada. Kami tidak ingin secara tidak sengaja menimpa file dari modul yang ada. Akibatnya, jika direktori tempat Anda berencana membuat modul baru ada, kami akan menampilkan pesan kesalahan dalam huruf merah, berkat 
chalk .
Contoh pesan kesalahanSelanjutnya, Anda perlu membuat konstanta di mana akan ada data untuk file. Seperti yang dapat Anda bayangkan, 
stateContent digunakan untuk file state, yaitu, misalnya, untuk 
auth.js , dan 
exportFileContent digunakan untuk 
getters.js , 
getters.js , dan 
mutations.js . Jika perlu, Anda dapat menambahkan ke daftar ini semua yang diperlukan dalam proyek Anda.
▍Langkah 3
Sekarang kita hanya perlu membuat path untuk file modul dan membuatnya.
 const statePath = `${path.join(modulePath, `${moduleName}.js`)}` const gettersPath = `${path.join(modulePath, 'getters.js')}` const actionsPath = `${path.join(modulePath, 'actions.js')}` const mutationsPath = `${path.join(modulePath, 'mutations.js')}` fs.mkdirSync(modulePath); fs.appendFileSync(statePath, stateContent); fs.appendFileSync(gettersPath, exportFileContent); fs.appendFileSync(actionsPath, exportFileContent); fs.appendFileSync(mutationsPath, exportFileContent); success('Module', moduleName, 'generated!'); 
Pertama kita mendeklarasikan empat konstanta, yang masing-masing berisi path untuk file yang sesuai. Selanjutnya, kita perlu membuat folder untuk modul. Kami sudah memeriksa apakah folder tersebut ada dan memberikan kesalahan jika memang demikian. Karena itu, seharusnya tidak ada masalah dengan membuat folder. Dan akhirnya, kita menggunakan 
fs.appendFileSync , menempatkan file baru dengan konten yang ditentukan dalam proses pembuatannya di direktori yang baru dibuat. Pada akhirnya, skrip menampilkan pesan tentang keberhasilan penyelesaian operasi.
Untuk menggunakan skrip ini, cukup buka folder 
scripts proyek Anda di terminal dan jalankan perintah dari 
node generateVuexModule.js yourModuleName formulir 
node generateVuexModule.js yourModuleName . Setelah berhasil menyelesaikan skrip, Anda akan melihat pesan tentang membuat modul.
Ringkasan
Setelah meninjau materi ini, Anda belajar tentang templat untuk menyusun proyek-proyek besar di mana Anda berencana untuk menggunakan Vuex, dan skrip yang menyederhanakan pembuatan modul Vuex. Kami harap pengetahuan ini bermanfaat bagi Anda. Kode proyek, contoh-contoh yang kami periksa, dapat ditemukan di 
sini .
Pembaca yang budiman! Bagaimana Anda menyusun aplikasi Vue besar yang menggunakan Vuex?
