Web 开发未来会完全替代客户端开发吗?

Databend 索引结构说明

咱们好,我是 ConardLi。

首要问咱们一个问题,现在有一项事务需求,这个需求运用客户端运用完结仍是网页来完结你会考虑哪些因素呢?能够在谈论区告诉我。

曾几何时,想到网页或许咱们第一时间想到的就是一些静态页面,可是经过数十年的蓬勃发展,网页开端接受越来越杂乱的需求,包含杂乱的管理系统、网络直播、云游戏等才干。

但或许你仍然会认为相比能够和系统底层直接交互的原生客户端运用仍是太弱了,咱们或许会由于浏览器“缺失” 了某一项才干而被逼挑选开发一个客户端运用。

为此 Google 启动了一个名为 Fugu 的项目,它的方针就是让开发者能够在 Web 生态中做任何工作,包含曾经只要客户端运用才干做的工作。

Fugu 项目中, GoogleChrome 规划了数百项才干,现在发展现已过半,咱们一起来看看浏览器现在具有了哪些或许你还不知道的才干吧 …

和蓝牙设备交互 【Chrome 56】

Web Bluetooth API 为浏览器供给了衔接蓝牙设备并与之交互的才干。

Web 开发未来会完全替代客户端开发吗?

这意味着:你的网站能够直接衔接你的运动手表,检查步数、心率等数据,能够直接操控你的蓝牙音响等等。而这些才干,之前你必需求下载一个 App 才干完结了 …

获取是否支撑蓝牙衔接:

navigator.bluetooth.getAvailability().then((available)=>{
if(available){
console.log("设备支撑蓝牙衔接!");
}else{
console.log("设备不支撑蓝牙");
}
});

衔接到蓝牙设备:

navigator.bluetooth.requestDevice({filters:[{services:['battery_service']}]})
.then(device=>{
//获取设备称号[ConardLi]
console.log(device.name);
//衔接长途GATTServer.
returndevice.gatt.connect();
})
.then(server=>{/*…*/})
.catch(error=>{console.error(error);});

了解更多:https://developer.chrome.com/articles/bluetooth/

和 USB 设备交互【Chrome 61】

Web USB API 为浏览器供给了和 USB 设备进行交互的才干。

提到 USB ,你很有或许会立即想到键盘、鼠标、音频、视频和一些存储设备。

这些非标准化的 USB 设备通常需求硬件供货商编写特定于平台的驱动程序和 SDK,开发十分繁琐。

如果能够在 Web 上和 USB 进行交互,这意味着硬件制造商将能够为其设备构建跨平台的 JavaScript SDK,这将极大简化一个 SDK 的开发本钱!别的,经过将 USB 引入 Web,也能够使得 USB 更安全、更易于运用。

Web 开发未来会完全替代客户端开发吗?

下面是一段简略的获取 USB 设备的代码:

navigator.usb.getDevices().then(devices=>{
devices.forEach(device=>{
console.log(device.productName);//"[ConardLi]ArduinoMicro"
console.log(device.manufacturerName);//"[ConardLi]ArduinoLLC"
});
})

你还能够在 Chrome 的内部页面 about://device-log 方便的调试 USB 设备:

Web 开发未来会完全替代客户端开发吗?

了解更多:https://wicg.github.io/webusb/

异步剪贴板【Chrome 76】

在曾经,咱们一般运用 document.execCommand() 进行剪贴板交互。虽然浏览器兼容性还不错,但这种剪切和张贴的办法有显着的缺陷:剪贴板拜访是同步的,只能读写 DOM

关于少量文本的剪贴还好,但如果剪贴内容较大,在安全张贴内容之前,或许还需求进行耗时的清理或图像解码,浏览器或许还需求从张贴的文档加载或内联链接资源,这种情况下用户体验就比较糟糕了。

Asynchronous Clipboard API 的出现解决了这些问题,比方咱们要将一段文本仿制到剪贴板,能够调用一个异步的 writeText 函数:

