progressive web application是谷歌推出的一种渐进式web应用,通过利用service-worker等来达到类似于原生应用,而且在chrome浏览器还可以添加到主页,完全就和一个app无异。老实说我觉得pwa是一个很好的发展方向,虽然小程序搞了一段时间不温不火,但是pwa的限制更少,再说还有谷歌支持,只不过现在部分浏览器可能支持的不是很好。

国内饿了么前段时间做了一个pwa,我觉得就挺好的 https://h5.ele.me/msite/

我觉得和native app使用已经比较接近了,而且还无需安装。

扯得有点多,今天主要是讲下自己怎么做一个pwa。当然了,我也是新手,我的pwa也是基于谷歌的pwa的sample做了一些改进。谷歌现在很多开发者文档都做了翻译,sample主要是一个天气应用,里面具体的实现逻辑我就不讲了,我讲以下如何部署这个pwa。

在谷歌的sample里面是推荐使用firebase来部署你的pwa,但是由于国内的高墙,在firebase init的时候总是authentication error,stackoverflow上面说是代理的原因,但是不上代理又没办法使用firebase,所以这是一个死循环。但是!!我们有github page,github page是一个很好的展示静态页面的方面,以前只能支持渲染gh分支里面的内容,现在github对于github page功能做了完善,详细可以看下这篇文章http://blog.csdn.net/neal1991/article/details/53535914

下面跟我来:

1.进入https://github.com/neal1991/pwa 可以fork或者clone这个项目,我已经将里面的一些东西,改掉了,可以直接运行。

2.进入settings里面设置



现在你进入https://yourusername.github.io/your-reporistry-name/就可以发车了,是不是很快。

接着我还想讲一讲我这个项目做的一些改进的地方,因为这个weather pwa使用的是yahoo的一个api,通过利用woeid可以去查询各个城市的天气以及相关信息。但是网上却没有中国各个城市的数字代码,注意是WEPID代码,我后来发觉http://www.imeihua.net/tool/weathercode.aspx 这个网站是可以查询wepid的,本来想写一个爬虫爬取的,但是这个网站似乎做了什么限制,我使用curl模拟下请求,限制访问了,这个网站使用.NET实现的,.NET的web请求里面总是包含了一些奇怪的属性。后来我又发现一个国外的网站,很方便,直接get请求就能获取http://woeid.rosselliot.co.nz/lookup ,于是我就写了一个爬虫去爬取,源代码在https://github.com/neal1991/woeid-parser

核心代码

var request = require('superagent');
var fs = require('fs');
var cityConfig = ['wuhu', 'shanghai', 'beijing', 'hangzhou', 'nanjing', 'wuxi', 'xiamen', 'longyan'];
var cheerio = require('cheerio');
var url = 'http://woeid.rosselliot.co.nz/lookup/';
var attrNames = ['city', 'province', 'country', 'woeid'];
var result = []; cityConfig.forEach(function(city) {
request.get(url + city)
.end(function(err, res) {
$ = cheerio.load(res.text);
$('#woeid_results_table tr').each(function(i, ele) {
var obj = {};
$ = cheerio.load(ele);
$('td').each(function(index, td) {
obj[attrNames[index]] = $(this).text();
})
result.push(obj);
});
var isEmpty = function(object) {
for (var key in object) {
return false;
}
return true;
}
result = result.filter(function(obj) {
return obj.country === 'China' && !isEmpty(obj);
})
fs.writeFile('result.json', JSON.stringify(result, null, "\t"));
})
});

主要是使用了superagent和cheerio这两个包,一个是用来发请求的,另外一个是用于解析html的,城市名需要英文城市名,我这里就是config来配置的,然后对结果做了过滤保存成json格式的文件。

这样就提供了我们中国城市wepid的数据源,当然我还没有做去读取json来获取这些数据,还是把这些wepid写死了放在weather pwa里面的。

对于weather pwa我还增加了删除城市的功能,因为本来只能添加城市,没有办法删除城市,可能里面还有一些小BUG。访问地址:

https://neal1991.github.io/pwa/

以上,就是我的第一次progressive web application,各位看官,如果觉得我的内容写的还可以的话,一定要给我的github repository star鼓励!!!

