สร้างแอพที่ทำงานแบบออฟไลน์

Sep 16, 2025
วิธีการ

เป็นเวลานานฟังก์ชั่นออฟไลน์การซิงโครไนซ์พื้นหลังและการแจ้งเตือนแบบพุชมีแอพพื้นเมืองที่แตกต่างจากเว็บเคาน์เตอร์ของพวกเขา ที่ พนักงานบริการ API เป็นเทคโนโลยีที่เปลี่ยนแปลงเกมที่ทำให้เกิดสนามเด็กเล่น ในบทช่วยสอนนี้เราจะใช้มันเพื่อสร้างหน้าเว็บที่สามารถให้บริการเนื้อหาได้แม้ว่าจะไม่มีการเชื่อมต่ออินเทอร์เน็ต

01. เซิร์ฟเวอร์ HTTPS

วิธีที่ง่ายที่สุดในการคิดเกี่ยวกับพนักงานบริการคือเป็นชิ้นส่วนของรหัสที่ติดตั้งโดยไซต์บนเครื่องไคลเอนต์ทำงานในพื้นหลังและต่อมาจะช่วยให้คำขอที่ส่งไปยังไซต์นั้นเพื่อสกัดกั้นและจัดการ เพราะนี่เป็นความสามารถที่ทรงพลังในการทำงานกับพนักงานบริการในสภาพแวดล้อมแบบสดคุณจะต้องทำงานผ่าน HTTPS สิ่งนี้ทำให้มั่นใจได้ว่าพวกเขาไม่สามารถใช้ประโยชน์ได้โดยตรวจสอบให้แน่ใจว่าพนักงานบริการของเบราว์เซอร์ได้รับจากหน้าเป็นของแท้

อย่างไรก็ตามเพื่อการพัฒนาเราสามารถทำงานได้โดยไม่มี HTTPS ตั้งแต่ http: // localhost / ได้รับอนุญาตให้เป็นข้อยกเว้นสำหรับกฎนี้ วิธีที่ง่ายที่สุดในการเริ่มต้นคือกับ NPM http-server แพคเกจ

 NPM ติดตั้ง http-server -g
http-server -p 8000 -C-1 

02. ตั้งค่าหน้าพื้นฐาน

ตอนนี้ไม่มีอะไรบนเซิร์ฟเวอร์ดังนั้นเรามาสร้างหน้าพื้นฐานเพื่อให้บริการ เราจะสร้างไฟล์ index.html ใหม่และเมื่อเราเรียกใช้เซิร์ฟเวอร์มันจะสามารถเข้าถึงได้ที่ http: // localhost: 8000 .

ในขั้นตอนนี้คุณจะพบว่าหากคุณยุติเซิร์ฟเวอร์ HTTP และรีเฟรชหน้าในเบราว์เซอร์คุณจะได้รับหน้าข้อผิดพลาดเนื่องจากไม่สามารถเข้าถึงไซต์ได้ สิ่งนี้คาดหวังทั้งหมดเนื่องจากเรายังไม่ได้แคชเนื้อหาออฟไลน์เลย

 & lt;! Doctype HTML & GT;
& lt; html & gt;
  & lt; หัว & gt;
  & lt; Meta Charset = "UTF-8" / & GT;
  & lt; ชื่อ & gt; พนักงานบริการ & lt; / ชื่อ & gt;
  & lt; script src = "site.js" & gt; & lt; / script & gt;
  & lt; link rel = "stylesheet" type = "text / css" href = "custom.css" & gt;
  & lt; / head & gt;
  & lt; ร่างกาย & gt;
  & lt; ส่วนหัว & gt;
  & lt; h1 & gt; ยินดีต้อนรับ & lt; / h1 & gt;
  & lt; / ส่วนหัว & gt;
  & lt; div id = "เนื้อหา" & gt;
  & lt; p & gt; เนื้อหาที่นี่ & lt; / p & gt;
  & lt; img src = "kitty.jpg" width = "100%" & gt;
  & lt; / div & gt;
  & lt; / body & gt;
& lt; / html & gt; 

03. ลงทะเบียนพนักงานบริการ

