code: function serializeDom(dom, opts) {
      if (!Array.isArray(dom)) {
          dom = [dom];
      }
  
      opts = opts || {};
  
      let output = '';
      for (let i = 0, len = dom.length; i < len; i++) {
          let elem = dom[i];
          if (elem.removed) { // ignore removed node
              continue;
          }
  
          if (elem.type === 'root') {
              output += serializeDom(elem.children, opts);
          }
          else if (ElementType.isTag(elem)) {
              output += serializeTag(elem, opts);
          }
          else if (elem.type === ElementType.Directive) {
              output += serializeDirective(elem);
          }
          else if (elem.type === ElementType.Comment) {
              output += serializeComment(elem);
          }
          else if (elem.type === ElementType.CDATA) {
              output += serializeCDATA(elem);
          }
          else {
              output += serializeText(elem, opts);
          }
      }
  
      return output;
  }
docs: Serialize dom
  
  @param {Object|Array} dom the dom to serialize
  @param {Object} opts the serialize options
  @param {boolean=} opts.xmlMode whether serialize using xml mode, optional, by defaul false
  @param {boolean=} opts.decodeEntities whether the given dom entities are decoded, optional, by default false
  @return {string}