当前位置: 首页 > 编程日记 > 正文

pwa+webpack,初探与踩坑

0.前言

我们都知道pwa是一个新技术.,依靠缓存,离线了还能正常跑,而且秒开。我把以前原生写的小游戏迁移到react,再迁移到webpack+react,最后再升级到pwa。具体介绍不多说,我们开始撸吧。

1.webpack

webpack攻略有很多,不啰嗦了,简单介绍一些重点。记住几个点:入口entry、出口output、插件plugins、模块加载器loader。接下来你一个完整的项目的相关操作至少要包含这些。

还有一个就是path模块,专门读取路径的,做一切的配置前,首先把路径搞好吧:

//一般我们就是这样子做的
var path = require("path");
var ROOT_PATH = path.resolve(__dirname);//当前主入口目录
var SRC_PATH = path.resolve(ROOT_PATH,"src");//src,你写的代码在这里
var DIST_PATH = path.resolve(ROOT_PATH,"dist");//打包结果
var COMP_PATH = path.resolve(SRC_PATH,"component");//vue、react都有的component//然后我们的配置里面
var config = {mode:'development',entry: path.resolve(__dirname, './src/index.js'),//webpack把主入口html变成js,然后注入htmloutput:{path:DIST_PATH,filename:"bundle.js"},
}
复制代码

