前几天写了一篇文章关于如何实现一个简单版的pwa应用,端午撸了一个简易版知乎日报pwa。

关于如何写一个pwa,这里就不多介绍了,请移步这里。应用使用vue+vuex+axios,API这里,这里做了跨域处理,可以直接访问,但是返回的图片链接却无法访问(forbidden),暂时没有解决这个问题。

应用构建

使用vue作为前端框架,由于有些数据共享问题,所以使用了vuex来做状态管理。由于是移动端,这里使用rem来做适配,只需要在项目初始化的时候设定全局字体大小即可(当然这个字体是很大的,你需要在组件中重新定义相应的字体大小)。

    var deviceWidth = document.documentElement.clientWidth;

    document.documentElement.style.fontSize = deviceWidth / 7.5 + 'px';

    // 页面宽度发生变化时动态生成根字体尺寸
window.onresize = function () {
var deviceWidth = document.documentElement.clientWidth;
if (deviceWidth > 750) deviceWidth = 750; // Iphone6Plus的屏幕尺寸
document.documentElement.style.fontSize = deviceWidth / 7.5 + 'px';
}

页面主要三部分,头部,内容区以及侧边栏。

  1. 侧边栏主要是实现一个点击头部按钮滑出的动画效果,并没有做手势效果。

  1. 头部就是一些常见的操作,不多只有最左侧的有效,为了弹出侧边栏,或者返回新闻列表页



红色区块点击弹出侧边栏,黑色区块这是返回首页



当然如果进入详情页变成箭头返回按钮,由于没有使用路由所以只能点击这里返回。

3. 内容区分为一个轮播图和内容列表。



没有请求到图片,将就点了。

坑与填坑

  1. 请求借口返回的信息有些链接是基于http的所以这里需要转成https直接正则替换即可
  2. 内容详情返回的是html字符串以及css链接,渲染html字符串直接使用指令v-html即可,但是由于样式库加载过慢导致页面乱,所以这里用一个粗暴的方法,先隐藏内容,等css请求回来之后再显示。css的地址需要跨域所以采用fetch请求,我们只需要请求返回结果即可,而不用返回具体值:
		fetch(cssUrl.replace(/http/g,'https'), {mode:'no-cors'})
.then(res => {
that.cssLoaded = true;
})
  1. 在调用vuex的store时,使用对象解构赋值(es7),所以先安装babel-preset-stage-3,然后.babelrc文件要配置下
"presets": [
["latest", {
"es2015": { "modules": false } }],
"stage-3"
]

pwa查看

由于pwa基于https,所以这里使用ngrok做代理,便于我们查看,当然你可以把做好的应用直接放到github上来查看。

关于ngrok的使用直接看官网即可,基础使用一看就懂https://ngrok.com

实现效果

在手机上使用google浏览器打开,并添加到桌面



添加到手机桌面,左侧是原生App, 右侧是pwa



配置的启动页



打开之后



我们可以看到,打开之后将浏览器的头部隐藏了,非常像一个原生APP。

断网之后



由于没有缓存信息,所以页面为空,但头部依然有,而且可以打开侧边栏。我们知道网页都可以添加到桌面,但是断网之后, 就成了这样

项目地址https://github.com/Stevenzwzhai/zhihu-daily

演示地址https://stevenzwzhai.github.io/zhihu-daily/

注:修复图片防盗链接,但是由于使用第三方缓存,所以可能会加载有点慢。

一个知乎日报pwa的更多相关文章

  1. 知乎日报win10版 - 天天读报【开源】

    业余时间写的一个知乎日报win10版客户端,支持收藏,评论,点赞等. 商店地址:https://www.microsoft.com/zh-cn/store/apps/%E5%A4%A9%E5%A4%A ...

  2. 知乎日报 API的图片盗链问题

    由最近 基于vue的知乎日报单页应用 引发的问题 以及问题解决历程 通过 知乎日报API 基于vue做一个知乎日报的单页应用,在获取图片时存在一个图片盗链问题,图片无法加载 提示 403 错误, 最终 ...

  3. 微信小程序开发日记——高仿知乎日报(下)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  4. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  5. 微信小程序开发日记——高仿知乎日报(上)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  6. 【完全开源】知乎日报UWP版:增加Live磁贴、Badge、以及Toast通知

    目录 说明 实现方法 APP生命期 后台任务 说明 之前网上有人建议增加磁贴(tile).徽章(badge)功能.利用周末的时间,将这两个功能添加上去了.如果将磁贴固定到开始屏幕,磁贴就会循环播放首页 ...

  7. 【完全开源】知乎日报UWP版:项目结构说明、关键源代码解释

    目录 说明 项目结构 关键代码 演示视频 说明 上一篇博客将源码放出来了,但是并没有做过多的介绍,所以如果自己硬看可能需要花费很长的时间,尤其这些代码并不是自己写的.项目不算复杂但是也不算简单,这篇文 ...

  8. 【完全开源】知乎日报UWP版(下篇):商店APP、github源码、功能说明。Windows APP 良心出品。

    目录 说明 功能 截图+视频 关于源码和声明 说明 陆陆续续大概花了一个月的时间,APP算是基本完成了.12月份一直在外出差,在出差期间进行了两次功能完善,然后断断续续修补了一些bug,到目前为止,我 ...

  9. 【完全开源】知乎日报UWP版(上篇):界面设计、官方API分析

    目录 说明 使用Fiddler分析android版API 部分效果图 关于源码 说明 在做博客园UWP版的时候其实就有做知乎日报的打算了,前段时间一直出差,在酒店里用Fiddler简单的分析了一下An ...

随机推荐

  1. 2018.11.19 Struts2中Action类的书写方式

    方式1: 方式2: 方式3

  2. focal loss和retinanet

    这个是自己用的focal loss的代码和公式推导:https://github.com/zimenglan-sysu-512/Focal-Loss 这个是有retinanet:https://git ...

  3. python time模块计算程序耗时

    import time start = time.clock() end = time.clock() consume_time = end - start

  4. bat 批处理变量

    @echo off setlocal enabledelayedexpansion d: rem 更改d:\bat为当前目录 cd /d bat rem 变量使用 + echo %a% echo %C ...

  5. C语言输出格式

    1 一般格式    printf(格式控制,输出表列)    例如:printf("i=%d,ch=%c\n",i,ch);    说明:    (1)“格式控制”是用双撇号括起来 ...

  6. LeetCode 中级 - 从前序与中序遍历序列构造二叉树(105)

    一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树. 根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root),  然后在中 ...

  7. 【学时总结&模板时间】◆学时·10 & 模板·3◆ AC自动机

    ◇学时·10 & 模板·3◇ AC自动机 跟着高中上课……讲AC自动机的扩展运用.然而连KMP.trie字典树都不怎么会用的我一脸懵逼<(_ _)> 花一上午自学了一下AC自动机 ...

  8. Docker(一):概述

    Docker 是什么? Docker是一个开源的应用容器引擎,基于Go语言开发 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  9. is 和 isinstance的区别 and issubclass

    定义一个子类和父类 class A: pass class B(A): pass is print(type(b) is B) # 结果: True print(type(b) is A) # 结果: ...

  10. [转]select top n 动态赋值

    怎样实现 select top n 语句中 n 的动态赋值呢?怎样实现 select   top   n   语句中 n 的动态赋值,求教各位了. 要把这个n值传到存储过程中,再加入 select t ...