一个问题:网页和桌面软件相比有哪些差距?

哪些差距?文件读写
离线访问
硬件访问能力

  • nfc
  • usb

    为什么会有这些限制?

    为什么有这些限制?我觉着这是和网页的特点有关的:Open —— 访问太容易了
    所以以上限制基本出于安全考虑。如果随便打开一个网站,都可能在读你的文件、访问你的相册,你会怎么想?

    做了哪些努力呢?

    浏览器API增强

    Web不是一定非安全的,但是安全的前提一定是”让用户知道他在做什么”。所以我们会遇到一些API,JS调用不生效,必须是用户交互触发的才生效;也会遇到一些弹窗提醒,在使用什么什么……

    Fugu

    https://developer.chrome.com/zh/blog/fugu-status/

    “河豚”,美味又危险 其目标是让 Web 应用可以执行 iOS/Android/桌面应用可以执行的任何操作,方法是将这些平台的功能赋予 Web 平台,同时维护用户的安全性、隐私和信任,以及 Web 的其他核心原则。 还记得做设计器CBB时,让钊强研究过JS能不能取到本地字体列表,这个JS都做不到,但是Fugu里的API可以了:https://web.dev/local-fonts/

WebAssembly

通过https://developer.mozilla.org/zh-CN/docs/WebAssembly/Concepts,我们可以简单了解:

  • WebAssembly是什么,为了解决什么问题,如何解决
  • 我们可以怎么使用WebAssembly

    WebAssembly 是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如 C、C++和 Rust 等低级源语言提供一个高效的编译目标。 WebAssembly 生态系统处在初始阶段;更多的工具会毫无疑问得不断出现。当前,有四个主要的着手点:

    • 使用 Emscripten 移植一个 C/C++应用程序。
    • 直接在汇编层,编写或生成 WebAssembly 代码。
    • 编写 Rust 程序,将 WebAssembly 作为它的输出。
    • 使用AssemblyScript,它类似于 TypeScript 并且可编译成二进制 WebAssmebly 代码

PWA

  • Web App Manifest
  • Web Push
  • Service Worker
  • Cache Api

如谷歌地图:https://www.google.com/maps/
还没深入研究,个人感觉看上去还有些弱,重要的可能还是如何在Service Worker里提供更强大的API,当前看貌似都是为了做离线操作缓存有关的。不过,也看到一些利用Cache Api加强普通Web网页性能的尝试,没有实际试过:https://segmentfault.com/a/1190000041564624

WebContainer

https://blog.stackblitz.com/posts/introducing-webcontainers/

The advent of WebAssembly and new capabilities APIs made it seem possible to write a WebAssembly-based operating system powerful enough to run Node.js, entirely inside your browser.

WebGPU

看上去是官方入场,做WebGL方案?https://zhuanlan.zhihu.com/p/95461662

原生和浏览器组合

JxBrowser

image.png
https://kms.fineres.com/pages/viewpage.action?pageId=357139334

node-webkit & Electron

一个有意思的故事:https://www.zhihu.com/question/36292298/answer/102418523
2012年的Intel实习生 & GitHub的atom-shell & 其中的恩怨

Tauri

语法翻译

严格意义上说好像是Native发起的反攻。浏览器你别努力了,你还用JS写好了,我给你翻译成Native…

ReactNative-X系列

image.png
React、渲染器、宿主平台。

在上一代 React Native 渲染器中,React 影子树、布局逻辑、视图拍平算法是在各个平台单独实现的。当前的渲染器的设计上采用的是跨平台的解决方案,共享了核心的 C++ 实现。 React Native 团队计划将动画系统加入到渲染系统中,并将 React Native 的渲染系统扩展到新的平台,例如 Windows、游戏机、电视等等。 关于 (i) React 与渲染器的通信,包括渲染(render) React 树和监听事件(event),比如 onLayout、onKeyPress、touch 等。 关于 (ii) React Native 渲染器与宿主平台的通信,包括在屏幕上挂载(mount)宿主视图,包括 create、insert、update、delete 宿主视图,和监听用户在宿主平台产生的事件