还能把浏览器当作 Web 服务器?骚操作,学废了~
楔子
什么?还能把浏览器当作 Web 服务器?
闲话少说,直接干货!
整体思路:PWA 中用于缓存文件的 server workers 可以动态生成新文件,并通过 fetch 事件,将它们发送至浏览器!
不熟悉 PWA 的朋友们可简单了解如下:
PWA(Progressive Web Apps) 翻译为 渐进式网页应用,它是一种构建 Web 应用程序的新理念,涉及 一些 特定的模式,API 和其他功能。
它能实现传统 web 所不能做到的:离线工作、可安装、易于同步、可以发送推送通知等;
不熟悉 server workers 的朋友们可简单了解如下:
server workers 就是一个服务器与浏览器之间的中间人角色,如果网站中注册了 service worker,那么它可以拦截当前网站所有的请求,进行判断(需要编写相应的判断程序),如果需要向服务器发起请求的就转给服务器,如果可以直接使用缓存的就直接返回缓存不再转给服务器。从而大大提高浏览体验。
所以,通过 server workers 可以发送文件至浏览器!
工具
我们还要借助:somorphic-git
somorphic-git 是 git 的纯 JavaScript 实现,适用于 Node 和浏览器环境(包括 WebWorkers 和 ServiceWorkers);
它可以用于读写 git 库,以及从 Github 获取和推送。
我们还要借助 BrowserFS
BrowserFS 与 Webpack 类似,也是模块打包工具;
它的特点:
基于流式(stream)思想设计
可以通过 command line,也可以通过 API 来使用
仅处理 javascript
模块化的逆过程,但是推动着模块化的更好发展
内置了一些 node core module
node 模块可以在浏览器端使用,是 同构应用 的有力武器
我们还要借助 Lightning-fs
它让浏览器文件读写更加快速,快如闪电⚡~
最后还需要 indexedDB
这个相信大家并不陌生,indexedDB 可以实现在客户端存储大量的结构化数据~~
实现
代码实现:
初始化 service worker 如下:
<pre class="js jt ju jv jw ll hj du"><span id="0644" class="bx lm kg fs ln b bu lo lp s lq" data-selectable-paragraph=""><strong class="ln lh">if</strong> ('serviceWorker' <strong class="ln lh">in</strong> navigator) {<br> <strong class="ln lh">var</strong> scope <strong class="ln lh">=</strong> location.pathname.replace(//[^/]+$/, '/');<br> <strong class="ln lh">if</strong> (<strong class="ln lh">!</strong>scope.match(/browserfs/)) {<br> navigator.serviceWorker.register('sw.js', {scope})<br> .then(<strong class="ln lh">function</strong>(reg) {<br> reg.addEventListener('updatefound', function() {<br> <strong class="ln lh">var</strong> installingWorker <strong class="ln lh">=</strong> reg.installing;<br> console.log('A new service worker is being installed:',<br> installingWorker);<br> });<br> <em class="lr">// registration worked</em><br> console.log('Registration succeeded. Scope is ' <strong class="ln lh">+<br> </strong>reg.scope);<br> }).<strong class="ln lh">catch</strong>(function(error) {<br> <em class="lr">// registration failed</em><br> console.log('Registration failed with ' <strong class="ln lh">+</strong> error);<br> });<br> }<br>}</span></pre>
测试
原作者大佬 Jakub T. Jankiewicz 还搞了个在线测试 Demo GIT Web Terminal,除了 NB 我还能说什么呢?
调用测试:
查看返回:
有一说一,这个方向的尝试还是很顶的~~
增强 Web 能力,吾辈义不容辞!(●'◡'●)
<hr>
OK,以上就是本篇分享~ 撰文不易,点赞鼓励👍👍👍
本篇参考:
我是掘金安东尼,公众号同名,日拱一卒、日掘一金,再会~
版权声明: 本文为 InfoQ 作者【掘金安东尼】的原创文章。
原文链接:【http://xie.infoq.cn/article/244dfbe7f751624b158b69688】。文章转载请联系作者。
评论