ตอนนี้เราได้รับหน้าการทำงานที่ไม่มีที่รู้จักค่อนข้างน้อยและถึงเวลาที่จะเริ่มคิดเกี่ยวกับการใช้งานพนักงานบริการ ก่อนที่เราจะทำการเข้ารหัสมันคุ้มค่าที่จะใช้เวลาสักครู่เพื่อทำความเข้าใจกับวงจรชีวิตของพนักงานบริการ

กระบวนการเริ่มต้นด้วย 'การลงทะเบียน' ของพนักงานบริการใน JavaScript ของคุณซึ่งบอกเบราว์เซอร์เริ่มติดตั้งผู้ปฏิบัติงาน - ขั้นตอนแรกของวงจรชีวิตของมัน ตลอดวงจรชีวิตของมันพนักงานบริการจะอยู่ในสถานะต่อไปนี้:

  • การติดตั้ง: เมื่อลงทะเบียนพนักงานบริการแล้วการติดตั้งมักใช้ในการดาวน์โหลดและแคชเนื้อหาคงที่
  • ติดตั้ง: คนงานพร้อมใช้งานในทางทฤษฎี แต่ไม่เปิดใช้งานทันที
  • เปิดใช้งาน: พนักงานบริการที่ติดตั้งจะเปิดใช้งานตัวเองหากไม่มีพนักงานบริการที่มีอยู่หรือเงื่อนไขบางประการนำไปสู่การหมดอายุ โดยทั่วไปการเปิดใช้งานจะใช้เพื่อล้างไฟล์เก่าจากเนื้อหาออฟไลน์แคช
  • เปิดใช้งาน: พนักงานบริการตอนนี้มีการควบคุมเอกสารและสามารถจัดการคำขอได้
  • ซ้ำซ้อน: หากพนักงานบริการล้มเหลวในการติดตั้งหรือเปิดใช้งานหรือหากถูกแทนที่ด้วยพนักงานบริการรุ่นใหม่

04. ตรวจสอบว่าคุณลงทะเบียนแล้ว

มาลงทะเบียนพนักงานบริการกันเถอะ สิ่งนี้ชี้ให้เห็นเบราว์เซอร์อย่างมีประสิทธิภาพกับไฟล์ JavaScript ซึ่งกำหนดพฤติกรรมของผู้ปฏิบัติงานบริการ การลงทะเบียนเสร็จสิ้นโดยใช้วัตถุ ServiceWorker ซึ่งเป็นจุดเข้าสู่ API นอกจากนี้เรายังตรวจสอบ API ที่นำเสนอในเบราว์เซอร์ก่อนที่จะพยายามทำเช่นนั้น

ที่ ลงทะเบียน () ฟังก์ชั่นสามารถเรียกได้อย่างปลอดภัยทุกครั้งที่โหลดหน้าเว็บและเบราว์เซอร์จะพิจารณาว่าพนักงานบริการได้รับการลงทะเบียนแล้วหรือไม่

 ถ้า ('ServiceWorker' ใน Navigator) {
  window.addeventristener ('โหลด', ฟังก์ชั่น () {
  navigator.serviceworker.register ('serviceworker.js', {ขอบเขต: './'' )).then(Function(registration) {
  Console.log ("พนักงานบริการที่ลงทะเบียนสำเร็จ");
  }, ฟังก์ชั่น (ข้อผิดพลาด) {
  console.log ("ข้อผิดพลาดการลงทะเบียนพนักงานบริการ:" + ข้อผิดพลาด);
  });
  });
} 

05. ใช้งานพนักงานบริการ

ต่อไปเราต้องใช้พนักงานบริการเอง พนักงานบริการสามารถฟังช่วงของเหตุการณ์ที่เกี่ยวข้องกับวงจรชีวิตและกิจกรรมของตัวเองในหน้า สิ่งที่สำคัญที่สุดคือการติดตั้งเปิดใช้งานและดึงข้อมูล