asyncfunctioncopyPageUrl(){
try{
awaitnavigator.clipboard.writeText(location.href);
console.log('PageURL已赋值到剪贴板');
}catch(err){
console.error('失利了~);
}
}

从剪贴板读取数据一样也能够是异步的:

asyncfunctiongetClipboardContents(){
try{
consttext=awaitnavigator.clipboard.readText();
console.log('张贴文本:',text);
}catch(err){
console.error('读取剪贴板文本失利:',err);
}
}

别的,document.execCommand() 还有一个十分显着的问题就是权限操控过于宽松了,在许多情况下咱们或许会担心网站是否会私自读取咱们剪贴板的信息,Asynchronous Clipboard API 仅支撑 HTTPS 页面,别的在读取剪贴板是会向用户发送答应,这保证了网页有必要在用户同意的情况下才干读取剪贴板:

Web 开发未来会完全替代客户端开发吗?


了解更多:https://developer.mozilla.org/docs/Web/API/Clipboard_API

运用装置【Chrome 80】

getInstalledRelatedApps 办法能够让浏览器知道某些运用程序是否已在电脑上装置了,当然现在仅限于 Android、WindowsPWA 运用。

constrelatedApps=awaitnavigator.getInstalledRelatedApps();
relatedApps.forEach((app)=>{
//留意只能获取到现已授权的运用,并不是一切运用
console.log(app.id,app.platform,app.url);
});

幻想一下你开发了一个产品的官网,在用户下载页面你能够根据运用的装置状况提示用户是下载仍是更新,乃至能够直接打开运用…

了解更多:https://github.com/WICG/get-installed-related-apps

获取联系人【Chrome 80】

在曾经,能够在移动设备上拜访用户的联系人一直是移动 Web 运用开发者最想要的功用之一,这也是促进他们有必要挑选开发一个 App 的重要原因…

Contact Picker API 为浏览器供给了获取手机联系人的才干。

假设咱们有一个根据 Web 的电子邮件客户端,能够直接运用 Contact Picker API 来挑选电子邮件的收件人。一个根据 WebIP 语音运用程序能够直接查找要拨打的电话号码。或许一些 Web 社交运用能够帮助用户发现哪些朋友现已参加了。

比方,你打开一个网页游戏,他能够直接告诉你,你的好兄弟 ConardLi 也在玩哟,快和他一起组队来砍我吧…

下面是一个简略的运用示例:

constprops=['name','email','tel','address','icon'];
constopts={multiple:true};
try{
constcontacts=awaitnavigator.contacts.select(props,opts);
handleResults(contacts);
}catch(ex){
//一些错误...
}
Web 开发未来会完全替代客户端开发吗?

了解更多:https://wicg.github.io/contact-api/spec/

编解码才干【Chrome 80】

在曾经,浏览器供给了诸如 HTMLMediaElement、WebAudio、WebRTC 等完结媒体编解码器才干的 API,可是没有通用的办法来灵活装备和运用这些媒体编解码器。因此,在有功能差、耗电快等问题的情况下,许多 Web 运用仍是会求助于在 JavaScriptWebAssembly 中完结媒体编解码器。

WebCodecs 为网页供给了对内置(软件和硬件)媒体编码器和解码器的高效拜访才干。

这项才干为网页直播、云游戏等对流媒体处理功能要求较高的场景下大地来了很大便当。

下面是一个从视频渲染到 Canvas 来完结极低推迟流的示例:

functiononDecoderError(error){...}
functionstreamEncodedChunks(decodeCallback){...}
constcanvasElement=document.getElementById("canvas");
constcanvasContext=canvas.getContext('2d',canvasOptions)
functionpaintFrameToCanvas(videoFrame){
canvasContext.drawImage(frame,0,0);
frame.close();
}
constvideoDecoder=newVideoDecoder({
output:paintFrameToCanvas,
error:onDecoderError
});
videoDecoder.configure({codec:'vp8'}).then(()=>{
streamEncodedChunks(videoDecoder.decode.bind(videoDecoder));
}).catch(()=>{});

了解更多:https://github.com/w3c/webcodecs/blob/main/explainer.md

为图标增加徽章【Chrome 81】

App Badging API 能够让 Web 运用为图标增加一些徽章。

比方一个 Web 聊天室能够在徽章上显现未读的音讯数;一个 Web 象棋游戏能够经过符号提示轮到你下棋了;一些长耗时的后台任务能够经过符号告诉你任务现已成功 …

Web 开发未来会完全替代客户端开发吗?

下面是一个简略的代码示例:

//设置徽章
constunreadCount=17;
navigator.setAppBadge(unreadCount).catch((error)=>{
//异常捕获...
});
//清除徽章
navigator.clearAppBadge().catch((error)=>{
//异常捕获...
});

了解更多:https://w3c.github.io/badging/

形状检测【Chrome 83】

在曾经,咱们想在 Web 上读取一些图片上的数据是相当困难的,比方开发者想在客户端提取一些些特征来构建一个二维码阅读器,必需求依赖一个巨大的外部 JavaScript 库,而且功能或许很差。

可是,包含 Android、iOSmacOS 在内的操作系统,以及相机模块中的硬件芯片,通常现已具有高功能和高度优化的特征检测器,例如 AndroidFaceDetectoriOSCIDetector 通用特征检测器。

Web 开发未来会完全替代客户端开发吗?

Shape Detection API 经过一组 JavaScript 接口公开了这些完结。现在支撑的功用有人脸检测、条码检测以及文字检测,这意味着咱们能够在 Web 上完结下面的功用:

  • 购物网站能够让用户直接扫描商品条码查询商品信息;
  • 社交网站能够检测人脸面部特征,自动增加墨镜、胡子等道具;
  • 内容网站能够自动识别图片上的文本,例如餐厅菜单。

下面是一段简略的人脸识别代码:

//[ConardLi]
constfaceDetector=newFaceDetector({
//约束识别人脸的数量
maxDetectedFaces:5,
//下降精度提升速度
fastMode:false
});
try{
constfaces=awaitfaceDetector.detect(image);
faces.forEach(face=>drawMustache(face));
}catch(e){
console.error('Facedetectionfailed:',e);
}

了解更多:https://wicg.github.io/shape-detection-api/

获取验证码【Chrome 84】

当咱们在一些网站上进行注册或登录时,或许需求验证手机号。网页一般会发送一个验证码,咱们需求将验证码提交到网页上来完结验证。可是切到短信后仿制验证码,再回来提交整个过程是比较繁琐的。

WebOTP API 为浏览器供给了方便读取短信验证码的才干。

Web 开发未来会完全替代客户端开发吗?

用法也十分简略,首要咱们能够为 input 增加一个 autocomplete 特点:

<form>
<inputautocomplete="one-time-code"required/>
<inputtype="submit">
</form>

然后调用 navigator.credentials 获取验证码信息:

if('OTPCredential'inwindow){
window.addEventListener('DOMContentLoaded',e=>{
constinput=document.querySelector('input[autocomplete="one-time-code"]');
if(!input)return;
constac=newAbortController();
constform=input.closest('form');
if(form){
form.addEventListener('submit',e=>{
ac.abort();
});
}
navigator.credentials.get({
otp:{transport:['sms']},
signal:ac.signal
}).then(otp=>{
input.value=otp.code;
if(form)form.submit();
}).catch(err=>{
console.log(err);
});
});
}

了解更多:https://wicg.github.io/WebOTP/

唤醒屏幕【Chrome 84】

试想一下,当你在某个网站上看着菜谱煮饭,由于长时间未操作手机自动锁屏了,你还需求去定期触碰一下手机,是不是有点头大。

Screen Wake Lock API 可体让浏览器在网页需求继续运转时防止调暗或锁定屏幕。

运用方式也很简略,能够直接调用 navigator.wakeLock.request() 办法,回来一个 WakeLockSentinel 对象。

据说在施行了 Screen Wake Lock API 后,美国主要烹饪网站 Betty Crocker 的用户购买意向指标增加了 300% …

了解更多:https://w3c.github.io/screen-wake-lock

文件拜访【Chrome 86】

在曾经,咱们只能经过 <input type="file"> 在浏览器上拜访文件,需求写出类似下面的代码:

constopenFile=async()=>{
returnnewPromise((resolve)=>{
constinput=document.createElement('input');
input.type='file';
input.addEventListener('change',()=>{
resolve(input.files[0]);
});
input.click();
});
};

File System Access API 为浏览器供给了更好的和文件系统交互的才干:

constopenFile=async()=>{
try{
//Alwaysreturnsanarray.
const[handle]=awaitwindow.showOpenFilePicker();
returnhandle.getFile();
}catch(err){
console.error(err.name,err.message);
}
};

了解更多:https://wicg.github.io/file-system-access/

Web NFC【Chrome 89】

NFC 代表 Near Field Communications,这是一种以 13.56 MHz 频率运转的短距离无线技能,能够在小于 10 厘米的距离内完结设备之间的通讯,传输速率高达 424 kbit/s

Web NFC 为网站供给了在靠近用户设备时读取和写入 NFC 标签的才干,这意味着你只需求打开一个网站就能够刷地铁进站了…

Web 开发未来会完全替代客户端开发吗?

要扫描 NFC 标签,首要需求实例化一个 NDEFReader 对象,并调用 scan 办法,下面是一个简略的代码示例:

constndef=newNDEFReader();
ndef.scan().then(()=>{
console.log("扫描开端");
ndef.onreadingerror=()=>{
console.log("无法读取NFC数据!");
};
ndef.onreading=event=>{
console.log("NFC数据读取成功...");
};
}).catch(error=>{
console.log(`Error!Scanfailedtostart:${error}.`);
});

了解更多:https://wicg.github.io/file-system-access/

人机接口设备【Chrome 89】

WebHID API 为浏览器供给了和人机接口设备(简称 HID)交互的才干。

比方键盘、鼠标、触摸板、游戏手柄等都归于 HID 设备,WebHID API 供给了一系列 JavaScript API 来和这些设备进行交互。而在曾经,你必需求有一个特定的游戏主机才干够…

幻想一下,今后再也不用纠结于国行外行了,由于你直接能够在网页里打开 Switch 游戏了…

Web 开发未来会完全替代客户端开发吗?

下面是一个简略的代码示例:

//在具有SwitchJoy-ConUSB供货商/产品id的设备上进行筛选。
constfilters=[
{
vendorId:0x057e,//NintendoCo.,Ltd
productId:0x2006//Joy-ConLeft
},
{
vendorId:0x057e,//NintendoCo.,Ltd
productId:0x2007//Joy-ConRight
}
];
//提示用户挑选Joy-Con设备。
const[device]=awaitnavigator.hid.requestDevice({filters});

了解更多:https://wicg.github.io/webhid/index.html

和串口设备交互【Chrome 89】

串行接口(Serial port),也称串行接口或串行端口,串行通讯接口,COM接口,简称串口。主要用于串行式逐位数据传输。

Web 开发未来会完全替代客户端开发吗?

Web Serial API 为网站供给了一种运用 JavaScript 读取和写入串行设备的办法。

这样,咱们的网站又能操控更多设备了,比方打印机、路由器、交换机等等。

下面是一个简略的代码示例:

document.querySelector('button').addEventListener('click',async()=>{
//提示用户挑选串口
constport=awaitnavigator.serial.requestPort();
});

从串口读取数据:

constreader=port.readable.getReader();
//监听来自串行设备的数据
while(true){
const{value,done}=awaitreader.read();
if(done){
reader.releaseLock();
break;
}
console.log(value);
}

相同的,你也能够在 Chromeabout://device-log 对串口设备进行调试。

Web 开发未来会完全替代客户端开发吗?

闲暇检测【Chrome 94】

Idle Detection API 为网站供给了检测用户当时是否闲暇(例如在一段时间内没有与键盘、鼠标、屏幕的交互)的才干。

例如,一个 Web 聊天室运用能够让你知道你的老友当时是否在线,下面是一个闲暇检测的简略示例:

//[ConardLi]创立闲暇探测器
constidleDetector=newIdleDetector();
//设置一个在用户闲暇时触发的监听器
idleDetector.addEventListener('change',()=>{
constuState=idleDetector.userState;
constsState=idleDetector.screenState;
console.log(`Idlechange:${uState},${sState}.`);
});
//开端监听
awaitidleDetector.start({
threshold:60000,
signal,
});

了解更多:https://wicg.github.io/idle-detection

WebTransport【Chrome 97】

WebTransport 是一种新的 API,运用 HTTP/3 协议作为双向传输,为网站供给低推迟、双向、客户端-服务器音讯传递才干。

你或许会问和 WebSockets 的区别是啥?

WebSockets 的音讯流特点是单一、可靠、有序,这关于某些场景的通讯需求来说是很好的;可是 WebTransport 的数据的特点是低推迟,但不保证可靠性或排序,由于它底层运用的 QUIC 握手比经过 TLS 启动 TCP 更快。

如果你的数据通讯需求十分好的功能,可是对偶然的丢包和排序能够忍受,比方一些网页游戏的场景,WebTransport 是一个更好的挑选。

下面是一个简略的运用示例:

//向服务器发送数据
constwriter=transport.datagrams.writable.getWriter();
constdata1=newUint8Array([65,66,67]);
constdata2=newUint8Array([68,69,70]);
writer.write(data1);
writer.write(data2);
//从服务器读取数据
constreader=transport.datagrams.readable.getReader();
while(true){
const{value,done}=awaitreader.read();
if(done){
break;
}
//值为Uint8Array。
console.log(value);
}

了解更多:https://wicg.github.io/web-transport/#web-transport

多屏窗口放置【Chrome 100】

Multi-Screen Window Placement API 为网页了供给了枚举显现器并将窗口放置在特定屏幕上的才干。

Web 开发未来会完全替代客户端开发吗?

下面是一个简略的监听屏幕数量变化的示例:

//获取一切屏幕
constscreenDetails=awaitwindow.getScreenDetails();
letcachedScreensLength=screenDetails.screens.length;
//监听屏幕变化
screenDetails.addEventListener('screenschange',(event)=>{
if(screenDetails.screens.length!==cachedScreensLength){
console.log(
`屏幕数量从${cachedScreensLength}变化到${screenDetails.screens.length}`,
);
cachedScreensLength=screenDetails.screens.length;
}
});

了解更多:https://w3c.github.io/window-placement

最后

当然,以上我提到的仅仅 Fugu 项目的很小一部分,咱们感兴趣能够去 Fugu 官网检查更多信息:「Fugu API Tracker」(https://fugu-tracker.web.app/#)

你觉得上面哪些才干对你最有用呢?

你觉得未来网页能够完全代替客户端么?

欢迎在谈论区和我留言。

如果这篇文章帮助到了你,欢迎点赞和重视。

如果你想参加高质量前端交流群,或许你有任何其他工作想和我交流也能够增加我的个人微信 ConardLi 。

抖音安全团队正在招聘前端,感兴趣请检查:抖音安全团队招聘前端工程师

点赞在看是最大的支撑⬇️❤️⬇️