举例有这样一段代码
<div>
<span>1243 5346</span>
</div>
uparse文件执行顺序简单说明
parse.vue插件入口文件 → 调用lib/html2json.js → 返回nodes对象 (这里得到一个html节点解析后的json对象)
↓↑
调用wxDiscode(例:把&nbsp;转成字符),htmlparser
parse.vue把nodes输入到wxParseTemplate0.vue
首先会处理最外层的 div,就变成了
<view>
nodes
<view/>
nodes = '<span>1243 5346</span>'
再把新的nodes再次输入到wxParseTemplate0.vue(小程序是wxParseTemplate1.vue)
这样就得到一个递归调用的模板,直到输出所有节点
wxParseTemplate里面遇到table,img,video,audio,标签时会分别调用自定义组件(更多的可以直接看源码)
import wxParseImg from './wxParseImg';
import wxParseVideo from './wxParseVideo';
import wxParseAudio from './wxParseAudio';
import wxParseTable from './wxParseTable';
下面说说优化了哪些地方.优化的同时也存在些问题.希望大家提出好的解决方案.
0.去掉了标签在递归过程中多出来的标签,解决导致内联元素没有内联的问题
1.table标签很简单目前是用的rich-text
https://uniapp.dcloud.io/component/rich-text
没有找到更好的处理方法,问题是,标签内部的非文字节点,,可能会有问题
2.wxDiscode相对于原版做了一些处理
// 例:
str = str.replace(/ /g, " ");
改为
str = str.replace(/ | | /g, "<span class='spaceshow'> </span>");
3.parse.vue文件的getWidth方法原版获取的是屏幕的宽度,实际上应该获取组件的宽度,该方法获取的宽度主要是用于计算image的图片宽度.(组件可能有边距,边距不应该用于计算图片的宽度).
有兴趣的可以去看看image的处理,,目前是有些问题的,,因为官方的图片插件必须要设置一个宽高覆盖掉默认的宽高,做百分比计算感觉比较复杂.目前我也没什么好的处理方式.
另外还要吐槽一下uni.createSelectorQuery(),之前在处理时,各个小程序的兼容情况好像并不是很好,所以用的条件编译.有报错可以自行处理一下
4.parse.vue文件的setHtml方法
this.nodes = results.nodes;
// 改为
this.nodes = [];
results.nodes.forEach((item) => {
setTimeout(() => {
this.nodes.push(item)
}, 0);
})
这段代码可以异步的加载根节点,,
像这样:
<p>这里是<span>段落</span></p>
<p>这里是<span>段落</span></p>
<p>这里是<span>段落</span></p>
<p>这里是<span>段落</span></p>
<p>这里是<span>段落</span></p>
<p>这里是<span>段落</span></p>
但是如果用div标签包裹起来就不是异步加载了,
像这样
<div>
<p>这里是<span>段落</span></p>
<p>这里是<span>段落</span></p>
<p>这里是<span>段落</span></p>
<p>这里是<span>段落</span></p>
<p>这里是<span>段落</span></p>
<p>这里是<span>段落</span></p>
</div>
目前还没想好如何异步加载所有节点,,有想到如何处理的可以留言或私信我谢谢.之前有尝试,但是性能反降.遂放弃
实际上是分段渲染的结果,让人感觉好像渲染速度加快,,实际上并没快多少
5.parse.vue文件的 navigate方法
原方法是只能获取href的内容,,有人提出需求需要获取onclick的内容,所以增加了attr,
6.对br标签的处理{wxDiscode应该处理"<",">"字符,避免转码后输出br标签,br再转换行的问题,暂时还没改}
<!--br类型-->
<!-- #ifndef H5 -->
<text v-else-if="node.tag == 'br'">\n</text>
<!-- #endif -->
<!-- #ifdef H5 -->
<br v-else-if="node.tag == 'br'">
<!-- #endif -->
7.wxParse.css文件我就不说了但是需要在APP.vue文件中引入,
目前就想到这么多了.
2 个评论
要回复文章请先登录或注册
1***@qq.com
y***@126.com