เริ่มต้นด้วยการสร้างผู้ฟังสำหรับ ติดตั้ง เหตุการณ์ที่ทริกเกอร์เมื่อการติดตั้งของคนงานเสร็จสมบูรณ์ สิ่งนี้ทำให้เราสามารถสั่งให้พนักงานบริการเพิ่มเนื้อหาออฟไลน์ในโฟลเดอร์ปัจจุบันไปยังแคช นอกจากนี้เรายังต้องตั้งชื่อแคชของเรา - เนื่องจากแคชเก่าสามารถคงอยู่อัปเดต / กำหนดเวอร์ชันชื่อแคชนี้ช่วยให้คุณสามารถให้บริการเนื้อหาเวอร์ชันที่ใหม่กว่าในภายหลัง

 var currentcache = 'demo-cache';
Self.addEventListener ('ติดตั้ง' เหตุการณ์ = & GT; {
  event.waituntil (
  caches.open (currentcache). จากนั้น (ฟังก์ชั่น (แคช) {
  console.log ("การเพิ่มเนื้อหาลงในแคช");
  ส่งคืน cache.addall ([
  './index_offline.html'
  './kitty_offline.jpg'
  './custom.css'
  ]);
  })
  );
}); 

06. การดึงข้อมูลเหตุการณ์

หน้าของเราจะเป็นเนื้อหาแคชเมื่อโหลด แต่เราต้องการกลไกบางอย่างเพื่อสกัดกั้นการร้องขอและเปลี่ยนเส้นทางไปยังแคชนี้ ในการทำเช่นนี้เราต้องฟัง ดึง เหตุการณ์ที่เกิดขึ้นเมื่อมีการร้องขอเช่นการรับของเรา index.html ไฟล์ถูกสร้างขึ้นทั่วทั้งเครือข่าย จากนั้นเราจับคู่คำขอกับแคชและให้บริการทรัพยากรแคชหากพบ มิฉะนั้นเราจะถอยกลับไปที่คำขอดึง API ไปยังเซิร์ฟเวอร์

มันคุ้มค่า ณ จุดนี้สังเกตว่าเรามีการพึ่งพา JavaScript อย่างหนักเพื่อทำงาน สิ่งเหล่านี้อาจเป็นเรื่องยากเล็กน้อยดังนั้นควรทำความคุ้นเคยกับถ้าคุณไม่ได้ใช้มาก่อน

 Self.addEventListener ('Fetch', Event = & GT; {
  event.rondnith (
  caches.match (event.request) จากนั้น (ตอบสนอง = & gt; {
  กลับมาตอบกลับ || ดึงข้อมูล (event.request);
  })
   );
    }); 

07. ขยายเหตุการณ์ Fetch

หากคุณทดสอบตอนนี้ (ยกเลิกเซิร์ฟเวอร์ HTTP และรีเฟรชหน้า) คุณควรพบว่าหน้าเว็บของคุณทำงานทั้งออนไลน์และออฟไลน์ อย่างไรก็ตามเป็นไปได้ว่าคุณจะต้องการพฤติกรรมออฟไลน์ที่ชาญฉลาดมากขึ้นด้วยเนื้อหาหรือฟังก์ชั่นที่แตกต่างกันเมื่อเซิร์ฟเวอร์ไม่พร้อมใช้งาน

เพื่อให้บรรลุเป้าหมายนี้เราสามารถขยายของเรา ดึง การตอบสนองกิจกรรมเพิ่มเติมเพื่อตรวจสอบการร้องขอการนำทางโดยเฉพาะและตอบกลับด้วยหน้าออฟไลน์ที่แตกต่างกันเมื่อตรวจพบ นี้ index_offline.html ไฟล์สามารถเป็นรูปแบบของหน้าออนไลน์ของคุณหรือสิ่งที่แตกต่างอย่างสิ้นเชิงและยังสามารถใช้ทรัพยากรอื่น ๆ ที่คุณแคชเช่น custom.css .

 Self.addEventListener ('Fetch', Event = & GT; {
  ถ้า (event.request.mode === 'นำทาง') {
  event.rondnith (
  ดึงข้อมูล (event.request). catch (ข้อผิดพลาด = & gt; {
  Console.log ("ไม่พร้อมใช้งานหน้าเนื้อหาออฟไลน์กลับมา");
  ส่งคืน caches.match ('./ index_offline.html');
  })
  );
  } อื่น {
  event.rondnith (
  caches.match (event.request) จากนั้น (ตอบสนอง = & gt; {
  กลับมาตอบกลับ || ดึงข้อมูล (event.request);
  })
  );
  }
}); 

