ThingJS开发使用感受

news2024/11/15 13:52:26

封面来源于网络。


一、前言

1. 背景 

出于为了实现有关厂区的数字孪生项目,断断续续使用ThingJS平台开发一年左右,做一个使用感受的总结。

2. 业务场景

  • 开发一个基于厂区的数字孪生项目,基于ThingJS低代码开发的页面分为div3d、div2d结构;
  • div3d是3D场景展示的HTML节点,3D场景可以通过动画来模拟现实,并展示对应数据信息;
  • div2d是2D图层展示的HTML节点,基于业务需要实现的数据和图表展示、功能操作等,其中功能操作可联动3D场景;

二、开发流程

1. 场景建模

使用「森园区」或「模模搭」,具有现成模型,建模需求不大,可以使用内置建模搭建场景;需要还原实际园区场景需要依靠 3D建模师 提供模型。

2. 低代码开发

具体可参考官方示例(需结合官方在线开发参考手册)

三、优缺点

优点

  1. 整合功能开发;
  2. 固定方法便捷引用;
  3. 0基础建模人员,可快速搭建简易建模;

缺点(偏开发方面)

a. 文件引入方式

THING.Utils.dynamicLoad([
    '/static/vendor/twitter-bootstrap/3.3.7/css/bootstrap.min.css',
    '/static/vendor/twitter-bootstrap/3.3.7/js/bootstrap.min.js',
    '/static/vendor/moment/moment.js'
    // ......
],
    function () {
        // 加载场景代码 
        var app = new THING.App({
            url: 'https://www.thingjs.com/static/models/factory',  // 场景地址
            background: '#000000',
            env: 'Seaside',
        });
        // 加载场景后执行
        app.on('load', function (ev) {
            // 创建提示
            initThingJsTip(`制作项目过程中,平台支持上传页面资源, js 和 css 可以通过 dynamicLoad 进行引用`);
        });
    })

官网示例给出了上述 引入js和css 的方式,这种方式在具有引入大量文件需求的时候,会增加页面的初始加载时长;

问:这种引入文件的方式为什么会增加页面的初始加载时长?

答:

  • 首先ThingJS低代码项目的运行流程大概是先依次加载文件,在加载3D场景,然后展示出整个项目场景;(THING.Utils.dynamicLoad()方法的参数1是文件地址数组。)
  • 后期的项目业务量会越来越多、越来越复杂,需要加载的JS、CSS文件更多;(笔者所开发的项目按照功能模块来写,至少40个JS文件,每次加载时长在30s~1min多之间。)
  • 开发过程中会有引入第三方插件的需求,随之我们需要加载的文件会越来越多;(dayjs.js、js.cookie.js、bootstrap.min.js......)
开发项目的初始化页面加载时长
开发项目的初始化页面加载时长
个别第三方插件加载时长
个别第三方插件加载时长

b. 2D页面结构添加方式

/**
 * 利用模板字符串 创建页面元素并添加到div2d中
 */
function createButton() {
    // 使用 bootstrap 样式
    var template =
        `<button class="btn btn-default" type="button" style="position:absolute;left:20px;top:20px;z-index:2">当前时间</button>`;
    var btn = $('#div2d').append($(template));

    return btn;
}

上述是ThingJS低代码平台开发2d平面图层添加HTML元素节点的方式(即:模版字符串【``】)

也就是说,你所有的HTML节点都要使用模版字符串进行添加;

举例:导航栏、侧窗、弹窗、按钮等......基本所有图层都需要使用模版字符串进行拼接、添加;

(可以参考低代码平台示例中是如何添加2d图层的。)

(这个博客也有提到这种方式)

c. 无法使用CSS预处理器

因为文件引入方式不支持CSS预处理器相关后缀文件引入,所以笔者一般的开发方式是:在VSCode中新建html文件,写好页面结构,依靠Less/Sass进行写样式,然后分别将html结构通过模版字符串添加到div#div2d的节点中、将解析出的CSS文件导入低代码项目中。

d. 无法很好地使用模块化开发

ThingJS不支持目前主流的JS模块化方案;

该博客中有提到 引入js和css 的方式可以作为一个模块化文件引入方案,但是博客中有提到: “如果要实现一个较为庞大复杂的业务场景时,就不太方便了” ,也正是笔者担心的。

因为前期开发获取到ThingJS开发方式的参考极少甚至没有(只能参考ThingJS低代码示例),所以笔者一直在使用的是 引入js和css 的方式,算是全局变量了......(因此也引发了后续编译或混淆后的报错问题......)

主流的JS模块化方案无法使用,可以尝试以下方案:(两种方式笔者都未曾验证是否存在其他问题)

1. 命名空间

使用对象来创建命名空间,将相关功能和变量组织在命名空间下,以避免全局变量的冲突。

使用命名空间的方式,你可以在全局范围内只定义一个对象,然后将模块的功能和变量添加为该对象的属性。

