当前位置: 网站首页>小程序开发>网站制作

衡东网站制作【衡东网站优化】衡东建网站、衡东微信公众号运营、衡东网页设计、衡东微信小程序商城

发表日期: 2021-04-01 11:02:56 浏览次数:107

衡东网站制作【衡东网站优化】衡东建网站、衡东微信公众号运营、衡东网页设计、衡东微信小程序商城

衡东县,隶属于湖南省衡阳市,位于湖南东部偏南,居湘江中游的衡阳盆地与醴攸盆地之间。东连攸县,南与安仁县、衡南县为邻,西部是50公里长、400米宽的湘江与衡山县隔水分界,北与渌口区接壤。该县森林覆盖率达到51%,是“全国造林绿化百佳县”。

有“鱼米之乡”、“皮影戏之乡”、“花鼓戏之乡”、“剪纸之乡”和“印章之乡”之称,是湖南省截止2014年唯一冠名的“土菜名县”。

2015年,根据衡东县乡镇区划调整方案,调整后下辖2乡15镇:踏庄、珍珠2个乡和城关镇成建制合并设立洣水镇。德圳、栗木、莫井3个乡和吴集镇成建制合并设立吴集镇。大桥镇、三樟乡成建制合并设立三樟镇。草市镇、高塘乡成建制合并设立草市镇。

本轮乡镇行政区划调整,衡东县共撤销7个乡级建制,现辖石滩、南湾2个乡,洣水、吴集、三樟、草市、大浦、新塘、霞流、甘溪、杨桥、荣桓、蓬源、石湾、白莲、杨林、高湖15个镇。县人民政府驻洣水镇(原县人民政府驻地)。

2016年末全县常住人口为63.82万人,全县实现地区生产总值261.70亿元,同比增长7.9%。



1.1.2 DOM 元素捕获

最简单的,我们来捕获一个<div>元素,然后生成一个<div>元素。例如开发者写了以下这段模板,我们可以对它们进行捕获:

<div>
  <a>123</a>
  <p>456<span>789</span></p></div>复制代码

捕获后我们或许可以得到这样的一个对象:

thisDiv = {
  dom: {
    type: "dom",
    ele: "div",
    nodeIndex: 0,
    children: [
      {
        type: "dom",
        ele: "a",
        nodeIndex: 1,
        children: [{ type: "text", value: "123" }]
      },
      {
        type: "dom",
        ele: "p",
        nodeIndex: 2,
        children: [
          { type: "text", value: "456" },
          {
            type: "dom",
            ele: "span",
            nodeIndex: 3,
            children: [{ type: "text", value: "789" }]
          }
        ]
      }
    ]
  }};复制代码

这个对象维护我们需要的一些信息,某个 HTML 元素里需要绑定哪些变量(变量更新的时候需要更新该节点内容),以怎样的方式来拼接(是否有逻辑指令,如v-ifv-for等),哪些节点绑定了怎样的事件监听事件(是否匹配一些常用的事件能力支持),所以这里 AST 能做的事情是很多了。

我们最终还是会根据 AST 对象生成真实的页面片段和逻辑,实现过程其实也是将很多的特殊标识(例如元素 ID、属性标记等)打到该元素上,同时配合一些 Javascript 的元素选择方式、事件监听方式等,来将这个元素动态化(支持内容更新、节点更新)而实现最终的页面效果。Vue 会根据 AST 对象生成一段可执行的代码,我们看看这部分的实现:

// 生成一个元素function genElement(el: ASTElement): string {
  // 根据该元素是否有相关的指令、属性语法对象,来进行对应的代码生成
  if (el.staticRoot && !el.staticProcessed) {
    return genStatic(el);
  } else if (el.once && !el.onceProcessed) {
    return genOnce(el);
  } else if (el.for && !el.forProcessed) {
    return genFor(el);
  } else if (el.if && !el.ifProcessed) {
    return genIf(el);
  } else if (el.tag === "template" && !el.slotTarget) {
    return genChildren(el) || "void 0";
  } else if (el.tag === "slot") {
    return genSlot(el);
  } else {
    // component或者element的代码生成
    let code;
    if (el.component) {
      code = genComponent(el.component, el);
    } else {
      const data = el.plain ? undefined : genData(el);

      const children = el.inlineTemplate ? null : genChildren(el, true);
      code = `_c('${el.tag}'${
        data ? `,${data}` : "" // data
      }${
        children ? `,${children}` : "" // children
      })`;
    }
    // 模块转换
    for (let i = 0; i < transforms.length; i++) {
      code = transforms[i](el, code);
    }
    // 返回最后拼装好的可执行的代码
    return code;
  }}复制代码