第一个progressive web application,发车!的更多相关文章

  1. struts2官方 中文教程 系列一:创建一个struts2 web Application

    先贴了本帖地址,以免被爬  http://www.cnblogs.com/linghaoxinpian/p/6898779.html 本教程将会通过安装struts2框架来创建一个简单的应用程序.虽然 ...

  2. 如何Recycle一个SharePoint Web Application,以及为什么

    当你发现SharePoint服务器的CPU或者内存使用率居高不下的时候,很多人都会选择iisreset来让资源使用率降下来.但是在企业环境中,这毫无疑问会使这台服务器中断服务从而影响到用户的使用,所以 ...

  3. Webpack之(progressive web application) - PWA中的 Service Workers 是什么

    学习文档:https://webpack.docschina.org/guides/progressive-web-application/ 参考文档:https://developers.googl ...

  4. 在ASP.NET Web Application中通过SOAP协议调用Bing搜索服务

    本文介绍了如何在ASP.NET Web Application中将Bing搜索作为Web Service来使用,并通过HTTP的SOAP协议在ASP.NET Web Application中调用Bin ...

  5. Extend一个web application没有反应怎么办?

      通过SharePoint管理中心Extend一个web application的时候, 点完确定按钮后,没有反应,怎么回事? [解决方法] 多等一会,不要连续点. 等待的过程中看看iis, 过一会 ...

  6. Progressive Web App是一个利用现代浏览器的能力来达到类似APP的用户体验的技术——不就是chrome OS吗?

    什么是Progressive Web App? Progressive Web App是一个利用现代浏览器的能力来达到类似APP的用户体验的技术,由Google实现,让浏览器打开的网址像APP一样运行 ...

  7. 一个解决过程:Servlet [某路径xxx] in web application [/项目xxx] threw load() exception和java.lang.ClassNotFoundException XXX

    Servlet [某路径xxx] in web application [/项目xxx] threw load() exception和java.lang.ClassNotFoundException ...

  8. Progressive Web App

    下一代 Web 应用? 近年来,Web 应用在整个软件与互联网行业承载的责任越来越重,软件复杂度和维护成本越来越高,Web 技术,尤其是 Web 客户端技术,迎来了爆发式的发展. 包括但不限于基于 N ...

  9. 微软压力测试工具 web application stress

    转自 http://www.cnblogs.com/tonykan/p/3514749.html lbimba  铜牌会员 这里给广大的煤油推荐一个web网站压力测试工具.它可以用来模拟多个用户操作网 ...

随机推荐

  1. 组件的属性props

    组件的属性props 是不能自己改的,一般是从外面传进来.在组件的视图中用,this.props.XXX 表示该组件的XXX 属性

  2. Oralce动态的创建按月的分区

    说明: XXX为一个配置表,里面配置了要分区的表明,即CODENO = 'PARTITIONTABLENAME',只有每个月月底的时候,才会进入IF的判断,此外还有一个定时任务,每天去执行即可. 存储 ...

  3. 【bzoj1398】Vijos1382寻找主人 Necklace

    *题目描述: 给定两个项链的表示,判断他们是否可能是一条项链. *输入: 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). *输出: 如果两条项链不可能同 ...

  4. (3.2)狄泰软件学院C++课程学习剖析三

    对课程前面40课的详细回顾分析(一) 0. int main() { // ① Array t(3,3); //普通模式 // ② Array *t=new Array(3,3); //指针方式 // ...

  5. Java中高级面试题(1)

    List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高 ...

  6. Java 静态初始化块等的执行顺序

    实例代码 package text; class Root { static{ System.out.println("Root的静态初始化块"); } { System.out. ...

  7. 图片上传预览转压缩并转base64详解(dShowImg64.js)

    hello,大家好,游戏开始了,欢迎大家收看这一期的讲解.本次的内容是图片的上传预览.最后发源码链接.废话不多说,先上图. 待上传图像 点击蓝色框内,pc可以选择文件,移动端选择拍照或选择图片进行上传 ...

  8. Mybatis传多个参数(三种解决方案) mapper.xml的sql语句修改!

    第一种 Public User selectUser(String name,String area); 对应的Mapper.xml <select id="selectUser&qu ...

  9. db2用户权限赋值

    <!------------创建db2用户和组-------------------------------------------> [root@localhost ~]# userad ...

  10. Java实体类之间的映射(一对一关系)

    如下描述:一个人有有一个身份证 一个身份证只能属于某一个人 /** 一个人有有一个身份证 一个身份证只能属于某一个人 */ class Person{ //人 private String name; ...