var MyNamespace = {
  // 模块1
  module1: { // ... },
  // 模块2
  module2: { // ... },
  // ...
};

2. 模块模式(推荐)

使用函数返回对象的方式创建模块,将模块内部的变量和函数隐藏起来,只暴露需要暴露的接口。

var MyModule = (function() {
  var privateVariable = '私有变量';
  function privateFunction() { // 私有函数 }
  function publicFunction() { // 公有函数 }
  
  return { publicFunction: publicFunction };
})();
MyModule.publicFunction(); // 调用公有函数

e. 开发无报错,上线报错

原因:

上线前平台内部的编译工具或混淆器错误地重复定义了同一个变量名。

待解决理由:

项目会因为混淆器定义的变量莫名地报错,每次运行项目无法保证具体哪个功能无法使用。

优化方案:

  1. 尝试更新或更改编译工具或混淆器的配置(第三方平台,无法更新或更改配置)
  2. 全局变量包装在一个自定义的命名空间对象中(未做尝试,无法保证不继续有混淆器重复定义变量的问题)。

缺点:

项目复杂后,无法保证声明的命名空间对象不会被混淆器重复定义同一个变量名。

f. 初始化加载

原因:

  1. (模型方面)当场景内物体过多时也有可能会导致场景加载缓慢,卡顿。
  2. (源码方面)平台没有提供构建工具来处理源代码,所以无法很好的进行文件压缩、代码合并、文件优化等操作。

待解决理由:

项目初始化加载时间过长

优化方案:

创建一个新的项目,将源码使用压缩网站进行压缩,将其复制到新的项目中。

(在老项目中实现功能,然后压缩代码复制到新项目,引用新项目链接)

缺点:

  1. 该优化方案只是优化的方法之一,不能保证优化效果显著,后期项目代码量提升,依旧会影响加载时间;
  2. 开发方式受限,增加开发工作量,并且不能保证压缩后代码不出现问题;

影响加载速度的原因:

  1. 基于平台引入文件的方式,初始化时依次全部加载出来
  2. 资源文件大小和数量
  3. 第三方插件和库
  4. 网络速度和延迟
  5. 服务器性能和响应时间

        ......

四、总结

在编码方面,笔者的编码方式和博客中的描述基本一致:“由于平台提供的代码编码端体验不佳,我们不得不先在本地进行开发,再将相关代码复制到在线平台,而调试修改代码也是如此繁琐”。

个人感觉至少现阶段的ThingJS还是比较适合去做一些简单的业务场景、数据交互简单的项目,类似于大屏展示,这种纯数据展示;如果要实现一个较为庞大复杂的业务场景时,就不太方便,开发难度也会随之增加。

不得不承认ThingJS有一定的优点,但是相对开发来说,这些优点是可以被缺点抵消掉的;

如果一个项目开发不方便,不仅会影响到开发周期,还会提高后期项目的维护成本......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习笔记】深度学习框架

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

【源码编译并安装RocketMQ Dashboard】

【源码编译并安装RocketMQ Dashboard】 一、环境说明二、源码编译并执行三、小结 一、环境说明 安装环境&#xff1a;虚拟机VMWare Centos7.6 Maven3.6.3 JDK1.8已经安装了RocketMQ-5.1.3 单Master集群&#xff0c;且使用Local模式部署&#xff0c;即Broker和Proxy同进程部署…

【Java】CAS数据交换流程

CAS的全称是&#xff1a; Compare And Swap(比较再交换)&#xff0c;它体现的一种乐观锁的思想&#xff0c;在无锁情况下保证线程操作共享数据的原子性。 CAS数据交换流程&#xff1a; 此时线程A和线程B都从主内存中拷贝了一份a100的共享变量到自己的工作内存中 线程A操作了变…

手势识别rtos小车(1)----手部识别

1.安装mediapipe库和cv2库 pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simplepip install Mediapipe0.8.9.1 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 这里我主要还是弄明白了这个pycharm编辑器和项目之间的关系&#xff0c;我在这里…

联盟CPS聚合联盟聚推客推广项目赚钱吗?揭秘有人月入10万+

大家好&#xff0c;我是巧匠&#xff01;最近因为忙碌于项目&#xff0c;都没来得及发布新的文章。不过现在&#xff0c;我给大家带来了一个新的项目玩法——那就是我们常说的淘客CPS系统。相信大家对“聚推客联盟”这个系统都有所了解。这个系统的模式真的很棒&#xff0c;让我…

nodejs登录生成token并验证

目录 一、基础概念 二、JTW 三、实践 一、基础概念 "token"&#xff1a; 是一个通用的术语&#xff0c;指代一种用于表示身份、权限或访问凭证的数据结构。它可以是一个字符串、数字或其他形式的数据。 主要用途&#xff1a; 身份验证&#xff1a;在身份验证过程…

ruoyi若依 组织架构设计--[ 角色管理 ]

ruoyi若依 组织架构设计--[ 角色管理 ] 角色新增后端代码 角色修改后端代码 角色查询角色删除角色分配数据权限后端代码 角色分配用户 角色新增 后端代码 有一点&#xff0c;我认为新增的时候&#xff0c;也需要修改redis中的权限。 角色修改 后端代码 因为修改了role_menu表了…

Database Comparer VCL for Delphi crack

Database Comparer VCL for Delphi crack 数据库比较器VCL比较并同步许多流行数据库的数据库结构(元数据)和表数据。支持的数据库列表不断更新&#xff0c;包括InterBase、FireBird、MySQL、MSSQL、Oracle、Sybase、PostgreSQL、DB2、PervasiveSQL、MSAccess、Paradox、DBASE以…

Java多线程(2)---线程控制和线程安全的详细讲解

目录 前言 一.线程控制方法 1.1启动线程--start() 1.2线程睡眠---sleep()方法 1.3中断线程--interrupt() 方法 1.4等待线程---join() 二.线程安全 2.1数据不安全---数据共享 ⭐不安全的演示和原因 ⭐不安全的处理方法 ⭐synchronize的使用 2.2数据不安全---内存可见…

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群

前言 Amazon ElastiCache for Redis 是速度超快的内存数据存储&#xff0c;能够提供亚毫秒级延迟来支持 实时应用程序。适用于 Redis 的 ElastiCache 基于开源 Redis 构建&#xff0c;可与 Redis API 兼容&#xff0c;能够与 Redis 客户端配合工作&#xff0c;并使用开放的 Re…

【动态规划】最长上升子序列 LIS

算法提高课笔记。 目录 问题的开始&#xff1a;最长上升子序列思路代码 怪盗基德的滑翔翼题意思路代码 登山题意思路代码 友好城市题意思路代码 拦截导弹题意思路代码 导弹防御系统题意思路代码 最长公共上升子序列题意思路代码 问题的开始&#xff1a;最长上升子序列 原题链…

linux后台运行程序命令screen

前言 我们在服务器终端或者是使用ssh连接服务器的时候&#xff0c;需要长期后台运行项目&#xff0c;但是我们一关终端可能程序进程就会被kill掉了&#xff0c;我们之前学习过2>&1 &后台部署的命令&#xff0c;但是这样我们查看项目进程的时候还需要去查询运行的PI…

TartanVO: A Generalizable Learning-based VO 论文阅读

论文信息 题目:TartanVO: A Generalizable Learning-based VO 作者&#xff1a;Wenshan Wang&#xff0c; Yaoyu Hu 来源&#xff1a;ICRL 时间&#xff1a;2021 代码地址&#xff1a;https://github.com/castacks/tartanvo Abstract 我们提出了第一个基于学习的视觉里程计&…

Netty使用和常用组件辨析

Netty 使用和常用组件 简述 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId <version>4.1.42.Final </version> <scope>compile</scope> </dependency> Netty 的优势 1 、 AP…

42. 疯狂爬取王者荣耀所有皮肤高清海报(文末源码)

目录 前言 目的 思路 代码实现 1. 导包&#xff0c;部署好环境 2. 伪装请求头 3. 访问英雄列表&#xff0c;获取英雄ID 4. 分别访问各英雄主页&#xff0c;查看图片详情 5. 写入本地文件夹&#xff08;文件夹自动命名&#xff09; 完整源码 运行效果 总结 前言 阔…

流量、日志分析分析

这周主要以做题为主 先找找理论看然后在buuctrf以及nssctf找了题做 了解wireshark Wireshark是一款开源的网络协议分析软件&#xff0c;具有录制和检查网络数据包的功能&#xff0c;可以深入了解网络通信中的传输协议、数据格式以及通信行为。Wireshark可以捕获发送和接收的数…

冶金化工操作VR虚拟仿真实验软件提高员工们协同作业的配合度

对于高风险行业来说&#xff0c;开展安全教育培训是企业的重点工作&#xff0c;传统培训逐渐跟不上时代变化和工人需求&#xff0c;冶金安全VR模拟仿真培训系统作为一种新型的教育和培训工具&#xff0c;借助VR虚拟现实技术为冶金行业的工人提供一个安全、高效的培训环境。 冶金…

堡塔面板系统加固使用说明

更新日志&#xff1a; 宝塔系统加固5.0- 正式版 2023-08-07 1.加固php 配置文件 2.加固nginx 启动文件 宝塔系统加固4.1- 正式版 1、【修复】系统加固不会随系统启动自动开启的问题 2、【优化】大幅降低CPU使用率 宝塔系统加固4.0- 正式版 1、【增加】等保加固相关加固功能 2、…

Win10聚焦锁屏壁纸保存

前言 Win10聚焦锁屏每天都会推荐新的壁纸&#xff0c;其中有些质量超高的优秀壁纸&#xff0c;用户自然想下载保存下来&#xff0c;下文介绍如何保存。 若用户仅想保存当天的聚焦锁屏壁纸&#xff0c;则推荐方法1&#xff1b;若用户想保存以前的聚焦锁屏壁纸&#xff0c;则推…

git的简单介绍和使用

git学习 1. 概念git和svn的区别和优势1.1 区别1.2 git优势 2. git的三个状态和三个阶段2.1 三个状态&#xff1a;2.2 三个阶段&#xff1a; 3. 常用的git命令3.1 下面是最常用的命令3.2 git命令操作流程图如下&#xff1a; 4. 分支内容学习4.1 项目远程仓库4.2 项目本地仓库4.3…