1.1.3 模板引擎赋能

原本就是一个<div>,经过 AST 生成一个对象,最终还是生成一个<div>,这是多余的步骤吗?不是的,在这个过程中我们可以实现一些功能:

(1) 排除无效 DOM 元素,并在构建过程可进行报错。

(2) 使用自定义组件的时候,可匹配出来。

(3) 可方便地实现数据绑定、事件绑定等功能。

(4) 为虚拟 DOM Diff 过程打下铺垫。

(5) HTML 转义(预防 XSS 漏洞)。

通过通用的模板引擎,我们能处理掉很多低效又重复的工作,例如浏览器兼容、全局事件的统一管理和维护、模板更新的虚拟 DOM 机制、树状组织管理组件,而留给开发者的事情就可以少之又少。现在我们知道了模板引擎都做了什么事情,就可以区分开 Vue 框架提供的能力和我们需要自行处理的逻辑,可以更专注于业务开发。

我们来看看虚拟 DOM 的机制。

1.2 虚拟 DOM

虚拟 DOM 如今都被作为前端面试基础题库之一了,多多少少面试者都要去了解下,当初 React 就是因为虚拟 DOM 的提出,暂时赢下了浏览器性能之争(尤其在 AngularJS 的脏检查机制对比下)。当然,这都是几年前的事情了,如今几大框架的性能问题,早也不是什么大问题了。

虚拟 DOM 大概可分成三个过程:

(1) 用 JS 对象模拟 DOM 树,得到一棵虚拟 DOM 树。

(2) 当页面数据变更时,生成新的虚拟 DOM 树,比较新旧两棵虚拟 DOM 树的差异。

(3) 把差异应用到真正的 DOM 树上。

1.2.1 用 JS 对象模拟 DOM 树

为什么要用到虚拟 DOM 呢?不知道大家仔细研究过 DOM 节点对象没,一个真正的 DOM 元素非常庞大,拥有很多的属性值。因为一个 DOM 节点它包括了太多太多的属性、元素和事件对象,实际上我们并不是全部都会用到,通常包括节点内容、元素位置、样式、节点的添加删除等方法。所以,我们通过用 JS 对象表示 DOM 元素的方式,可以大大降低了比较差异的计算量。

看一下 Vue 源码,我们会发现 VNode 只有这些属性:

tag: string | void;data: VNodeData | void;children: ?Array<VNode>;text: string | void;elm: Node | void;ns: string | void;context: Component | void; // rendered in this component's scopekey: string | number | void;componentOptions: VNodeComponentOptions | void;componentInstance: Component | void; // component instanceparent: VNode | void; // component placeholder node// strictly internalraw: boolean; // contains raw HTML? (server only)isStatic: boolean; // hoisted static nodeisRootInsert: boolean; // necessary for enter transition checkisComment: boolean; // empty comment placeholder?isCloned: boolean; // is a cloned node?isOnce: boolean; // is a v-once node?asyncFactory: Function | void; // async component factory functionasyncMeta: Object | void;isAsyncPlaceholder: boolean;ssrContext: Object | void;fnContext: Component | void; // real context vm for functional nodesfnOptions: ?ComponentOptions; // for SSR cachingdevtoolsMeta: ?Object; // used to store functional render context fordevtoolsfnScopeId: ?string; // functional scope id support

c51c866ffa1ab3457f2021e8bbdbcc1.jpg

衡东网站制作衡东网站优化衡东建网站、衡东微信公众号运营、衡东网页设计、衡东微信小程序商城

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: http://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878