Как сделать автоматичекую загрузку модулей Vuex
В проекте использую Vue + Vuex. Накопилось много vuex-модулей. Сейчас они все подключабются так:
import { module_1 } from 'Store/modules/module_1';
import { module_2 } from 'Store/modules/module_2';
...
import { module_n } from 'Store/modules/module_n';
Именование модулей и директорий в snake_case.
Как можно это упростить или сделать эту загрузку автоматической?
Ответы (1 шт):
Автор решения: Не быть рабом на Руси
→ Ссылка
Для того, чтобы оптимизировать загрузку модулей необходимо:
- Определиться со структурой
- Собирать проект с помощью Webpack
- Воспользоваться функцие webpack -
require.context()
Код на JS(Store/index.js):
import Vue from 'vue';
import Vuex from 'vuex';
const modules = {};
const context = require.context('Store/modules', true, /index\.js$/i);
context.keys().map(path => {
const find = /(?<module_name>\w+)\/index\.js/.exec(path);
const module_name = find?.groups?.module_name;
const module = context(path);
modules[module_name] = module[module_name];
});
Vue.use(Vuex);
const store = {
modules,
};
export default new Vuex.Store(store);
Код на TS(Store/index.ts):
/**
* Types
*/
import Vuex, { Module, StoreOptions } from 'vuex';
import { RootState } from './types';
/**
* Vue
*/
import Vue from 'vue';
interface RootState {}
type ModuleProperty = { [key: string]: Module<object, RootState> };
const modules: ModuleProperty = {};
const context = require.context('Store/modules', true, /index\.ts$/i);
context.keys().map(path => {
const find = /(?<module_name>\w+)\/index\.ts/.exec(path);
const module_name: string = find?.groups?.module_name!;
const module = context(path);
modules[module_name] = module[module_name];
});
Vue.use(Vuex);
const store: StoreOptions<RootState> = {
modules,
};
export default new Vuex.Store<RootState>(store);
- Воспользуемся структурой указаной в вопросе. Структура имеет вид
./store/modules/{имя_модуля}/index.js(имя директории и модуля вsnake_case) или любая другая вложенность. Например:./store/modules/{директория}/{директория}/{имя_модуля}/index.js - В рамках ответа ожидается, что сборка проекта настроена с помощью webpack.
- С помощью функции
require.context()найдём все пути индексным файлам модулей. /(?<module_name>\w+)\/index\.ts/- вытаскиваем имя модуляcontext(path)- экземпляр модуля
Дополнителная информация: