FRONTEND BLOG

Обычно при создании приложения на Vue у нас есть базовые компоненты, которые используются во многих местах приложения. Чаще всего это кнопки, различные элементы форм и т.д. Импортировать их каждый раз довольно утомительно. Лучше зарегистрировать их глобально, и сделать это так, чтобы потом мы просто делали базовый компонент, а дальше всё происходило само собой без нашего участия.

И сделать это совсем несложно. Информация ниже актуальна для приложения, созданного с помощью VUE-CLI, у которого под капотом используется webpack. Для начала нам нужно принять соглашение, что все базовые компоненты будут у нас начинаться с какого-то префикса. Допустим, _base-. Так у нас будут _base-button.vue, _base-input.vue и т.д. И мы будем глобально их регистрировать как BaseButton, BaseInput. Для автоматизации этого процесса создадим в папке, в которой хранятся компоненты (обычно это папка components) файл _globals.js. Для начала нам нужно найти все файлы, начинающиеся с _base-. И сделаем мы это с помощью доступной в webpack функции require.context():

const requiredComponents = require.context(  // Смотрим только в текущей папке  '.',  // Не смотрим в дочерних папках  false,  // Выбираем только файлы с префиксом _base-  /_base-[\w-]+\.vue$/)

Дальше для каждого найденного файла нам нужно конвертировать название в PascalCalse:

requiredComponents.keys().forEach(name => {  const componentConfig = requiredComponents(name);  const componentName = name    // Убираем "./_" из начала имени файла    .replace(/^\.\/_/, '')    // Убираем расширение файла    .replace(/\.\w+$/, '')    // Разбиваем на части    .split('-')    // Делаем заглавные буквы    .map((kebab) => kebab.charAt(0).toUpperCase() + kebab.slice(1))    // Объединяем всё    .join('')})

И теперь остаётся только зарегистрировать это всё глобально:

Vue.component(componentName, componentConfig.default || componentConfig)});

В итоге файл _globals.js будет выглядеть вот так:

import Vue from Vue;const requiredComponents = require.context(  '.',  false,  /_base-[\w-]+\.vue$/);requiredComponents.keys().forEach(name => {  const componentConfig = requiredComponents(name);  const componentName = name    .replace(/^\.\/_/, '')    .replace(/\.\w+$/, '')    .split('-')    .map((kebab) => kebab.charAt(0).toUpperCase() + kebab.slice(1))    .join('')});Vue.component(componentName, componentConfig.default || componentConfig)});

Ну и для того, чтобы всё полетело, нужно в App.js добавить строчку:

import './components/_globals'

И всё. Теперь в любом месте нашего приложения мы можем спокойно использовать базовые компоненты без необходимости их импортировать. И при создании нового базового компонента нам ничего не нужно делать. Он автоматически станет доступен глобально.