├── .gitignore
├── nodemon.json
├── static
├── img
│ └── avatar_v1.jpg
└── js
│ └── index_v2.js
├── README.md
├── package.json
├── index.html
├── server.js
└── sw
└── sw.js
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/nodemon.json:
--------------------------------------------------------------------------------
1 | {
2 | "verbose": true,
3 | "ignore": ["node_modules/*"]
4 | }
5 |
--------------------------------------------------------------------------------
/static/img/avatar_v1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/youngwind/service-worker-demo/HEAD/static/img/avatar_v1.jpg
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ```
2 | npm install
3 | npm run dev
4 | ```
5 | 第一次在线访问:localhost:8088
6 |
7 | 断开网络之后,仍然可以访问。
8 |
9 | 对应的文章说明:https://github.com/youngwind/blog/issues/113
--------------------------------------------------------------------------------
/static/js/index_v2.js:
--------------------------------------------------------------------------------
1 | $.ajax('/getList').done(function (res) {
2 | res.data.forEach(item => {
3 | $('#list').append(`
${item}`)
4 | })
5 | });
6 | console.log('>>>>>>>', 2);
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "service-worker-demo",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "server.js",
6 | "scripts": {
7 | "dev": "nodemon server.js",
8 | "start": "node server.js"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "koa": "^2.4.1",
14 | "koa-logger": "^3.1.0",
15 | "koa-router": "^7.4.0",
16 | "koa-static": "^4.0.2"
17 | },
18 | "devDependencies": {
19 | "nodemon": "^1.14.11"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Service Worker Demo
6 | 图片头像
7 |
8 |
9 | Ajax Get 数据
10 |
11 |
12 |
13 |
14 |
15 |
26 |
27 |
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | const Koa = require('koa');
2 | const fs = require('fs');
3 | const path = require('path');
4 | const serve = require('koa-static');
5 | const logger = require('koa-logger');
6 | const Router = require('koa-router');
7 |
8 | const app = new Koa();
9 | const router = new Router();
10 | app.use(logger());
11 | app.use(serve('sw'));
12 | app.use(serve('static', {
13 | maxage: 365 * 24 * 60 * 60 * 1000
14 | }));
15 |
16 | router.get('/', ctx => {
17 | let html = fs.readFileSync(path.resolve(__dirname, 'index.html'), 'utf-8');
18 | ctx.body = html;
19 | });
20 |
21 | router.get('/getList', ctx => {
22 | ctx.body = {
23 | code: 0,
24 | data: [
25 | "aaa", "bbb", "ccc"
26 | ]
27 | }
28 | });
29 |
30 | app.use(router.routes())
31 | .use(router.allowedMethods());
32 |
33 | app.listen(8088, () => {
34 | console.log('服务启动,端口号为:8088');
35 | });
--------------------------------------------------------------------------------
/sw/sw.js:
--------------------------------------------------------------------------------
1 | const VERSION = 'v7';
2 | const CACHE_NAME = 'service-worker-demo' + VERSION;
3 |
4 | console.log('begin');
5 |
6 | this.addEventListener('install', function (event) {
7 | console.log('安装 sw.js');
8 | event.waitUntil(
9 | caches.open(CACHE_NAME).then(function (cache) {
10 | return cache.addAll([
11 | './',
12 | 'getList',
13 | 'img/avatar_v1.jpg',
14 | 'js/index_v2.js',
15 | 'js/jquery_v1.js'
16 | ]);
17 | })
18 | )
19 | });
20 |
21 | this.addEventListener('activate', function (event) {
22 | console.log('激活 sw.js,可以开始处理 fetch 请求。');
23 | event.waitUntil(
24 | caches.keys().then(function (keyList) {
25 | return Promise.all(keyList.map(function (key) {
26 | if (CACHE_NAME.indexOf(key) === -1) {
27 | return caches.delete(key);
28 | }
29 | }))
30 | })
31 | )
32 | });
33 |
34 | this.addEventListener('fetch', function (event) {
35 | event.respondWith(
36 | caches.match(event.request)
37 | .then(function (resp) {
38 | if (resp) {
39 | console.log(new Date(), 'fetch ', event.request.url, '有缓存,从缓存中取');
40 | return resp;
41 | } else {
42 | console.log(new Date(), 'fetch ', event.request.url, '没有缓存,网络获取');
43 | return fetch(event.request)
44 | .then(function (response) {
45 | return caches.open(CACHE_NAME).then(function (cache) {
46 | cache.put(event.request, response.clone());
47 | return response;
48 | })
49 | })
50 | }
51 | })
52 | )
53 | });
54 | console.log('end');
--------------------------------------------------------------------------------