精华内容
下载资源
问答
  • 程序架构
    万次阅读
    2022-05-21 12:24:43

    实际上,程序通常涉及不只一个文件。除了最简单的脚本之外,程序一般将采用多文件系统的形式,即使能够自己编写单个文件,也一定会使用到其他人已经写好的外部文件。

    Python程序架构是将一个程序分割为源代码文件(也就是模块)的集合,并将这些集合连接成整体的方式。正如我们将要看到的那样,Python鼓励模块化的程序结构,将功能相近的可重用单元组织在一个模块中,这种方式符合直觉,同时也合乎直觉。在这个过程中,我们也会探索Python模块、导入以及对象属性这三个核心概念。

    如何组织一个程序

    从本质上讲,一个Python程序包括了多个含有Python语句的文本文件。程序拥有一个主体的顶层文件,辅以零个或多个被称为模块的支持文件。

    以下是模块的工作原理。顶层文件(又称为脚本)包含了程序的主要控制流程:这就是你用来启动应用程序的文件。而模块文件是工具库,这些文件中收集了顶层文件(或者其他可能的地方)要使用的组件。顶层文件使用了在模块文件中定义的工具,而这些模块又有可能使用了其他模块所定义的工具。

    尽管模块文件也是代码文件,但它们通常在运行时不需直接做任何事。作为替代,它们定义的工具会在其他文件中使用。在Python中,一个文件通过导人一个模块来获得这个模块定义的工具的访问权,这些工具被认为是这个模块的属性(即附加到模块对象的名称,例如函数)。总而言之,我们导入了模块、获取它的属性从而使用其中的工具。

    导入和属性

    下图是一个包含三个文件的Python程序的草图:a.pyb.pyc.py。文件a.py是顶层文件,它是一个由语句组成的简单文本文件,在运行时这些语句将从上至下执行。文件b.pyc.py是模块,它们也是含有语句的简单文本文件,但是它们通常并不是直接运行。就像之前解释的那样,取而代之的是,模块通常被想要使用它们的文件导入。
    Python程序
    例如,b.py定义了一个名为spam的函数,供外部来使用。就像我们提到的那样,b.py中包含一个Python的def语句来生成函数,这个函数会在之后通过给函数名后的括号中传入零个或更多的值来运行:

    def spam(text)#File b.py
        print(text, 'spam')
    

    现在,假设a,py想要使用spam。为了实现这个目标,a,py中也许要包含如下这样的Python语句:

    import b                         # File a.py 
    b.spam('gumby')            # Prints "gumby spam"
    

    第一条Python的import语句,给文件a,py提供了由文件b.py在顶层所定义的所有对象的访问权限。代码import b可以大致理解为:载入文件b.py,并给我能通过变量名b获取它所有的属性的权限。

    为了达到这样的效果,import以及from语句会按需运行并载入其他的文件。更确切地说,在Python中,跨文件的模块链接在运行时import语句执行后才会进行解析。实际效果就是,import语句将模块名(可以简单地认为是变量名)赋值了载入的模块对象。事实上,在一个import语句中的模块名起到两个作用:识别加载的外部文件,同时它也会变成赋值了被载入模块的变量。

    类似的,模块中定义的对象也会在运行时被创建,即在import执行时。import原则上会逐行运行在目标文档中的语句从而构建其中的对象。与此同时,每个在文件顶层赋值的名称都变成了模块的一个属性,这些属性可以被导入者访问。例如,a,py中的第二行语句通过使用对象属性语法,调用了模块b中所定义的函数spamspam在导入过程中通过运行def语句而创建)。代码b.spam可以理解为:取出存储对象b中名称为spam的值。

    在这个例子中,spam碰巧是个可调用的函数,所以我们可以在小括号内传入字符串'gumby'。如果你亲自编写了这些文件,并在保存之后执行a.py,那么字符串'gumby spam'就会被打印出来。

    如前所述,在Python脚本中随处可见object.attribute这种表示法:多数对象都有一些可用的属性,可以通过.运算符取出。有些是像函数这样可调用的对象,而其他的则是用来表示静态对象和属性的简单数据数值。

    导人的概念在Pytho之中贯穿始终。任何文件都能从任何其他文件中导入其工具。例如,文件a.py可以导入b.py从而调用其函数,而b.py也可能导人c.py以利用定义在其中的不同工具。导入链要多深就有多深:在这个例子中,模块a可导人b,而b可导人c,c可以再导入b,诸如此类。

    除了作为最高级别的组织结构外,模块以及模块包也是Python中程序代码重用的最高层次。在模块文件中编写组件,可让原有的程序以及任何其他之后可能编写的程序得以使用。例如,编写上图中的程序后,我们发现函数b.spam是通用的工具,可在完全不同的程序中再次使用。而我们所需要做的,只是从其他程序文件中再次导人文件b.py

    标准库模块

    注意上图最右侧的部分。程序导入的模块有一些是由Python自身提供的,而不是你所需要编写的。

    Python自带了很多实用的模块,称为标准库。根据最近的统计,这个集合体有超过200个模块,包含与平台无关的常见程序设计任务:操作系统接口、对象持久化、文本模式匹配、网络和Internet脚本、GUI建构等。虽然这些工具都不是Python语言的组成部分,但是你可以在任何安装了标准Python的环境下,通过导人适当的模块来使用它们。因为这些都是标准库模块,所以你可以理所当然地认为它们一定可用,而且在执行Pytho的绝大多数平台上都可运行。为了更全面地了解Python标准库模块,我们可以查看Pythor标准库参考手册,这份手册在Python安装后就可以看到,或者也可以使用https://www.python.org/的在线版本。

    因为有如此繁多的模块,这是唯一了解有哪些工具可以使用的方式。我们也可以在涉及应用级程序设计的商业书籍中找到Python库工具的教程,例如《Python编程》,不过手册是免费的,可以用任何网页浏览器查看(属于HTML格式),也可以使用其他方式(例如Windows中的帮助功能),而且每次Python发行时都会更新。

    更多相关内容
  • Java程序结构

    2015-12-22 21:46:17
    程序结果,帮助分享晨曦结果!
  • 微信小程序架构分析

    千次阅读 2021-05-19 20:12:46
    一,微信小程序是啥 本质其实就是(混合)的app 介于web app与native 原生app之间,具备丰富的调用手机各种功能的接口,同时又具备灵活性,跨平台。 1. 运行环境差异 微信小程序运行在三端:iOS、Android 和 用于...

    在这里插入图片描述

    一,微信小程序是啥

    本质其实就是(混合)的app 介于web app与native 原生app之间,具备丰富的调用手机各种功能的接口,同时又具备灵活性,跨平台。

    1. 运行环境差异

    微信小程序运行在三端:iOS、Android 和 用于调试的开发者工具。

    三端的脚本执行环境以及用于渲染非原生组件的环境是各不相同的:

    • 在 iOS 上,小程序的 javascript 代码是运行在 JavaScriptCore 中,是由 WKWebView 来渲染的,环境有 iOS8、iOS9、iOS10 。
    • 在 Android 上,小程序的 javascript 代码是通过 X5 JSCore来解析,是由 X5 基于 Mobile Chrome 53/57 内核来渲染的 。
    • 在开发工具上, 小程序的 javascript 代码是运行在 nwjs 中,是由 Chrome Webview 来渲染的。

    2. 与 H5 页面的区别

    从技术的发展角度来看,微信小程序是从微信中的 webViewJS-SDK 进化到了今天的形态。

    • 运行环境:小程序基于浏览器内核重构的内置解析器,而 H5 的宿主环境是浏览器。所以小程序中没有 DOMBOM 的相关 APIjQuery和一些 NPM 包都不能在小程序中使用。

    • 系统权限:小程序能获得更多的系统权限,如网络通信状态、数据缓存能力等。

    • 渲染机制:小程序的逻辑层和渲染层是分开的,双线程同时运行。渲染层的界面使用 WebView 进行渲染;逻辑层采用 JSCore 运行 JavaScript 代码。而 H5 页面 UI 渲染跟 JavaScript 的脚本执行都在一个单线程中,互斥。所以 h5 页面中长时间的脚本运行可能会导致页面失去响应。

    2. 小程序目录结构

    project
    ├── pages
    |   ├── index
    |   |   ├── index.json  index 页面配置
    |   |   ├── index.js    index 页面逻辑
    |   |   ├── index.wxml  index 页面结构
    |   |   └── index.wxss  index 页面样式表
    |   └── log
    |       ├── log.json    log 页面配置
    |       ├── log.wxml    log 页面逻辑
    |       ├── log.js      log 页面结构
    |       └── log.wxss    log 页面样式表
    ├── app.js              小程序逻辑
    ├── app.json            小程序公共设置
    └── app.wxss            小程序公共样式表复制代码
    

    3. 为什么小程序比较快

    • 安装包缓存
    • 分包加载
    • 独立渲染线程
    • Webview 预加载
    • Native 组件

    二,小程序架构

    1. 双线程模型

    微信小程序的框架包含两部分View视图层(可能存在多个)、App Service逻辑层(一个),View层用来渲染页面结构,AppService层用来逻辑处理、数据请求、接口调用,它们在两个线程里运行。

    视图层使用WebView渲染,逻辑层使用JSCore运行。

    视图层和逻辑层通过系统层的 WeixinJsBridage 进行通信,逻辑层把数据变化通知到视图层,触发视图层页面更新,视图层把触发的事件通知到逻辑层进行业务处理。

    img

    页面渲染的具体流程是:在渲染层,宿主环境会把 WXML 转化成对应的 JS 对象,在逻辑层发生数据变更的时候,我们需要通过宿主环境提供的 setData 方法把数据从逻辑层传递到渲染层,再经过对比前后差异,把差异应用在原来的Dom树上,渲染出正确的UI界面

    双线程模型

    双线程模型是小程序框架与业界大多数前端 Web 框架不同之处。基于这个模型,可以更好地管控以及提供更安全的环境。缺点是带来了无处不在的异步问题(任何数据传递都是线程间的通信,也就是都会有一定的延时),不过小程序在框架层面已经封装好了异步带来的时序问题。

    2. 视图和逻辑通信

    多 WebView 模式下,每一个 WebView 都有一个独立的 JSContext,那视图和逻辑是如何进行通讯?如下图双线程生命周期所示。

    mini02.png

    相对于浏览器双线程模型

    • 更加安全,因为微信小程序阻止开发者使用一些浏览器提供的一些功能,如操作DOM、动态执行脚本等
    • 不用等待浏览器主线程去下载并解析 html,遇到 JS 脚本还会阻塞,影响视图渲染,造成白屏
    • 缺点是双线程如果频繁的通信,操作 setData 更新视图,对性能消耗特别严重,例如拖拽、滚动等

    三、小程序启动加载

    运行机制

    小程序启动会有两种情况,一种是「冷启动」,一种是「热启动」。 假如用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时无需重新启动,只需将后台态的小程序切换到前台,这个过程就是热启动;冷启动指的是用户首次打开或小程序被微信主动销毁后再次打开的情况,此时小程序需要重新加载启动。

    更新机制

    小程序冷启动时如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序需要等下一次冷启动才会应用上。 如果需要马上应用最新版本,可以使用 wx.getUpdateManager API 进行处理。

     checkNewVersion() {
        const updateManager = wx.getUpdateManager();
        updateManager.onCheckForUpdate((res) => {
          console.log('hasUpdate', res.hasUpdate);
          // 请求完新版本信息的回调
          if (res.hasUpdate) {
            updateManager.onUpdateReady(() => {
              this.setData({
                hasNewVersion: true
              });
            });
          }
        });
      }
    

    运行机制

    • 小程序没有重启的概念
    • 当小程序进入后台,客户端会维持一段时间的运行状态,超过一定时间后(目前是5分钟)会被微信主动销毁
    • 当短时间内(5s)连续收到两次以上收到系统内存告警,会进行小程序的销毁
    img

    四,View (页面视图)

    视图层由 WXML 与 WXSS 编写,由组件来进行展示。将逻辑层的数据反应成视图,同时将视图层的事件发送给逻辑层。

    1、View - WXML

    wcc 编译器负责将 wxml 编译成 js 文件

    img

    2、View - WXSS

    • wcsc 编译 wxss 得到一个 js 文件
    • 添加尺寸单位rpx转换,可根据屏幕宽度自适应
    • 提供 setCssToHead 方法将转换后的 css 内容添加到 header

    3、View - Component

    • 小程序的组件基于 Exparser 框架。 Exparser 基于 WebComponentsShadowDOM 模型,但是不依赖浏览器的原生支持,而且可在 纯 JS 环境中运行。
    • 小程序中,所有节点树相关的操作都依赖于 Exparser,包括 WXML 到页面最终节点树的构建、CreateSelectorQuery 调用和自定义组件特性等。
    img

    4、View - Native Component

    • 目前 Native 实现的组件有
    • Native 组件渲染的层级比在 WebView 层渲染的普通组件要高。
    • 引入原生组件的优点是:
      • 扩展 Web 的能力
      • 体验更好,减轻 WebView 的渲染工作
      • 绕过 setData、数据通信和重渲染流程,性能更好
    img

    五,WebView预加载

    每次小程序进入除了当前页面,Native 预先额外加载一个WebView。当打开指定页面时,用默认数据直接渲染,请求数据回来时局部更新。返回显示历史View。退出小程序,View状态不销毁。

    六,App Service(逻辑层)

    逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈。

    1、App( ) 小程序的入口;Page( ) 页面的入口

    3、提供丰富的 API,如微信用户数据,扫一扫,支付等微信特有能力。

    4、每个页面有独立的作用域,并提供模块化能力。

    5、数据绑定、事件分发、生命周期管理、路由管理

    运行环境

    • IOS - JSCore

    • Android - X5 JS解析器

    • DevTool - nwjs Chrome 内核

    1、App Service - Binding

    • 数据绑定使用 Mustache 语法(双大括号)将变量包起来,动态数据均来自对应 Page 的 data,可以通过setData方法修改数据。
    • 事件绑定的写法同组件的属性,以 key、value 的形式,key 以bind或catch开头,然后跟上事件的类型,如bindtap, catchtouchstart,value 是一个字符串,需要在对应的 Page 中定义同名的函数。

    img

    2、App Service - Life Cylce

    img

    3、App Service - API

    API通过WeixinJSBridge和Native 进行通信

    img

    4、App Service - Router

    • navigateTo(OBJECT)

    保留当前页面,跳转到应用内的某个页面,使用navigateBack可以返回到原页面。页面路径只能是五层

    • redirectTo(OBJECT)

    关闭当前页面,跳转到应用内的某个页面。

    • navigateBack(OBJECT)

    关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages()) 获取当前的页面栈,决定需要返回几层。

    七、小程序开发经验

    1、小程序存在的问题

    小程序仍然使用WebView渲染,并非原生渲染

    需要独立开发,不能在非微信环境运行 。

    开发者不可以扩展新组件。

    依赖浏览器环境的js库不能使用,因为是JSCore执行的,没有window、document对象。

    WXSS中无法使用本地(图片、字体等)。

    WXSS转化成js 而不是css。

    WXSS不支持级联选择器。

    小程序无法打开页面,无法拉起APP。

    2、小程序的优点

    提前新建WebView,准备新页面渲染。

    View层和逻辑层分离,通过数据驱动,不直接操作DOM。

    使用Virtual DOM,进行局部更新。

    全部使用https,确保传输中安全。

    加入rpx单位,隔离设备尺寸,方便开发。

    rpx(responsive pixel):
    可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。
    如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,
    1rpx = 0.5px = 1物理像素。
    设备 rpx换算px (屏幕宽度/750) px换算rpx (750/屏幕宽度)
    iPhone5 1rpx = 0.42px 1px = 2.34rpx
    iPhone6 1rpx = 0.5px 1px = 2rpx
    iPhone6Plus 1rpx = 0.552px 1px = 1.81rpx复制代码

    八、代码运行

    运行时,外面包裹define,代码作为回调,当调用回调时,只传入前面三个值,由于后面的变量都是局部定义的变量,就屏蔽了window,document等这些变量。

    img

    img

    其中O就是上面define(‘app.js’,callback),的回调,回调值传入了三个参数,屏蔽了其他属性

    九、优化建议(官方建议)

    setData 工作原理

    小程序的视图层目前使用 WebView 作为渲染载体,而逻辑层是由独立的 JavascriptCore 作为运行环境。在架构上,WebView 和 JavascriptCore 都是独立的模块,并不具备数据直接共享的通道。当前,视图层和逻辑层的数据传输,实际上通过两边提供的 evaluateJavascript 所实现。即用户传输的数据,需要将其转换为字符串形式传递,同时把转换后的数据内容拼接成一份 JS 脚本,再通过执行 JS 脚本的形式传递到两边独立环境。

    evaluateJavascript 的执行会受很多方面的影响,数据到达视图层并不是实时的。

    常见的 setData 操作错误

    1. 频繁的去 setData

    在我们分析过的一些案例里,部分小程序会非常频繁(毫秒级)的去setData,其导致了两个后果:

    • Android 下用户在滑动时会感觉到卡顿,操作反馈延迟严重,因为 JS 线程一直在编译执行渲染,未能及时将用户操作事件传递到逻辑层,逻辑层亦无法及时将操作处理结果及时传递到视图层。
    • 渲染有出现延时,由于 WebView 的 JS 线程一直处于忙碌状态,逻辑层到页面层的通信耗时上升,视图层收到的数据消息时距离发出时间已经过去了几百毫秒,渲染的结果并不实时。

    2. 每次 setData 都传递大量新数据

    setData的底层实现可知,我们的数据传输实际是一次 evaluateJavascript 脚本过程,当数据量过大时会增加脚本的编译执行时间,占用 WebView JS 线程。

    3. 后台态页面进行 setData

    当页面进入后台态(用户不可见),不应该继续去进行setData,后台态页面的渲染用户是无法感受的,另外后台态页面去setData也会抢占前台页面的执行。

    图片资源

    • 目前图片资源的主要性能问题在于大图片和长列表图片上,这两种情况都有可能导致 iOS 客户端内存占用上升,从而触发系统回收小程序页面。
    • 在 iOS 上,小程序的页面是由多个 WKWebView 组成的,在系统内存紧张时,会回收掉一部分 WKWebView。从过去我们分析的案例来看,大图片和长列表图片的使用会引起 WKWebView 的回收。

    代码包大小的优化

    开发者在实现业务逻辑同时也有必要尽量减少代码包的大小,因为代码包大小直接影响到下载速度,从而影响用户的首次打开体验。除了代码自身的重构优化外,还可以从这两方面着手优化代码大小:

    1. 分包加载对小程序进行分包,可以优化小程序首次启动的下载时间
    2. 清理没有使用到的代码和资源

    目前小程序打包是会将工程下所有文件都打入代码包内,也就是说,这些没有被实际使用到的库文件和资源也会被打入到代码包里,从而影响到整体代码包的大小。

    预先加载数据

    原理

    小程序在启动时,会直接加载所有页面逻辑代码进内存,即便 page2 可能都不会被使用。在 page1 跳转至 page2 时,page1 的逻辑代码 Javascript 数据也不会从内存中消失。page2 甚至可以直接访问 page1 中的数据。

    小程序的这种机制差异正好可以更好的实现预加载。通常情况下,我们习惯将数据拉取写在 onLoad 事件中。但是小程序的 page1 跳转到 page2,到 page2 的 onLoad 是存在一个 300ms ~ 400ms 的延时的。如下图:

    img

    因为小程序的特性,完全可以在 page1 中预先拿取数据,然后在 page2 中直接使用数据,这样就可以避开 redirecting 的 300ms ~ 400ms了。如下图:

    img

    渲染view线程和AppServcie是相互独立的,对于AppServcie中js运行不会阻塞view的渲染

    官方的示例也是采用这种方式: 先App中请求数据,在index.js使用数据

    img

    img

    参考文章:

    https://juejin.cn/post/6844903607175741453

    https://juejin.cn/post/6844903887330099208

    https://juejin.cn/post/6951049122988163109

    展开全文
  • Qt 之 程序架构

    千次阅读 2021-05-09 19:40:49
    工作这么多年,各种行业的软件也写了不少,水平一般,借鉴了开源或别人的好的作品,记录下好的程序架构 一、程序的代码目录管理 代码目录,就是你存放源码的目录,一般程序都划分为各种模块来实现,所以为每个模块...


    前言

    工作这么多年,各种行业的软件也写了不少,水平一般,借鉴了开源或别人的好的作品,记录下好的程序架构


    一、程序的代码目录管理

    代码目录,就是你存放源码的目录,一般程序都划分为各种模块来实现,所以为每个模块单独创建一个目录来存放,是比较推荐的存放方式。

    工程文件的写法 pro:

    include(src/common/common.pri)
    include(src/manager/manager.pri)
    include(src/wifi/wifi.pri)
    include(src/bluetooth/bluetooth.pri)
    include(src/protos/proto.pri)
    include(src/httprequest/httprequest.pri)
    

    可以看出,上面每一个pri文件,均是一个单独的功能模块。

    qt应用程序,通用的功能模块,一般都会有 资源文件、第三方依赖库文件、qml文件、翻译文件等,为每个模块分别创建一个目录

    在这里插入图片描述
    上面图片的src文件夹目录为:
    在这里插入图片描述
    qtcreator SDK 项目视图为:
    在这里插入图片描述
    总体上,程序的代码目录比较清晰,干净。

    二、通用模块划分

    1.工具类

    类似全局的函数,提供代码通用工具功能,可以包含utils类,一些通用的基类,包括一些数据结构、枚举变量的定义均可划分到此大类。

    1. 配置文件管理
    2. 日志管理
    3. 通用基类
    4. 通用的数据模型类和 枚举变量类

    尤其是qml程序,c++与qml文件的互相访问,设计到一些通用的枚举类型时,可以专门定义一个文件来存放这些枚举

    2.图片资源类

    开发QT程序,包括qml 程序,免不了要设计各种界面,引用各种的图片资源等,有以下几个建议

    1. 图片资源的命名规则,建议图片按照UI模块及大小来命名
    2. 程序界面的参数,包括各种UI颜色、大小等定义

    示例如下:
    在这里插入图片描述
    其中AppThemeBase.qml定义了程序界面所有的资源及定位宽高信息

    图片定义

     property string icon_volume_high : "qrc:/images/vedio_icon_volume_high.png"
     property string icon_volume_low : "qrc:/images/vedio_icon_volume_low.png"
    
     AppImageBase {
     		anchors.left: parent.left
        	anchors.leftMargin: 10
            anchors.verticalCenter: parent.verticalCenter
            source: AppTheme.currentTheme.icon_volume_high 
    }
    

    文字大小定义

    // Font Size
    readonly property int font_size_cn_64: 64
    readonly property int font_size_cn_32: 32
    readonly property int font_size_cn_28: 28
    readonly property int font_size_cn_24: 24
    readonly property int font_size_cn_22: 22
    
    AppText {
            id: txtKey
            visible: !imageKey.visible
            anchors.centerIn: parent
            font.pixelSize: AppTheme.currentTheme.font_size_cn_22
            font.weight: Font.DemiBold
            font.family: "Gilroy"
            color: btnEnabled ? AppTheme.currentTheme.color_gray_contrast_strongest_light : AppTheme.currentTheme.color_gray_contrast_strong_dark
        }
    

    3.文本国际化类

    很多app都有国际化需求,可以把所有用到的字符串定义到一个单独文件来管理,这样国际化的时候会很方便

    // HistoryPage.qml
    readonly property string no_history: qsTr("您还没有查词记录哦",
                                              "您还没有查词记录哦") 
    // RecordPage.qml
    readonly property string create_new_record: qsTr("创建新录音",
                                                     "创建新录音") + translator.i18n
    readonly property string login_sync_record: qsTr(
    

    总结

    未完待续

    展开全文
  • 微信小程序架构图与开发

    千次阅读 2021-10-20 11:15:58
    微信小程序原理分析和多端小程序架构原理(应该是全网最全了) | 悬笔e绝的个人博客前言互联网生态演进:超级 APP + 小程序成为「轻应用时代」下的新生态。 一方面微信、支付宝等各家小程序平台遍地开花,另一方面...

    双线程模型

    双线程模型引入的原因:

    ​网页开发渲染线程和脚本线程是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应,而在小程序中,二者是分开的,分别运行在不同的线程中。


    真实运行环境

    传统Webview和小程序的异同

    与传统Web开发上的异同


    1)标签名字有点不一样

     用wxml和wxss表示页面而不是html和css,之所以有了这样的替换,是因为腾讯

    把开发HTML 的时候,经常会用到的标签(divpspan...)进行了组合封装

    变成了小程序里面的WXML标签(viewbuttontext 等等)。封装之后不仅能提高我们的开发效率,还能使得腾讯上不同小程序风格上大体一直,不至于过于灵活,差异过大。

    2)

    多了一些 wx:if 这样的属性以及 {{ }} 这样的表达式

    在网页的一般开发流程中,我们通常会通过 JS 操作 DOM (对应 HTML 的描述产生的树),以引起界面的一些变化响应用户的行为。例如,用户点击某个按钮的时候,JS 会记录一些状态到 JS 变量里边,同时通过 DOM API 操控 DOM 的属性或者行为,进而引起界面一些变化。当项目越来越大的时候,你的代码会充斥着非常多的界面交互逻辑和程序的各种状态变量,显然这不是一个很好的开发模式,因此就有了 MVVM 的开发模式(例如 React, Vue),提倡把渲染和逻辑分离。简单来说就是不要再让 JS 直接操控 DOMJS 只需要管理状态即可,然后再通过一种模板语法来描述状态和界面结构的关系即可。

    小程序的框架也是用到了这个思路,如果你需要把一个 Hello World 的字符串显示在界面上。

    WXML 是这么写 :

    <text>{{msg}}</text>
    

    JS 只需要管理状态即可:

    this.setData({ msg: "Hello World" })
    

    通过 {{ }} 的语法把一个变量绑定到界面上,我们称为数据绑定。仅仅通过数据绑定还不够完整的描述状态和界面的关系,还需要 if/elsefor等控制能力,在小程序里边,这些控制能力都用 wx: 开头的属性来表达。

    更详细的文档可以参考 WXML

    参考自:

    微信小程序原理分析和多端小程序架构原理(应该是全网最全了) | 悬笔e绝的个人博客前言互联网生态演进:超级 APP + 小程序成为「轻应用时代」下的新生态。 一方面微信、支付宝等各家小程序平台遍地开花,另一方面移动开发插件化技术逐渐没落,移动应用构建的方式在悄悄的发生变化。对于企业应用形态而言,也在逐步发生变化,超级 APP(移动门户)+ 轻应用是一种新的流行趋势。微信、支付宝是互联网生态下的“移动门户”,手机银行是金融典型的 ToC “移动门户”。小程序方式构建应用是大趋势,https://www.xuanbiyijue.com/2021/03/13/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90%EF%BC%88%E5%BA%94%E8%AF%A5%E6%98%AF%E5%85%A8%E7%BD%91%E6%9C%80%E5%85%A8%E4%BA%86%EF%BC%89/

    小程序代码构成 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart/code.html#WXML-%E6%A8%A1%E6%9D%BF

    展开全文
  • 《.NET应用程序架构设计 原则 模式与实践》《.NET应用程序架构设计 原则 模式与实践》
  • Android程序在创建时,Android Studio就为其构建了基本结构,设计者可以在此结构上开发应用程序,因此掌握Android程序结构是很有必要的。 下面以HelloWorid程序为例,分析Android 程序结构: 在图中,可以看到一...
  • NET应用程序架构设计

    2017-06-21 16:57:25
    NET应用程序架构设计
  • 应用程序架构安全性

    2021-01-30 06:48:54
    从编程的圈子跳出来,了解从较高的应用程序架构级别处理安全性的新方法。跑在安全违规行为的前面,帮助确保您企业的高度安全性。大部分软件安全性的讨论都集中在应用程序本身或其中包含的数据上。例如,大家经常讨论...
  • 本文包含一个109页的PPT讲述Android程序结构设计的理论和方法,附带一...一个Activity对应的,按照硬件划分模块的,内部结构和外部关系的架构模式; 用阅读信息量衡量程序结构的复杂度; 双向绑定的应用场景 数据流图;
  • LabVIEW程序结构.pdf

    2021-09-30 17:47:11
    LabVIEW程序结构.pdf
  • stm32 程序结构

    2022-04-05 13:44:43
    startup_stm32f10x_hd.s 启动文件 我们需要在外部定义一个 SystemInit 函数设置 STM32 的时钟; STM32 上电后,会执行 SystemInit 函数,最后执行我们 C 语言中 的 main 函数 stm32f10x.h 在编程之前我们要 ...
  • 程序架构和工作原理

    千次阅读 2022-01-19 11:32:55
    小程序上线以来,一向被称为“便携版”的APP,关于两者之间的区别,无外乎小程序相对轻便、开发成本低,...三、小程序架构 视图层和逻辑层分离,通过数据驱动,事件交互,不直接操作DOM 视图层负责渲染页面
  • 微信小程序架构解析,工作原理解析

    万次阅读 多人点赞 2019-05-31 21:27:38
    一、小程序介绍 1、小程序特点 2、小程序演示 视频地址:https://v.qq.com/x/page/w0353d7co6y.html 3、小程序为什么那么快 Page Frame Native预先额外加载一个WebView 当打开指定页面时,用默认数据直接...
  • 嵌入式软件开发之程序架构(一)

    千次阅读 多人点赞 2019-02-17 18:00:41
    该内容是工作一年来通过上网或其他方式不断搜索、实践、总结出来的嵌入式软件开发经验(本文仅适用于单片机的裸机开发),希望...在嵌入式软件开发过程中,程序架构的搭建尤为重要,下面介绍三种常用的程序框架设计方案
  • 程序架构详解

    2018-11-30 11:03:35
    程序是一种不用下载就能使用的应用,也是一项门槛非常高的创新,经过将近两年的发展,已经构造了新的小程序开发环境和开发者生态。小程序也是这么多年来中国IT行业里一个真正能够影响到普通程序员...此文档为结构详解
  • 程序的基本架构

    千次阅读 2022-01-25 20:44:40
    一、小程序的基本架构 1.知识点 (1)小程序整体配置方法。 (2)小程序页面配置方法 2.实现方法 2.1全局配置 小程序根目录下的app.json文件夹用来对微信小程序进行全局配置,文件内容作为一个JSON对象,主要配置项...
  • LabVIEW学习笔记(三)——程序结构

    万次阅读 多人点赞 2018-08-21 22:35:05
    LabVIEW 中的程序结构包括if-else循环,while循环结构,使能结构,公式节点和数学脚本节点等, 因此通过LabVIEW可以非常方便快速地实现任何复杂的程序结构。在LabVIEW 中,无论是循环结构、Case 结构还是条件式节点...
  • 详解微信小程序目录结构,浅析微信小程序技术架构 我做的第一个微信小程序项目应该是19年上旬做的,到现在也有一年左右了,今天我就结合微信小程序官方文档简单分析总结一下微信小程序的目录结构和运行原理。 1、 ...
  • ABB机器人的程序结构与模块属性

    千次阅读 2020-03-29 21:08:19
    ABB机器人的程序结构 在ABB机器人中,机器人所运行的程序被称为RAPID, RAPID下面又划分了Task(任务),任务下面又划分了module(模块),模块是机器人的程序与数据的载体,模块又分为System modules(系统模块)...
  • 自动化项目PLC程序结构

    千次阅读 2021-03-11 21:34:13
    (1)小型自动化程序较软件相比起来有很大灵活性,但在逻辑、结构上也有工程师普遍使用的方法 (2)流程式程序结构便于快速编写并调试完项目,而且便于其它工程师接收与维护 (3)对于一名专业自动化工程师来说,...
  • 一、小程序架构 每个小程序的结构都是由两个主要部分构成:主体部分 + 各个页面。 类似于许多框架,主体部分主要用于核心的配置,各个页面主要用于不同业务场景。   1.1,主体部分主要由3个文件构成 1)app.js:小...
  • 基于程序结构讲授程序设计培养小学生计算思维能力——以Scratch 2.0程序设计为例.pdf
  • 下面给出一个汇编源程序示例,使读者对ARM汇编语言程序结构有一个大概的了解。
  • C# 程序结构

    千次阅读 2021-08-15 19:05:11
    C#程序结构 一个 C# 程序主要包括以下部分:这里以控制台程序为实例 命名空间声明(Namespace declaration) 一个 class Class 方法 Class 属性 一个 Main 方法 语句(Statements)& 表达式(Expressions) ...
  • VxBus驱动程序架构是VxWorks操作系统未来驱动程序发展的方向,也是设计VxWorks操作系统中设备驱动的必经之路。本文分析VxBus设备驱动架构的优点,VxBus组成结构以及基于VxBus架构的设备驱动开发流程。
  • 2.3 Android应用程序架构-从此开始1 让我们回过头来看看刚才Android项目建立向导帮忙做了哪些工作以此来了解Android应用程序的生命周期及其文件组成方式首先展开"Package Explorer"窗口里的"HelloWorld"项目名称可以...
  • PLC程序的组成结构

    千次阅读 2021-12-13 14:36:38
    西门子S7-200 CPU的控制程序由主程序、子程序和中断程序组成。  1.主程序  主程序(OBI)是程序的主体,每个项目必须只有一个主程序。子程序和中断程序可以在主程序中调用。  主程序通过指令控制整个应用程序的...
  • 基于DoDAF和TOGAF的企业应用程序体系结构开发
  • 【Python基础】Python程序结构有哪些

    千次阅读 2020-11-22 17:09:57
    13条回答小小李兆佳2楼-- · 2020-10-16 09:52①顺序结构:即语句从上到下按顺序执行②分支结构:一条大路,会有很多分支路口。在python常用if..elif..else判断语句③循环结构:例如像放歌一样,歌单循环播放。在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,967,921
精华内容 1,587,168
关键字:

程序架构