HB's Thoughts

Ако Вселената е отговорът, какъв е въпросът?!

8.10.2025 г.

Динамично зареждане на Vue плъгини в main файл

Илюстративно изображение за Динамично зареждане на Vue плъгини в main файл

Разработвам В2В приложение, което има една входна точка, но се ползва от различни клиенти с различни домейни, различна визии и собствени функционалности. На базата на домейна и още няколко хитрини, разпознавам коя конфигурация да се зареди и така, макар и една, входната точка и всичко след нея е силно персонализирано.

Една от особеностите на Vue е, че плъгините се регистрират глобално и ако имате нужда от различни плъгини в различните конфигурации, ще трябва да зареждате само тези, които са нужни. Това може да стане динамично в main файла.

// main.ts

import Vue from 'vue';

const loadPlugin = (pluginName: string): Promise<void> => {
  return import(`@/plugins/${pluginName}`).then((module) => {
    Vue.use(module.default);
  });
};

// Example usage
if (client === 'MyPressureClient') {
  loadPlugin('my-pressure-client-plugin');
} else {
  loadPlugin('my-regular-client-plugin');
}

// ...

В този пример функцията loadPlugin приема име на плъгин като аргумент и динамично импортира съответния модул на плъгина.

До тук добре, но когато имате над 50 плъгина и даден клиент използва около 10 от тях, то схемата с започва да тежи и да изчезва паралелизъма на зареждане.

За да се справя с това, създавам един обект, който съдържа масив от плъгини за всеки клиент и зареждам всички наведнъж с Promise.all.

const plugins = clientConfig.plugins || {};
const pluginLoaders: Promise<{ name: string; plugin: any }>[] = [];

if (plugins?.plugin-one) {
  pluginLoaders.push(import('@/plugins/plugin-one').then((m) => ({ name: 'PluginOne', plugin: m.default })));
}
if (plugins?.plugin-two) {
  pluginLoaders.push(import('@/plugins/plugin-two').then((m) => ({ name: 'PluginTwo', plugin: m.default })));
}
if (plugins?.plugin-three) {
  pluginLoaders.push(import('@/plugins/plugin-three').then((m) => ({ name: 'PluginThree', plugin: m.default })));
}

// ... още плъгини, които клиента ползва, ако има такива

// Зареждате всички плъгини паралелно (50-70% по-бързо от последователното)
const loadedPlugins = await Promise.all(pluginLoaders);

// Регистрирайте плъгините по ред
loadedPlugins.forEach(({ name, plugin }) => {
  app.use(plugin);
});

Елегантно и ефективно. DX на MAX )



Компетентност:Маниак
Тагове:VueПлъгин

🖖Live long and prosper