模块加载器,一般我们不用预处理器的话,继续在config里面添加配置,这样子就基本满足需求

    module:{rules:[{test:/\.(es6|js)$/,//考虑到es6use:[{loader:"babel-loader",}],exclude:/node_modules/   //不把nodemodules考虑进去},{test:/\.(css)$/,use:[{loader:"style-loader"},{loader:"css-loader"}],exclude:/node_modules/},{test:/\.(png|jpeg|jpg|gif)$/,use:[{loader:"url-loader",}],exclude:/node_modules/}]}
复制代码

对于插件,我们一般就用htmlWebpackPlugin和热更新就差不多了

    plugins:[new webpack.HotModuleReplacementPlugin(),new htmlWebpackPlugin({title: 'game',template: path.resolve(__dirname, './index.html'),//bunld.js会注入里面inject: true}),new OfflinePlugin() //这是pwa用的,等下讲到]
复制代码

还有一个服务器:

var server = new WebpackDevServer(webpack(config), {contentBase: path.resolve(__dirname, './dist'), //默认会以根文件夹提供本地服务器,这里指定文件夹historyApiFallback: true, //这是history路由,如果设置为true,所有的跳转将指向index.htmlport: 9090, //默认8080publicPath: "/", //本地服务器所加载的页面所在的目录hot: true, //热更新inline: true, //实时刷新historyApiFallback: true //不跳转
});
server.listen(9090, 'localhost', function (err) {if (err) throw err
})
复制代码

哦,对了,列举一下require清单和package.json:

var webpack = require("webpack");
var path = require("path");
var htmlWebpackPlugin = require("html-webpack-plugin");
var webpackDelPlugin = require("webpack-del-plugin");
var WebpackDevServer = require('webpack-dev-server');
var ROOT_PATH = path.resolve(__dirname);
var SRC_PATH = path.resolve(ROOT_PATH,"src");
var DIST_PATH = path.resolve(ROOT_PATH,"dist");
var TEM_PATH = path.resolve(SRC_PATH,"component");
var  OfflinePlugin = require('offline-plugin')//package.json
{"name": "pwawebpack","version": "1.0.0","main": "index.js","license": "MIT","dependencies": {"jquery": "^3.3.1","react-scripts": "1.1.1"},"devDependencies": {"babel-core": "^6.26.3","babel-loader": "^7.1.4","babel-plugin-react-transform": "^3.0.0","babel-preset-es2015": "^6.24.1","babel-preset-react": "^6.24.1","babel-preset-react-hmre": "^1.1.1","css-loader": "^0.28.11","file-loader": "^1.1.11","html-webpack-plugin": "^3.2.0","offline-plugin": "^5.0.3","react": "^16.3.2","react-dom": "^16.3.2","react-transform-hmr": "^1.0.4","style-loader": "^0.21.0","url-loader": "^1.0.1","webpack": "^4.8.3","webpack-cli": "^2.1.3","webpack-del-plugin": "0.0.2","webpack-dev-server": "^3.1.4","webpack-notifier": "^1.6.0"},"scripts": {"dev": "webpack-dev-server --inline --progress --config webpack.config.js"}
}
复制代码

为了快点看到pwa+webpack的效果,那我们eslint、test就不写了

2.pwa

我们就拿百度到的那些例子说吧,一个正常的pwa,由index.html、一个css、一个manifest.json、一个sw.js。我们要启动一个pwa,这是必备的。 其实,是不是看起来有点像谷歌浏览器的扩展?有没有试过自己写谷歌浏览器插件,比如屏蔽广告的、个人工具的、某些网站收藏夹等等插件。毕竟一家人,所以看起来也有点像。

html:

<head><title>PWA</title><meta name="viewport" content="width=device-width, user-scalable=no" /><link rel="stylesheet" type="text/css" href="main.css">
</head>
<body><h1>1</h1>
</body>
复制代码

manifest.json:其实和自己写的浏览器扩展差不多,就是一些关于名字、样式、logo的配置

{"name": "PWA","short_name": "p","display": "standalone","start_url": "/","theme_color": "#0000ff","background_color": "#00ff00","icons": [{"src": "logo.png","sizes": "256x256","type": "image/png"}]
}
复制代码

sw具体介绍 点这里 生命周期的话,也不多说了,几个阶段:解析Parsed、安装Installed、激活Activated,中间失败的话直接跳到废弃Redundant阶段,然后我们监听这些事件,我们直接看效果。

var cacheStorageKey = 'v1'var cacheList = ['/',"index.html","main.css","logo.png"
]self.addEventListener('install', e => {e.waitUntil(caches.open(cacheStorageKey).then(cache => cache.addAll(cacheList)).then(() => self.skipWaiting()))
})self.addEventListener('fetch', function(e) {e.respondWith(caches.match(e.request).then(function(response) {if (response != null) {return response}return fetch(e.request.url)}))
})self.addEventListener('activate', function(e) {e.waitUntil(Promise.all(caches.keys().then(cacheNames => {return cacheNames.filter(name => name !== cacheStorageKey).map(name=>caches.delete(name))})).then(() => {return self.clients.claim()}))
})
复制代码

注意了,pwa需要https或者localhost,因为这东西能把你本地的文件都拉取了,那也有可能干其他事情,所以必须是要在安全的情况下跑的。还有,是不是发现改了html、js文件,清空缓存都不更新呢?其实改一下sw就可以了,manifest做应用缓存也是,改个版本号,或者加个空格就行。

3.基于webpack的pwa

文档见官网

我们不用配置就可以跑起来,但是配置里面有些地方需要注意的而且不能乱改,自行看文档。配置常用的是:caches(默认全部缓存,也可以自己设置),externals(数组形式,表示其他资源如cdn),excludes(数组形式,除了哪些不能被缓存),autoUpdate(多久后更新,默认一小时)

我们使用offline-plugin这个插件,只需要在插件里面直接引入即可:

 plugins: [// ... 其他插件new OfflinePlugin()]
复制代码

接着在我们的入口文件index.js加入:

import * as OfflinePluginRuntime from 'offline-plugin/runtime';
OfflinePluginRuntime.install();
复制代码

这样子直接跑webpack就ok了,试一下谷歌浏览器offline模式,你会发现还是能跑:

相关文章:

linux sar 命令详解

sar&#xff08;System Activity Reporter系统活动情况报告&#xff09;是目前 Linux 上最为全面的系统性能分析工具之一&#xff0c;可以从多方面对系统的活动进行报告&#xff0c;包括&#xff1a;文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程…

PHP底层工作原理

简介 先看看下面这个过程&#xff1a; 我们从未手动开启过PHP的相关进程&#xff0c;它是随着Apache的启动而运行的&#xff1b;PHP通过mod_php5.so模块和Apache相连&#xff08;具体说来是SAPI&#xff0c;即服务器应用程序编程接口&#xff09;&#xff1b;PHP总共有三个模…

使用 Pandas、Jinja 和 WeasyPrint,轻松创建一个 PDF 报表

作者 |周萝卜来源 |萝卜大杂烩我们都知道&#xff0c;Pandas 擅长处理大量数据并以多种文本和视觉表示形式对其进行总结&#xff0c;它支持将结构输出到 CSV、Excel、HTML、json 等。但是如果我们想将多条数据合并到一个文档中&#xff0c;就有些复杂了。例如&#xff0c;如果要…

通过Excel生成批量SQL语句

项目中有时会遇到这样的要求&#xff1a;用户给发过来一些数据&#xff0c;要我们直接给存放到数据库里面&#xff0c;有的是Insert&#xff0c;有的是Update等等&#xff0c;少量的数据我们可以采取最原始的办法&#xff0c;也就是在SQL里面用Insert into来实现&#xff0c;但…

抵御「黄貂鱼」攻击,谷歌使出禁用2G「大招」

整理 | 于轩 责编 | 张红月出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;你还在使用2G吗&#xff1f;相信很多人第一反应都是“怎么可能&#xff1f;”确实&#xff0c;现在绝大数人都在使用技术成熟的4G网络&#xff0c;以及更高网速的5G。但是你有注意到…

Crontab运行php脚本

首先&#xff0c;确认 PHP 可执行文件的位置 —— 对于大多数 Linux 系统&#xff0c;几乎肯定是 /usr/bin/php。如果不确定其位置&#xff0c;请在命令行中键入 which php 并查看响应内容。 其次&#xff0c;键入以下代码&#xff0c;确保将 /usr/bin/php 替换为 PHP 可执行文…

iOS原生如何加载HTML中img标签的图片

原文出自&#xff1a;iOS原生如何加载HTML中img标签的图片 前言 最近iOS App项目中使用Webview加载H5页面比较多&#xff0c;也有不少朋友经常问到这个问题&#xff0c;在这里我也学习学习如何通过iOS原生的方式来加载H5页面中的图片然后让webview显示图片。 相信有很多朋友也…

Python3 的urllib实例

在Python3中合并了 urllib 和 urllib2&#xff0c; 统一命名为 urllib 了&#xff0c;我觉得这样更加合理了。让我们可以像读取本地文件一样读取WEB上的数据。封装了一个类&#xff0c;供以后方便使用吧&#xff01;并附带有许多的应用实例。 一、封装的类 #!/usr/bin/env pyth…

Java中Filter、Servlet、Listener的学习

1、Filter的功能filter功能&#xff0c;它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chainin…

CentOS 6安装DHCP

#wget ftp://ftp.isc.org/isc/dhcp/dhcp-4.2.3/dhcp-4.2.3.tar.gz #tar xvzf dhcp-4.2.3.tar.gz# cd dhcp-4.2.3#./configure #make #make install

小米AI实验室六篇论文获ICASSP2022收录,多模态语音唤醒挑战赛夺冠

1月22日&#xff0c;全球语音、声学顶级会议ICASSP 2022公布了论文入选名单&#xff0c;小米AI实验室6篇学术论文被接收。小米“自由说”系统在MISP&#xff08;基于多模态信息的语音处理&#xff09;挑战赛中荣获多模态语音唤醒第一名和多模态语音识别第二名&#xff0c;并受邀…

React + Koa 实现服务端渲染(SSR)

⚛️React是目前前端社区最流行的UI库之一&#xff0c;它的基于组件化的开发方式极大地提升了前端开发体验&#xff0c;React通过拆分一个大的应用至一个个小的组件&#xff0c;来使得我们的代码更加的可被重用&#xff0c;以及获得更好的可维护性&#xff0c;等等还有其他很多…

11 款可替代 top 命令的工具!

‍‍作者 | JackTian来源 | 杰哥的IT之旅在 Linux 环境下 top 命令都不陌生&#xff0c;它以实时动态的方式查看系统的整体运行情况&#xff0c;综合了多方信息监测系统性能和运行信息的实用工具&#xff0c;通过 top 命令所提供的互动式界面&#xff0c;可以用热键来进行管理。…

几个重要的RFC

RFC目录 权威无须解释 http://www.ietf.org/rfc/RFC中文目录http://man.chinaunix.net/develop/rfc/default.htm几个常用的RFC参考&#xff1a; RFC1945 超文本传输协议--HTTP/1.0 RFC2616超文本传输协议--HTTP/1.1 对 RFC2068的补充RFC3920可扩展的消息和出席信息协议 (XMPP)…

iOS开发笔记-两种单例模式的写法

iOS开发笔记&#xff0d;两种单例模式的写法 单例模式是开发中最常用的写法之一&#xff0c;iOS的单例模式有两种官方写法&#xff0c;如下&#xff1a; 不使用GCD #import "ServiceManager.h"static ServiceManager *defaultManager;implementation ServiceManager(…

流式大数据处理的三种框架:Storm,Spark和Samza

2019独角兽企业重金招聘Python工程师标准>>> 许多分布式计算系统都可以实时或接近实时地处理大数据流。本文将对三种Apache框架分别进行简单介绍&#xff0c;然后尝试快速、高度概述其异同。 Apache Storm 在Storm中&#xff0c;先要设计一个用于实时计算的图状结构…

CentOS用yum安装X Window

安装X图形界面系统yum list 列出所有可安装的软件包 可以通过 yum grouplist 来查看可能批量安装哪些列表 先装X windows #yum groupinstall X Window System -y 安装GNOME桌面环境#yum groupinstall GNOME Desktop Environment -y 安装KDE桌面环境#yum groupinstall KDE (K D…

Oracle VDI 安装

为什么80%的码农都做不了架构师&#xff1f;>>> 你可以在这里找到本文的原文。 虽然说Oracle已经停止了VDI的开发&#xff0c;之后支持服务业很快停止了。但是&#xff0c;作为经典的桌面虚拟化产品&#xff0c;还是值得研究一番。虽然Oracle VDI的文档已经写的很详…

Python 写了一个网页版的「P图软件」,惊呆了!

作者 | 小欣来源 | Python爱好者集中营今天是开工第一天&#xff0c;这篇文章可以算作是虎年的第一篇干货技术类文章了&#xff0c;今天小编用Python做了一个网页版的“P图软件”&#xff0c;大致的流程在于我们可以将上传的照片进行黑白处理、铅笔素描处理、模糊化处理等一系列…

Template mode HTML5 has not been configured

#thymeleafspring.thymeleaf.prefixclasspath:/templates/spring.thymeleaf.suffix.htmlspring.thymeleaf.cachefalsespring.thymeleaf.content-typetext/htmlspring.thymeleaf.enabledtruespring.thymeleaf.encodingUTF-8spring.thymeleaf.modeHTML5 解决办法&#xff1a;注释…

Java数据结构与算法(第四章栈和队列)

2019独角兽企业重金招聘Python工程师标准>>> 本章涉及的三种数据存储类型&#xff1a;栈、队列和优先级队列。 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构&#xff0c;和其他结构&#xff08;链表、树等等&#xff09;一样&#xff0c;都适用于数…

可构建AI的「AI」诞生:几分之一秒内,就能预测新网络的参数

‍‍来源 | 学术头条人工智能在很大程度上是一场数字游戏。当深度神经网络在 10 年前开始超越传统算法&#xff0c;是因为我们终于有了足够的数据和处理能力来充分利用它们。今天的神经网络更依赖于数据和算力。训练网络时&#xff0c;需要仔细调整表征网络的数百万甚至数十亿参…

It is not safe to rely on the system's timezone settings

在写php程序中有时会出现这样的警告&#xff1a; PHP Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those metho…

.NET MVC+ EF+LINQ 多表联查VIEW显示列表

1.VIEW 页面显示代码 <link href"~/Content/bootstrap.css" rel"stylesheet" /><div class"well"><table class"table"><tr><th>用户名</th><th>地址</th><th>订单编号</th…

从奥运订票系统说起——谈FastCGI 与IT 架构

2008年&#xff0c;对于首都人民来说&#xff0c;没有什么比奥运会更大的事情了。如何买到一张称心如意的比赛门票&#xff0c;也成了很多人的一个梦想。然而&#xff0c;在奥运官网抢票购买的时候&#xff0c;这个梦想却轻易地被网上购票系统的当机击成碎片&#xff0c;很多充…

【哲学百科】文艺复兴及唯理主义时期(公元1500~公元1750)

我为达目的&#xff0c;不择手段-尼古拉.马基雅维利要令习惯于君主统治的民众保有自由是一件多么困难的事情。马基雅维利的观点之一是君主不应受到道德标准的束缚&#xff0c;而应竭尽所能保全自身的荣耀以及所统治的城邦的胜利与繁荣&#xff0c;这种做法随后被人们归为现实主…

如何用 OpenGL 绘制雪花?

作者 | 许向武 责编 | 张红月出品 | CSDN博客看冬奥才知道&#xff0c;阿勒泰不但是中国的“雪都”&#xff0c;还是“人类滑雪起源地”。这个说法是否成立&#xff0c;姑且不论&#xff0c;阿勒泰的雪的确很漂亮。冬奥会有一个宣传片&#xff0c;就是借用一朵阿勒泰雪花…

面试之Hashtable和ConcurrentHashMap

那么要如何保证HashMap的线程安全呢&#xff1f; 方法有很多&#xff0c;比如使用Hashtable或者Collections.synchronizedMap&#xff0c;但是这两位选手都有一个共同的问题&#xff1a;性能。因为不管是读还是写操作&#xff0c;他们都会给整个集合上锁&#xff0c;导致同一时…

PHP动态编译出现Cannot find autoconf

在安装完PHP后,想动态编译PHP的memcache扩展库 cd memcache-2.2.5//usr/local/webserver/php/bin/phpize./configure --with-php-config/usr/local/webserver/php/bin/php-config 但是执行/usr/local/webserver/php/bin/phpize时出现错误:Configuring for:PHP Api Version: …

AnimeGANv2 实现动漫风格迁移,简单操作

作者 | Yunlord出品 | CSDN博客前言之前一直在研究如何将图像动漫化&#xff0c;尝试了阿里云api和百度api&#xff0c;效果都不尽如人意。结果发现了一个宝藏github项目——AnimeGANv2&#xff0c;能够将现实世界场景照片进行动漫风格化。可以看出AnimeGAN的效果非常好&#x…