前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
  • React专栏

    • React组合式开发实战

      • 前端开发的四个时代
      • 企业管理系统的前世今生
      • 可视化页面搭建工具
      • 实战篇 01:开发前准备
      • 实战篇 02:项目脚手架
      • 实战篇 03:页面布局方案
      • 实战篇 04:权限管理机制
      • 实战篇 05:菜单匹配逻辑
      • 实战篇 06:消息通知设计
      • 实战篇 07:多语言支持
      • 继往开来:可视化页面搭建工具
    • React Hooks与Immutable实战

    • React SSR服务端渲染与同构实践

    • IM聊天系统前端开发实践

    • 微前端开发实战

    • React进阶实践

  • Vue专栏

  • 移动端专栏

  • Node专栏

  • 前端工程化专栏

  • 算法专栏

  • Typescript专栏

  • 其他专栏

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

# 前言

前一章节我们看到了WXSS文件编译后的源码,没有错WXML文件业务要进行编译步骤,这一章节就带大家一步一步刨析WXML编译后的源码。

# WXML

第一步,跟WXSS章节一样,去寻找用于编译WXML文件的可以执行文件WCC。

在微信开发者工具控制台中,执行openVender()。

image.png

可以看到就在WXCS上边就是WCC可执行文件。我们还是一样的操作。把WCC可执行文件拷贝到pages/logs目录下面,如下图所示。

image.png

WCC可执行文件的具体使用命令可以通过--help查看到。

image.png

执行命令$ ./wcc -d logs.wxml >> wxml.js

image.png

可以看到pages/logs目录下多了一个wxml.js文件,这个就是编译之后的js文件,我们来看一下里面的具体结构。

image.png

这部分代码不像WXSS编译出来的代码可以直接观看,而是进行了压缩混淆。基本上是不可读的。但是我们还是可以一点一点去分析这到底是怎么运行的,我们继续往下看。

可以看出,整体代码结构就是一个函数,函数名称为$gwx。它的作用是生成虚拟dom树,用于渲染真实节点。内部还有一些边界函数。比如有意思的 _n函数里面包含一个提示:

image.png

英文的意思是超出Dom限制,请检查是否有任何错误,DOM数量不可以超过16000个。但是比较之前的版本,这个提示可没有这么友好,它是这个样子的:

image.png

汉译我就不放在这里了哈哈,有兴趣的自己翻译一下,我们继续。

但是这个时候我们只知道$gwx是个函数,但是怎么调用呢?继续去渲染层代码中进行寻找。还是打开渲染层控制台Elements中,control + F 进行寻找即可,首先我们可以看到编译后的函数在渲染层也有一套。如下图:

image.png

可以看到编译后的WXML文件以js的形式插入到了渲染层的<script>标签中。对比WXSS编译后用eval执行还是有区别的。

但是在这个script标签中插入了$gwx函数之后并没有执行这个函数。我们继续查找,看看$gwx函数是在哪里执行的,并且需要传入哪些参数。

image.png

在渲染层继续查找就找到了$gwx函数执行的地方,我们提取出来看一下。

    var decodeName = decodeURI("./pages/index/index.wxml")
    var generateFunc = $gwx(decodeName)
@前端进阶之旅: 代码已经复制到剪贴板

这时候就知道了$gwx函数的参数正是WXML文件的业务路径。如上图是在。这里注意一下,为了后方讲解顺利,我们把WCC执行文件放在了pages/logs目录下,所以我们这里传入$gwx函数的路径是./pages/logs/logs.wxml。

我们在渲染层的控制台中执行一下$gwx函数并传入参数。

image.png

可以看到执行$gwx函数后的返回值generateFunc也是一个函数。我们再次执行这个函数,看一下返回值。

image.png

generateFunc函数的返回值是一颗树状结构,就是该页面wxml对应的js对象形式表示的dom树。

那为什么$gwx函数不直接返回虚拟DOM树呢,而是先返回generateFun?是因为需要注入动态数据。再看一下编译前的WXML文件结构。

image.png

可以看到内部需要动态接受几个变量

  • logs 是一个数组
  • log 是个字符串
  • index 循环索引

generateFunc函数在执行的时候需要动态注入这些数据,我们手动注入一些假数据看一下生成出来的虚拟DOM树与前面没有注入数据的有什么区别。

image.png

fe
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
  • React专栏

    • React组合式开发实战

      • 前端开发的四个时代
      • 企业管理系统的前世今生
      • 可视化页面搭建工具
      • 实战篇 01:开发前准备
      • 实战篇 02:项目脚手架
      • 实战篇 03:页面布局方案
      • 实战篇 04:权限管理机制
      • 实战篇 05:菜单匹配逻辑
      • 实战篇 06:消息通知设计
      • 实战篇 07:多语言支持
      • 继往开来:可视化页面搭建工具
    • React Hooks与Immutable实战

    • React SSR服务端渲染与同构实践

    • IM聊天系统前端开发实践

    • 微前端开发实战

    • React进阶实践

  • Vue专栏

  • 移动端专栏

  • Node专栏

  • 前端工程化专栏

  • 算法专栏

  • Typescript专栏

  • 其他专栏