08. ลบแคช

มีอีกสิ่งหนึ่งที่เราต้องการ หากคุณลองแก้ไขเนื้อหาออฟไลน์ของคุณคุณจะพบว่ามันไม่อัปเดตเมื่อคุณทดสอบหน้าเว็บของคุณ - คุณยังคงได้รุ่นเก่า! นี่เป็นเพราะไฟล์เก่ายังคงถูกแคช

คุณต้องใช้บางสิ่งบางอย่างเพื่อทำความสะอาดไฟล์ที่ล้าสมัยจากแคชเพื่อป้องกันการเสิร์ฟ สิ่งนี้ทำโดยตอบสนองต่อ เปิดใช้งาน เหตุการณ์และการลบแคชทั้งหมดที่ไม่ตรงกับชื่อที่ระบุในปัจจุบัน จากนั้นคุณสามารถเพิ่มหมายเลขเวอร์ชันเป็น CruteCache ทุกครั้งที่คุณแก้ไขเนื้อหาออฟไลน์ของคุณเพื่อให้แน่ใจว่าการรีเฟรช

 this.addeventlistener ('เปิดใช้งาน', เหตุการณ์ = & gt; {
  var activeces = [currentcache];
  เปิดใช้งาน Console.log ("พนักงานบริการตรวจสอบการตรวจสอบแคชเป็นปัจจุบัน");
  event.waituntil (
  caches.keys () จากนั้น (keylist = & gt; {
  ส่งคืนสัญญาทั้งหมด (keylist.map (ปุ่ม = & GT; {
  ถ้า (activecaches.indexof (key) === -1) {
  Console.log ("การลบแคชเก่า" + คีย์);
  ส่งคืน caches.delete (ปุ่ม);
  }
  }));
  })
  );
}); 

บทความนี้ถูกตีพิมพ์ในนิตยสาร Web Designer ฉบับที่ 268 สมัครสมาชิกตอนนี้

อ่านเพิ่มเติม:

  • คู่มือของ Coder สำหรับ APIs
  • เริ่มต้นกับ WebGL โดยใช้ Three.js
  • 12 แนวโน้มการออกแบบเว็บไซต์ขนาดใหญ่สำหรับปี 2018

วิธีการ - บทความยอดนิยม

วิธีการรหัสเอฟเฟกต์ข้อความสมาร์ทด้วย CSS

วิธีการ Sep 16, 2025

[ภาพ: เด็กกลาง] ลิงก์แบบโรลโอเวอร์เป็นวิธี�..


วิธีสร้างเอฟเฟกต์ของเหลวกับ WebGL

วิธีการ Sep 16, 2025

นักออกแบบเว็บไซต์จำนวนมากมองหาวิธีเพิ่มผลกร..


สร้างแปรงตัวอักษรของคุณเองใน Illustrator

วิธีการ Sep 16, 2025

หนึ่งในสิ่งที่ดีที่สุดเกี่ยวกับนักวาดภาพประ..


วิธีการปรับใบหน้าสำหรับแอนิเมชั่น

วิธีการ Sep 16, 2025

เมื่อฉันเรียนรู้ครั้งแรกที่จะสร้าง Rigs ตัวละคร..


พัฒนาทักษะศิลปะแนวคิดของคุณใน Photoshop

วิธีการ Sep 16, 2025

สำหรับการประชุมเชิงปฏิบัติการนี้ฉันต้องการแ..


วิธีใช้แบบอักษรเว็บ

วิธีการ Sep 16, 2025

ต่อไปนี้เป็นข้อความที่ตัดตอนมาจากคู่มือกา�..


Sculpt กายวิภาคสมจริงใน ZBrush

วิธีการ Sep 16, 2025

หน้า 1 จาก 2: หน้า 1 หน้า 1 หน้า 2 ..


วิธีการสร้างโลกสำหรับโรงภาพยนตร์

วิธีการ Sep 16, 2025

เมื่อถูกขอให้ทำเวิร์กช็อปในการสร้างสภาพแวดล..


หมวดหมู่