Qt 配置Webassemble环境

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

之前一直知道有一个神奇的东西Webassemble,好几次都是由于环境配置不对导致不能正常使用,而且我也对于它的真正能力表示有兴趣。所以经过深入研究,终于在5.15.26.8.3两个版本上配置成功并使用。


一、Webassemble是什么?

WebAssembly 是一种新的编码方式,可以在现代的 Web 浏览器中运行------它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C/C++、C# 和 Rust 等语言提供编译目标,以便它们可以在 Web 上运行。它也被设计为可以与 JavaScript 共存,允许两者一起工作。

对于 Web 平台而言,WebAssembly 具有巨大的意义------它提供了一条使得以多种语言编写的代码都可以接近原生的速度在 Web 中运行的途径,使得以前无法在 Web 上运行的客户端应用程序得以在 Web 上运行。

WebAssembly 被设计为可以和 JavaScript 一起协同工作------通过使用 WebAssembly 的 JavaScript API,你可以把 WebAssembly 模块加载到 JavaScript 应用中并且在两者之间共享功能。这允许你在同一个应用中利用 WebAssembly 的性能和能力以及 JavaScript 的表达力和灵活性,即使你可能并不知道如何编写 WebAssembly 代码。

通俗点说:对于运行在网页上的特殊需求的对性能有要求的场景可以尝试,比如数学矩阵计算和FFT一类的。

我之前一直对比Webassemble和调用服务器之间的差别,终于被我想通了。调用服务器需要网络传输时间损耗,而且消耗服务器的资源,如果你在一个性能不弱的电脑上跑网页的话,那么它是本地计算,就是在那台电脑上运算,而不是消耗服务器的资源。某些情况下在响应速度和体验上会有不俗的提升。

二、下载并配置emsdk

1.下载源代码

bash 复制代码
# github
git clone https://github.com/emscripten-core/emsdk.git
# gitee 建议
git clone https://gitee.com/anold/emsdk.git

2.配置环境

bash 复制代码
cd emsdk
./emsdk install latest
./emsdk activate latest

./emsdk activate latest这句需要注意,执行完之后会提示你设置一些环境变量,emsdk 需要编译工具链,java,python,node等几个环境协同工作,这几个环境都已经在emsdk 里面了。

贴一下我的环境变量:

1.用户变量


2.PATH路径


改成你自己的目录即可!

三、配置Qt环境

这里只能使用Creator,暂不支持Clion等其它IDE

注意:先配置环境变量再打开Creator,会自动读取环境变量的!

1.设置SDKS

编辑->设置->SDKs->Webassemble


应用->确定

2.查看构建套件

编辑->设置->构建套件(Kit)


和我一样说明你的环境配置好了。

四、测试Demo

这里随便写了一个SplitterDemo,具体代码就不贴出来了,和你平常创建Qt Widgets项目一样的。构建套件选择Webassemble 6.8.3 multithread即可。

编译并等待结束!

五、部署

1.部署nginx环境

这里一定需要nginx环境,因为nginx部署配置Webassemble是最简单的。别的方法不懂JS的人操作不了,用nginx的话你不需要懂JS也能成功部署!

这里建议nginx的版本不低于1.26.3以上,太低的版本mime.types文件里没有对application/wasm的支持!Windows和Linux都可以,我们今天演示的所有特性都是跨平台的!

2.部署Webassemble程序

编译完成后在编译目录生成几个文件,这些文件都是对.wasm的包装,不用我们自己写.js文件了。所以说不懂JS的人也能顺利操作。

把这些文件全部复制到一个nginx能访问的目录下,在nginx.conf或其它方式配置网页访问。下面是我的示例:

bash 复制代码
server {
    listen       8080;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location /Webassemble {
        add_header Cross-Origin-Embedder-Policy "require-corp" always;
        add_header Cross-Origin-Opener-Policy "same-origin" always;
        alias /var/www/Webassemble/;
        try_files $uri $uri/ /SpliterDemo.html;
    }
    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

完了之后重启nginx,Windows环境必须杀死nginx程序重新打开,Linux环境执行:sudo nginx -s reload即可。

最后,打开chrome浏览器输入网址打开:

bash 复制代码
http://127.0.0.1:8080/Webassemble/SpliterDemo.html

简单的功能页面看起来和Creator上编译的没什么两样,除了没看到标题栏。性能也很快,没发现瓶颈。

注意:下面这两句一定要加上,要不然浏览器报无法申请SharedArrayBuffer 的错误,这个是因为一个浏览器漏洞,感兴趣的可以看我发的说明网站!

bash 复制代码
        add_header Cross-Origin-Embedder-Policy "require-corp" always;
        add_header Cross-Origin-Opener-Policy "same-origin" always;

幽灵漏洞

写在最后:这个东西确实给不会JS的童鞋提供了一种可能,虽然可能开发速度远不如VUE那样快,但性能肯定是快的。这个东西说白了主要是完成一些耗时计算的,比如前面说的数学矩阵快速傅里叶变换等等,不是用来开发复杂的GUI的,虽然目前我也没有发现什么不支持的功能,可能我写的Demo页面简单的缘故,有兴趣的还需要进一步测试。

试想有这么一种可能:项目的主体是JS开发的,然后有这么一个模块需要复杂的计算,JS无论如何不能满足性能需求,而且对网络延迟的容忍度也低,不好通过服务器去中间计算返回,这个时候Webassemble就派上用场了。


总结

1、环境配置对于纯小白稍微有点压力,一步步来也没什么问题

2、使用场景比较稀少,绝大多数人可能都遇不到,可以先收藏起来作为一个备选方案,我以前也是不知道浏览器还能这么玩的。

相关推荐
武子康2 小时前
Java-167 Neo4j CQL 实战:CREATE/MATCH 与关系建模速通 案例实测
java·开发语言·数据库·python·sql·nosql·neo4j
自由的好好干活2 小时前
C#桌面框架与Qt对比及选型(国产操作系统开发视角)
开发语言·qt·c#
upward_tomato2 小时前
python中模拟浏览器操作之playwright使用说明以及打包浏览器驱动问题
开发语言·python
lsx2024062 小时前
jEasyUI 合并单元格详解
开发语言
散峰而望2 小时前
C++入门(算法) - 习题
开发语言·c++·算法·github
在下胡三汉2 小时前
创建轻量级 3D 资产 - Three.js 中的 GLTF 案例
开发语言·javascript·3d
xqlily2 小时前
Prover9/Mace4 的形式化语言简介(二)
开发语言
2501_930412273 小时前
如何添加清华源到Conda?
开发语言·python·conda
2501_930412273 小时前
如何删除Conda中的清华源配置?
开发语言·python·conda