编排微额定和包装器应用程序之间的通信。
#javascript #网络开发人员 #angular #microfrontend

在本文中,我们将讨论如何开发一种自定义解决方案,用于微额线和包装器应用程序之间的通信。写在读者意识到微注定体系结构的基础上的假设之下。微注定使您的应用程序更易于管理和可扩展,并可以自由在您想要的特定前端功能的任何技术上工作。

在开发过程中,我们遇到的一个主要问题是如何在微额定和包装器应用程序之间更加无缝的沟通。每当访问包装器应用程序的外菜单时,我们的主要目标是从前端元素中调用特定方法。由于微注射是一个独立的应用程序,因此它与包装器应用没有关系,只是充当容器

我们在网上发现的大多数解决方案都非常复杂或涉及外部第三方应用程序。从本文中,我们的建筑师提出了自定义解决方案,该解决方案非常简单易于实现。

我们开发的解决方案涉及消息总线和自定义导航管理器。(两个文件下面添加)

消息总线
消息总线只是一个包含4个函数和全局变量topicsUbscriptions的JS文件(这是一个空对象)。消息总额遵循Singleton模式来控制实例创建。

订阅:
该函数首先检查主题是否已经具有订阅列表,通过查找“ topicsUbscript”中的“主题名”键。如果键存在,则该函数将新订阅功能(“ FUNC”)推向现有列表。如果键不存在,则该函数将在“ TopicSubScript”中创建一个新的键值对,并将“ topicname”作为键和包含新订阅函数作为值的键和数组。

换句话说,此功能是消息系统的一部分,该系统允许程序的不同部分在更新这些主题时订阅某些主题并接收消息。 “订阅”功能负责将新订阅添加到系统中。

undubscrbe
该函数首先检查主题是否具有订阅列表,通过查找“ topicsUbscript”对象中的“主题名”键。如果键存在,则该功能会检索该主题的订阅列表,并将其分配给称为“订阅”的变量。如果“订阅”变量具有真实的值(这意味着它不是零或未定义),则该函数使用array.filter()方法从订阅列表中删除“ func”订阅。

发布
该函数首先检查主题是否有任何订户,通过查找“ topicsUbscript”对象中的“ topicname”键。如果键存在,则在“订阅”数组中的每个订阅函数上迭代函数并调用它。

hassubscriptions
此功能可用于检查一个主题在向该主题发布消息之前是否有任何订户。

导航经理
创建一个实例对象messagebus类。
它具有一个无线电函数,可以检查使用“ bus”对象的“ hassubscript”方法的“ outer_navigation_requested”主题的任何订户。如果没有订户,该方法只需使用“ window.location.href”属性将用户重定向到新页面。
如果有“ outer_navigation_requested”主题的订户,该方法将使用“总线”对象的“发布”方法发布到“总线”消息系统的消息。

MicroFrontend对MessageBus文件有一个引用,并且在用户请求外部NVAIGATION时必须调用的函数名称,它订阅了euttry_navigation_requested主题的Elment初始化。

,必须调用。

包装器应用程序既有对MessageBus和Navigation Manager文件的引用。

var messageBus = function () {

    //Wrapping the actual bus here to control the instance creation
    var bus = function () {
        var
            topicSubscriptions = {},

            subscribe = function (topicName, func) {

                if (topicSubscriptions[topicName]) {
                    topicSubscriptions[topicName].push(func);
                } else {
                    topicSubscriptions[topicName] = [func];
                }

            },

            unsubscribe = function (topicName, func) {
                var subscriptions = topicSubscriptions[topicName];
                if (subscriptions) {
                    topicSubscriptions[topicName] =
                        topicSubscriptions[topicName]
                            .filter((subscriber) => subscriber !== func);
                }
            },

            publish = function (topicName, message) {
                var subscriptions = topicSubscriptions[topicName];
                if (subscriptions) {
                    subscriptions.forEach((func) => {
                        func(message);
                    });
                } else {
                    console.log("No subscriptions for topic: "+ topicName);
                }
            },

            hasSubscriptions = function (topicName) {
                return topicSubscriptions[topicName] ? true : false;
            };

        return {

            subscribe: subscribe,
            unsubscribe: unsubscribe,
            publish: publish,
            hasSubscriptions: hasSubscriptions

        };
    };

    return {
        //Returns singleton instance
        getInstance: function () {

            if (!window.messageBusInstance) {
                window.messageBusInstance = bus();                
            }

            return window.messageBusInstance;
        }
    }
}();

MessageBus.js

var navigationManager = function () {

    var
        bus = messageBus.getInstance(),

        registerEvents = function () {

            $(".outer-menu").on('click', function(e) {
                e.preventDefault();
                events.onNavigation(this);

            });

        },

        events = {
            onNavigation: (self) => {

                var $this = $(self);
                var navPath = $this.attr("href");

                if (!bus.hasSubscriptions("OUTER_NAVIGATION_REQUESTED")) {

                    window.location.href = navPath;
                } else {

                    bus.publish("OUTER_NAVIGATION_REQUESTED", { url: navPa      th });
                }
            }
        },

        init = function () {
            registerEvents();
        };

    return {
        init: init
    };

}();

$(document).ready(function () {

    navigationManager.init();
});

navigationmanager.js