• micro-app 研究-提前准备


    官方教程地址

    https://github.com/micro-zoe/micro-app/issues/19

    一. webComponent - customElements

    创建的自定义元素,因为它不仅提供一个元素容器,还自带了生命周期函数,我们可以在这些钩子函数中进行加载渲染等操作,从而简化步骤。

    // /src/element.js
    
    // 自定义元素
    class MyElement extends HTMLElement {
      // 声明需要监听的属性名,只有这些属性变化时才会触发attributeChangedCallback
      static get observedAttributes () {
        return ['name', 'url']
      }
    
      constructor() {
        super();
      }
    
      connectedCallback() {
        // 元素被插入到DOM时执行,此时去加载子应用的静态资源并渲染
        console.log('micro-app is connected')
      }
    
      disconnectedCallback () {
        // 元素从DOM中删除时执行,此时进行一些卸载操作
        console.log('micro-app has disconnected')
      }
    
      attributeChangedCallback (attr, oldVal, newVal) {
        // 元素属性发生变化时执行,可以获取name、url等属性的值
        console.log(`attribute ${attrName}: ${newVal}`)
      }
    }
    
    /**
     * 注册元素
     * 注册后,就可以像普通元素一样使用micro-app,当micro-app元素被插入或删除DOM时即可触发相应的生命周期函数。
     */
    window.customElements.define('micro-app', MyElement)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    二. shadowDom

    http://t.csdn.cn/fD6xk

    三.Proxy 代理

    1.基本定义

    • Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。
    • Proxy可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

    2.基本用法

    const handler = {
        get: function(obj, prop) {
            return prop in obj ? obj[prop] : 37;
        }
    };
    
    const p = new Proxy({}, handler);
    p.a = 1;
    p.b = undefined;
    
    console.log(p.a, p.b);      // 1, undefined
    console.log('c' in p, p.c); // false, 37
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3. 一个完整的 traps 列表示例

    /*
      var docCookies = ... get the "docCookies" object here:
      https://developer.mozilla.org/zh-CN/docs/DOM/document.cookie#A_little_framework.3A_a_complete_cookies_reader.2Fwriter_with_full_unicode_support
    */
    
    var docCookies = new Proxy(docCookies, {
      "get": function (oTarget, sKey) {
        return oTarget[sKey] || oTarget.getItem(sKey) || undefined;
      },
      "set": function (oTarget, sKey, vValue) {
        if (sKey in oTarget) { return false; }
        return oTarget.setItem(sKey, vValue);
      },
      "deleteProperty": function (oTarget, sKey) {
        if (sKey in oTarget) { return false; }
        return oTarget.removeItem(sKey);
      },
      "enumerate": function (oTarget, sKey) {
        return oTarget.keys();
      },
      "ownKeys": function (oTarget, sKey) {
        return oTarget.keys();
      },
      "has": function (oTarget, sKey) {
        return sKey in oTarget || oTarget.hasItem(sKey);
      },
      "defineProperty": function (oTarget, sKey, oDesc) {
        if (oDesc && "value" in oDesc) { oTarget.setItem(sKey, oDesc.value); }
        return oTarget;
      },
      "getOwnPropertyDescriptor": function (oTarget, sKey) {
        var vValue = oTarget.getItem(sKey);
        return vValue ? {
          "value": vValue,
          "writable": true,
          "enumerable": true,
          "configurable": false
        } : undefined;
      },
    });
    
    /* Cookies 测试 */
    
    alert(docCookies.my_cookie1 = "First value");
    alert(docCookies.getItem("my_cookie1"));
    
    docCookies.setItem("my_cookie1", "Changed value");
    alert(docCookies.my_cookie1);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    四.正则表达式

    http://t.csdn.cn/lxpQ0

    五.观察者模式

    观察者模式定义了观察者和被观察者的一对多的依赖关系,它们之间存在直接的联系;当被观察者发布通知时,所有依赖于它的观察者都将得到通知。

    
    ╭─────────────╮  Fire Event  ╭──────────────╮
    │             │─────────────>│              │
    │   Subject   │              │   Observer   │
    │             │<─────────────│              │
    ╰─────────────╯  Subscribe   ╰──────────────╯
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    class Subject {
        constructor() {
            this.observers = [];
        }
     
        add(observer) {
            this.observers.push(observer);
        }
     
        notify(...args) {
            this.observers.forEach(observer => observer.update(...args));
        }
    }
     
    class Observer {
        update(...args) {
            console.log(...args);
        }
    }
     
    // 创建观察者ob1
    let ob1 = new Observer();
    // 创建观察者ob2
    let ob2 = new Observer();
    // 创建目标sub
    let sub = new Subject();
    // 目标sub添加观察者ob1 (目标和观察者建立了依赖关系)
    sub.add(ob1);
    // 目标sub添加观察者ob2
    sub.add(ob2);
    // 目标sub触发SMS事件(目标主动通知观察者)
    sub.notify('I fired `SMS` event');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    六.发布订阅模式

    发布订阅模式中,发布者发布消息时不会将消息直接发送给订阅者,发布者和订阅者之间不存在直接的联系;在发布者和订阅者之间存在第三方平台,称为消息代理或调度中心或中间件,它维持着发布者和订阅者之间的联系,可以处理所有发布者发布的消息并将它们分发给对应的订阅者,实现了发布者与订阅者之间的解耦。

    ╭─────────────╮                 ╭───────────────╮   Fire Event   ╭──────────────╮
    │             │  Publish Event  │               │───────────────>│              │
    │  Publisher  │────────────────>│ Event Channel │                │  Subscriber  │
    │             │                 │               │<───────────────│              │
    ╰─────────────╯                 ╰───────────────╯    Subscribe   ╰──────────────╯
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    class PubSub {
        constructor() {
            this.subscribers = [];
        }
         
        subscribe(topic, callback) {
            let callbacks = this.subscribers[topic];
            if (!callbacks) {
                this.subscribers[topic] = [callback];
            } else {
                callbacks.push(callback);
            }
        }
         
        publish(topic, ...args) {
            let callbacks = this.subscribers[topic] || [];
            callbacks.forEach(callback => callback(...args));
        }
    }
     
    // 创建事件调度中心,为订阅者和发布者提供调度服务
    let pubSub = new PubSub();
    // A订阅了SMS事件(A只关注SMS本身,而不关心谁发布这个事件)
    pubSub.subscribe('SMS', console.log);
    // B订阅了SMS事件
    pubSub.subscribe('SMS', console.log);
    // C发布了SMS事件(C只关注SMS本身,不关心谁订阅了这个事件)
    pubSub.publish('SMS', 'I published `SMS` event');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    七.观察者模式 和 发布订阅模式的差异

    • 观察者模式中,观察者是知道Subject的,Subject一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过消息代理进行通信。
    • 发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。
    • 观察者模式大多数时候是同步的,比如当事件触发,Subject就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)。
    • 观察者 模式需要在单个应用程序地址空间中实现,而发布-订阅更像交叉应用模式。

    尽管它们之间有区别,但有些人可能会说发布-订阅模式是观察者模式的变异,因为它们概念上是相似的。

    八.setAttribute

    增加一个指定名称和治的新属性,或者把一个现有属性设定为指定的值
    elementNode.setAttribute(name,value)

    注意:

    把指定的属性设置为指定的值。如果不存在具有指定名称的属性,该方法将创建一个新属性。

    九.eval(‘this’)和(0,eval)(‘this’)的区别是

    1.在ecma规范中,eval存在直接调用和间接调用两种方式,而直接调用时上下文为当前执行环境,间接调用时上下文为全局环境

    2.直接调用eval时,为直接调用,而使用表达式计算得到的eval是间接调用

    这样就很明了了,eval(‘this’)和(0,eval)(‘this’)的区别是,一个是在当前执行环境下,一个是在全局执行环境下,后面的调用方式才可百分百确定指向的是全局宿主对象

  • 相关阅读:
    机械臂B样条插补+带源代码
    【算法面试】数据结构算法面试指南
    【FME实战教程】003:FME读取地理空间数据(矢量、栅格、点云、三维模型、数据库、地理服务)大全
    零基础学Java(1)初识Java程序
    Django之主键外键详解
    由电阻电容采购引发的思考
    README
    LinkList集合方法(自写)
    JavaScript-变量类型
    【技巧】Word和Excel如何互相转换?
  • 原文地址:https://blog.csdn.net/weixin_43856422/article/details/127440966