小程序开发策略:架构|View – WXML、View – WXSS、View – Component
小程序架构
微信小程序的框架由两部分组成:View视图层和App Service逻辑层。 View层用于渲染页面结构,AppService层用于逻辑处理、数据请求、接口调用。
它们进入两根线。
它们进入两根线。
它们进入两根线。
显示层和逻辑层通过JSBridage与系统层通信。逻辑层将数据变化通知显示层,触发显示层页面更新。显示层将触发的事件通知给业务处理逻辑层。
补充
视图层使用WebView进行渲染,iOS使用内置的WKWebView,Android使用腾讯的x5核心(基于Blink)运行。
逻辑层在iOS中使用嵌入式JSCore运行,在Android中使用腾讯的x5核心(基于Blink)。
开发工具使用nw.js为显示层和逻辑层提供运行环境。
Mac 上使用 js-beautify 批量格式化微信开发工具@v1.02.1808080 代码:
cd /Applications/wechatwebdevtools.app/Contents/Resources/package.nw
find . -type f -name '*.js' -not -path "./node_modules/*" -not -path -exec js-beautify -r -s 2 -p -f '{}' \;
复制代码
发现于js/extensions/appservice/index.js❓ 发现于 js /扩展/ gamenaiveview /index.js
发现于:
299: function(a, b, c) {
'use strict';
Object.defineProperty(b, '__esModule', {
value: !0
});
var d = c(242),
e = c(241),
f = c(243),
g = c(244);
window.WeixinJSBridge = {
on: d.a,
invoke: e.a,
publish: f.a,
subscribe: g.a
}
},
复制代码
发现于 以 简单分析一下就知道:Field 我们不能在代码中使用BOM和DOM,因为它们不存在。另一方面,我们不希望 JS 代码直接为视图提供服务。 在开发工具 这样的分层设计显然是有意为之的,而且其正在执行的中间层也可以通过程序的接口完全监控到。与正在传输的数据和响应时间相同的时间。一方面,程序的行为受到严格限制,另一方面,微信可以确保他们对小程序的内容和体验拥有绝对的控制权。 这样的结构也说明了小程序的动画和绘图API被设计为生成最终的对象而不是一步步执行它。原因是,与原生 API 相比,Json 格式的数据传输和解析成本较高。 ,如果频繁调用,很可能会消耗过多的性能,从而影响用户体验。 1.动画必须与数据绑定,但绘图则不然。你认为这是为什么? ?从功能上来说,它就是Webkit自带的 WXML(微信标记语言) Wxml -编译器:Wcc 将 Wxml 文件转换为 JS 执行方法:Wcc index.wxml 使用 Virtual DOM 进行部分更新 wxss-编译器:wcsc 转换 wxss- js文件 执行方式:wcsc index.wxss 个人测试包括但❝不限于以下: 动画 建议您尝试Css3的所有功能。 rpx(响应像素):可根据屏幕宽度进行调整。指定的屏幕宽度为750rpx。公式: 使用 静态样式在类中均匀编写。 style 接收动态样式并在运行时解析它们。 style中尽量避免写静态样式,以免影响渲染速度。 app.wxss中定义的样式是全局样式,适用于每个页面。页面的wxss文件中定义的样式是本地样式,仅适用于相应的页面,并且会覆盖app.wxss中相同的选择器。 截至20180810 小程序计划未来支持字体。参见微信公开课。 小程序开发与常规网页开发类似。也可以使用字体图标,但是 将 ttf 文件转换为 base64。打开这个平台transfonter.org/。单击“添加字体”按钮以加载 ttf 格式的文件。将下面的base64代码更改为on。点击转换按钮进行转换,转换后点击下载。 将下载的压缩文件中stylesheet.css的内容复制到font.wxss中,并将icomoon中style.css中除@font-face之外的所有代码复制到font.wxss中,并将i选择器替换为. iconfont,最后: 该小程序包含许多用于开发业务功能的组件。按功能与 HTML5 标签的对比如下: 小程序的组件基于 Web Component 标准 使用 Polymer 框架实现 Web Component 目前Native实现的是 原生组件层在上面的WebView层。目前这会导致一些问题: js/extensions/pageframe/index.js❓ 我们♿ 大家都看过 WeixinJSBridge 的定义。有
on
、调用
、发布❿❿
这里有一些重要的方法。invoke
为例,此代码位于js/extensions/appservice/index.js❓中
js/extensions/pageframe/index 。这段代码可以在JS段中找到:
g[d] = c, e.a.send({
command: 'WEBVIEW_INVOKE',
data: {
api: a,
args: b,
callbackID: d
}
})
复制代码
Command
用于分隔行,用于调用。不同的来源使用不同的前缀。
data
包含 API 名称和参数。另外,callbackID
指定接受回调的方法句柄。 Appservice和Webview使用的通信协议是一致的。 remote-helper.js
中找到了这段代码:const vm = require("vm");
const vmGlobal = {
require: undefined,
eval: undefined,
process: undefined,
setTimeout(...args) {
//...省略代码
return timerCount;
},
clearTimeout(id) {
const timer = timers[id];
if (timer) {
clearTimeout(timer);
delete timers[id];
}
},
setInterval(...args) {
//...省略代码
return timerCount;
},
clearInterval(id) {
const timer = timers[id];
if (timer) {
clearInterval(timer);
delete timers[id];
}
},
console: (() => {
//...省略代码
return consoleClone;
})()
};
const jsVm = vm.createContext(vmGlobal);
// 省略大量代码...
function loadCode(filePath, sourceURL, content) {
let ret;
try {
const script = typeof content === 'string' ? content : fs.readFileSync(filePath, 'utf-8').toString();
ret = vm.runInContext(script, jsVm, {
filename: sourceURL,
});
}
catch (e) {
// something went wrong in user code
console.error(e);
}
return ret;
}
复制代码
下载小程序完整包
应用服务-生命周期
面试题
Promise
View - WXML
查看 - WXSS-Shen (WXSS)
支持大部分CSS功能
尺寸单位rpx
const dsWidth = 750
export const screenHeightOfRpx = function () {
return 750 / env.screenWidth * env.screenHeight
}
export const rpxToPx = function (rpx) {
return env.screenWidth / 750 * rpx
}
export const pxToRpx = function (px) {
return 750 / env.screenWidth * px
}
复制代码
设备 rpx 转换为 px(屏幕宽度/750) px 转换为 rpx(750/屏幕宽度) iPhone5x❝p 1px = 2.34rpx iPhone6 1rpx = 0.5px 1px = 2rpx iPhone6 Plus xpx2 = rpx2 = rpx2 1.81rpx 您可以了解pr2rpx 加载器库。 样式导入
@import
语句导入外部样式表,♿@import 后跟要导入的相对❝样式表,使用 ;
表示句子的结束。 内联样式
全局样式和局部样式
iconfont
src:url()
无论本地还是远程地址都不起作用,并且可以显示base64值。 <text class="iconfont icon-home" style="font-size:50px;color:red"></text>
复制代码
视图 - 组件
View - Native Component
cover-view
可以覆盖cavnas视频等,但也有缺点。比如你在cavnas上覆盖cover-view
,你会发现坐标系不一样。顺利处理问题。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。