บทนำ
การพัฒนาเว็บบนมือถือเป็นหัวข้อที่ได้รับความสนใจอย่างมากในปัจจุบัน ปีนี้เป็นปีแรกที่สมาร์ทโฟนขายดีกว่า PC ผู้ใช้จำนวนมากขึ้นเรื่อยๆ ใช้อุปกรณ์เคลื่อนที่เพื่อท่องเว็บ ซึ่งหมายความว่านักพัฒนาซอฟต์แวร์จำเป็นต้องเพิ่มประสิทธิภาพเว็บไซต์สำหรับเบราว์เซอร์บนมือถือ
สนามรบ "มือถือ" ยังคงเป็นพื้นที่ที่ยังไม่มีการสำรวจสำหรับนักพัฒนาซอฟต์แวร์จำนวนมาก หลายคนมีเว็บไซต์เดิมที่ละเลยผู้ใช้อุปกรณ์เคลื่อนที่ไปเลย แต่เว็บไซต์ได้รับการออกแบบมาเพื่อการท่องเว็บในเดสก์ท็อปเป็นหลัก และทำงานได้ไม่ดีในเบราว์เซอร์บนมือถือ เว็บไซต์นี้ (html5rocks.com) ก็ไม่มีข้อยกเว้น ตอนเปิดตัว เราไม่ได้ให้ความสำคัญกับเว็บไซต์เวอร์ชันสำหรับมือถือมากนัก
การสร้าง html5rocks.com ที่เหมาะกับมือถือ
ในฐานะแบบฝึกหัด ฉันคิดว่าน่าสนใจที่จะนำ html5rocks (เว็บไซต์ HTML5 ที่มีอยู่) มาปรับปรุงด้วยเวอร์ชันที่เหมาะกับมือถือ ฉันกังวลเรื่องปริมาณงานขั้นต่ำที่ต้องทำเพื่อกำหนดเป้าหมายสมาร์ทโฟนเป็นหลัก เป้าหมายของแบบฝึกหัดนี้ไม่ใช่การสร้างเว็บไซต์เวอร์ชันอุปกรณ์เคลื่อนที่ใหม่ทั้งหมดและดูแลรักษาฐานของโค้ด 2 ชุด ซึ่งคงใช้เวลานานมาก และเสียเวลาอย่างยิ่ง เราได้กำหนดโครงสร้าง (มาร์กอัป) ของเว็บไซต์ไว้แล้ว เรามีรูปลักษณ์และความรู้สึก (CSS) ฟังก์ชันหลัก (JS) มีอยู่แล้ว ประเด็นคือ เว็บไซต์จำนวนมาก ก็ประสบปัญหานี้เช่นกัน
บทความนี้จะอธิบายวิธีที่เราสร้าง html5rocks เวอร์ชันสำหรับมือถือที่เพิ่มประสิทธิภาพสำหรับอุปกรณ์ Android และอุปกรณ์ iOS เพียงโหลด html5rocks.com บนอุปกรณ์ที่รองรับระบบปฏิบัติการใดระบบปฏิบัติการหนึ่งข้างต้นเพื่อดูความแตกต่าง ไม่มีการเปลี่ยนเส้นทางไปยัง m.html5rocks.com หรือการกระทำที่ไร้สาระอื่นๆ ในลักษณะนั้น คุณจะได้รับ html5rocks ตามที่เป็นอยู่… พร้อมสิทธิประโยชน์เพิ่มเติมจากสิ่งที่ดูดีและทำงานได้ดีบนอุปกรณ์เคลื่อนที่
CSS Media Query
HTML4 และ CSS2 รองรับสไตล์ชีตที่ขึ้นอยู่กับสื่อมาเป็นระยะเวลาหนึ่งแล้ว เช่น
<link rel="stylesheet" media="print" href="printer.css">
จะกำหนดเป้าหมายเป็นอุปกรณ์การพิมพ์และจัดรูปแบบเฉพาะสำหรับเนื้อหาของหน้าเมื่อพิมพ์ CSS3 นำแนวคิดเรื่องประเภทสื่อไปอีกขั้นหนึ่งและปรับปรุงฟังก์ชันการทำงานด้วย Media Queries Media Query ช่วยเพิ่มประโยชน์ของประเภทสื่อโดยช่วยให้ติดป้ายกำกับสไตล์ชีตได้แม่นยำยิ่งขึ้น ซึ่งช่วยให้ปรับแต่งการนำเสนอเนื้อหาให้เหมาะกับอุปกรณ์เอาต์พุตที่หลากหลายได้โดยไม่ต้องเปลี่ยนเนื้อหาเอง เหมาะอย่างยิ่งสำหรับเลย์เอาต์ที่มีอยู่ซึ่งต้องมีการแก้ไข
คุณสามารถใช้ Media Query ในแอตทริบิวต์ media ของสไตล์ชีตภายนอกเพื่อกำหนดเป้าหมายความกว้างของหน้าจอ ความกว้างของอุปกรณ์ การวางแนว ฯลฯ ดูรายการทั้งหมดได้ที่ข้อกำหนดเฉพาะของ Media Query ของ W3C
การกำหนดเป้าหมายขนาดหน้าจอ
ในตัวอย่างต่อไปนี้ phone.css จะใช้กับอุปกรณ์ที่เบราว์เซอร์พิจารณาว่าเป็น "อุปกรณ์มือถือ" หรืออุปกรณ์ที่มีหน้าจอกว้าง <= 320 พิกเซล
<link rel='stylesheet'
media='handheld, only screen and (max-device-width: 320px)' href='phone.css'>
การใส่คีย์เวิร์ด "only" ไว้หน้า Media Queries จะทำให้เบราว์เซอร์ที่ไม่เป็นไปตามข้อกำหนด CSS3 ละเว้นกฎดังกล่าว
ตัวอย่างต่อไปนี้จะกำหนดเป้าหมายขนาดหน้าจอระหว่าง 641 ถึง 800 พิกเซล
<link rel='stylesheet'
media='only screen and (min-width: 641px) and (max-width: 800px)' href='ipad.css'>
Media Query ยังปรากฏในแท็ก <style> ในบรรทัดได้ด้วย เป้าหมายต่อไปนี้จะกำหนดเป้าหมายเป็นสื่อประเภท all เมื่ออยู่ในแนวตั้ง
<style>
@media only all and (orientation: portrait) { ... }
</style>
media="handheld"
เราต้องหยุดสักครู่และพูดคุยเกี่ยวกับ media="handheld"
ความจริงก็คือ Android และ iOS จะละเว้น media="handheld" ข้อโต้แย้งคือผู้ใช้จะพลาดเนื้อหาระดับสูงที่ได้จากสไตล์ชีตที่กำหนดเป้าหมายเป็น media="screen" และนักพัฒนาแอปมีแนวโน้มที่จะดูแลรักษาเวอร์ชัน media="handheld" ที่มีคุณภาพต่ำกว่าน้อยลง ดังนั้น เบราว์เซอร์สมาร์ทโฟนที่ทันสมัยส่วนใหญ่จึงละเว้นสไตล์ชีตสำหรับอุปกรณ์มือถือโดยสิ้นเชิง เพื่อให้เป็นไปตามคติ "เว็บเต็มรูปแบบ"
การใช้ฟีเจอร์นี้เพื่อกำหนดเป้าหมายอุปกรณ์เคลื่อนที่เป็นวิธีที่เหมาะสม แต่เบราว์เซอร์ต่างๆ ได้นำฟีเจอร์นี้ไปใช้ในลักษณะที่แตกต่างกัน ดังนี้
- บางโปรแกรมอ่านเฉพาะสไตล์ชีตสำหรับอุปกรณ์เคลื่อนที่
- บางโปรแกรมจะอ่านเฉพาะสไตล์ชีตสำหรับอุปกรณ์มือถือหากมี แต่จะใช้สไตล์ชีตสำหรับหน้าจอเป็นค่าเริ่มต้นหากไม่มี
- บางโปรแกรมอ่านทั้งสไตล์ชีตสำหรับอุปกรณ์เคลื่อนที่และสไตล์ชีตสำหรับหน้าจอ
- บางโปรแกรมจะอ่านเฉพาะสไตล์ชีตของหน้าจอ
Opera Mini ไม่ละเว้น media="handheld" เคล็ดลับในการทำให้ Windows Mobile รู้จัก media="handheld" คือการใช้อักษรตัวพิมพ์ใหญ่สำหรับค่าแอตทริบิวต์สื่อสำหรับสไตล์ชีตของหน้าจอ ดังนี้
<!-- media="handheld" trick for Windows Mobile -->
<link rel="stylesheet" href="screen.css" media="Screen">
<link rel="stylesheet" href="mobile.css" media="handheld">
วิธีที่ html5rocks ใช้การสืบค้นสื่อ
มีการใช้ Media Query อย่างมากใน html5rocks บนอุปกรณ์เคลื่อนที่ ซึ่งช่วยให้เราปรับแต่งเลย์เอาต์ได้โดยไม่ต้องทำการเปลี่ยนแปลงที่สำคัญกับมาร์กอัปเทมเพลต Django ของเรา… ช่วยชีวิตเราไว้ได้จริงๆ นอกจากนี้ การรองรับในเบราว์เซอร์ต่างๆ ก็ค่อนข้างดี
ใน <head> ของแต่ละหน้า คุณจะเห็นสไตล์ชีตต่อไปนี้
<link rel='stylesheet'
media='all' href='/static/css/base.min.css' />
<link rel='stylesheet'
media='only screen and (max-width: 800px)' href='/static/css/mobile.min.css' />
base.css กำหนดรูปลักษณ์หลักของ html5rocks.com มาโดยตลอด แต่ตอนนี้เรากำลังใช้สไตล์ใหม่ (mobile.css) สำหรับความกว้างของหน้าจอที่ต่ำกว่า 800 พิกเซล การสืบค้นสื่อครอบคลุมสมาร์ทโฟน (~320px) และ iPad (~768px)
ผลลัพธ์: เรากำลังลบล้างสไตล์ใน base.css ทีละน้อย (เฉพาะที่จำเป็น) เพื่อให้สิ่งต่างๆ ดูดีขึ้นในอุปกรณ์เคลื่อนที่
การเปลี่ยนแปลงการจัดรูปแบบบางอย่างที่ mobile.css บังคับใช้มีดังนี้
- ลดช่องว่าง/ระยะห่างจากขอบเพิ่มเติมทั่วทั้งเว็บไซต์ หน้าจอขนาดเล็กหมายความว่าพื้นที่บนหน้าจอมีจำกัด
- นำ
:hoverรัฐออก ซึ่งจะไม่มีทางปรากฏในอุปกรณ์แบบสัมผัส - ปรับเลย์เอาต์ให้เป็นคอลัมน์เดียว เดี๋ยวเราจะไปลงรายละเอียดเพิ่มเติมกันในภายหลัง
- นำ
box-shadowรอบ div คอนเทนเนอร์หลักของเว็บไซต์ออก เงาของกล่องขนาดใหญ่จะลดประสิทธิภาพของหน้าเว็บ - ใช้โมเดล Flexbox ของ CSS
box-ordinal-groupเพื่อเปลี่ยนลำดับของแต่ละส่วนในหน้าแรก คุณจะเห็นว่า "เรียนรู้ตามกลุ่มฟีเจอร์ HTML5 หลัก" อยู่ก่อนส่วน "บทแนะนำ" ในหน้าแรก แต่อยู่หลังส่วนดังกล่าวในเวอร์ชันสำหรับมือถือ การจัดลำดับนี้เหมาะสำหรับอุปกรณ์เคลื่อนที่มากกว่าและไม่จำเป็นต้องเปลี่ยนแปลงมาร์กอัป CSS flexbox FTW! - นำการเปลี่ยนแปลง
opacityรายการออก การเปลี่ยนค่าอัลฟ่าจะส่งผลต่อประสิทธิภาพในอุปกรณ์เคลื่อนที่
เมตาแท็กบนอุปกรณ์เคลื่อนที่
Mobile WebKit รองรับฟีเจอร์ดีๆ บางอย่างที่ช่วยให้ผู้ใช้ได้รับประสบการณ์การท่องเว็บที่ดีขึ้นในอุปกรณ์บางประเภท
การตั้งค่าวิวพอร์ต
การตั้งค่าเมตาแรก (และเป็นค่าที่คุณจะใช้บ่อยที่สุด) คือพร็อพเพอร์ตี้วิวพอร์ต การตั้งค่าวิวพอร์ตจะบอกเบราว์เซอร์ว่าเนื้อหาควรพอดีกับหน้าจอของอุปกรณ์อย่างไร และแจ้งให้เบราว์เซอร์ทราบว่าเว็บไซต์ได้รับการเพิ่มประสิทธิภาพสำหรับอุปกรณ์เคลื่อนที่แล้ว เช่น
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
บอกให้เบราว์เซอร์ตั้งค่าวิวพอร์ตเป็นความกว้างของอุปกรณ์โดยมีมาตราส่วนเริ่มต้นเป็น 1 ตัวอย่างนี้ยังอนุญาตให้ซูมได้ด้วย ซึ่งอาจเป็นสิ่งที่ต้องการสำหรับเว็บไซต์ แต่ไม่ใช่เว็บแอป เราสามารถป้องกันการซูมด้วย user-scalable=no หรือจำกัดการปรับขนาดไว้ที่ระดับหนึ่งได้ ดังนี้
<meta name=viewport
content="width=device-width, initial-scale=1.0, minimum-scale=0.5 maximum-scale=1.0">
Android ขยายเมตาแท็ก Viewport โดยอนุญาตให้นักพัฒนาซอฟต์แวร์ระบุความละเอียดของหน้าจอที่พัฒนาเว็บไซต์ขึ้นมาได้ ดังนี้
<meta name="viewport" content="target-densitydpi=device-dpi">
ค่าที่เป็นไปได้สำหรับ target-densitydpi คือ device-dpi, high-dpi, medium-dpi, low-dpi
หากต้องการแก้ไขหน้าเว็บสำหรับความหนาแน่นของหน้าจอที่แตกต่างกัน ให้ใช้คิวรี่สื่อ CSS -webkit-device-pixel-ratio และ/หรือพร็อพเพอร์ตี้ window.devicePixelRatio ใน JavaScript จากนั้นตั้งค่าพร็อพเพอร์ตี้เมตา target-densitydpi เป็น device-dpi ซึ่งจะหยุดไม่ให้ Android ปรับขนาดในหน้าเว็บของคุณ และช่วยให้คุณทำการปรับเปลี่ยนที่จำเป็นสำหรับความหนาแน่นแต่ละระดับผ่าน CSS และ JavaScript ได้
ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดเป้าหมายความละเอียดของอุปกรณ์ได้ที่เอกสารประกอบ WebView ของ Android
การท่องเว็บแบบเต็มหน้าจอ
มีค่าเมตาอีก 2 ค่าที่เจาะจงสำหรับ iOS apple-mobile-web-app-capable
และ apple-mobile-web-app-status-bar-style จะแสดงผลเนื้อหาของหน้าเว็บ
ในโหมดเต็มหน้าจอแบบแอปและทำให้แถบสถานะโปร่งแสง
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกเมตาทั้งหมดที่มีได้ในเอกสารอ้างอิงของ Safari
ไอคอนหน้าจอหลัก
อุปกรณ์ iOS และ Android ยังยอมรับ rel="apple-touch-icon" (iOS) และ rel="apple-touch-icon-precomposed" (Android) สำหรับลิงก์ด้วย โค้ดเหล่านี้จะสร้างไอคอนที่ดูเหมือนแอปบนหน้าจอหลักของผู้ใช้เมื่อผู้ใช้บุ๊กมาร์กเว็บไซต์ของคุณ
<link rel="apple-touch-icon"
href="/static/images/identity/HTML5_Badge_64.png" />
<link rel="apple-touch-icon-precomposed"
href="/static/images/identity/HTML5_Badge_64.png" />
วิธีที่ html5rocks ใช้เมตาแท็กบนอุปกรณ์เคลื่อนที่
เมื่อนำทุกอย่างมารวมกัน คุณจะได้ข้อมูลโค้ดจากส่วน <head> ของ html5rocks ดังนี้
<head>
...
<meta name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0" />
<link rel="apple-touch-icon"
href="/static/images/identity/HTML5_Badge_64.png" />
<link rel="apple-touch-icon-precomposed"
href="/static/images/identity/HTML5_Badge_64.png" />
...
</head>
เลย์เอาต์แนวตั้ง
การเลื่อนในแนวตั้งจะสะดวกกว่าการเลื่อนในแนวนอนมากเมื่อดูบนหน้าจอขนาดเล็ก การจัดเนื้อหาในเลย์เอาต์แนวตั้งแบบคอลัมน์เดียวเหมาะสำหรับอุปกรณ์เคลื่อนที่ สำหรับ html5rocks เราใช้ CSS3 Media Queries เพื่อสร้างเลย์เอาต์ดังกล่าว โดยไม่ต้องเปลี่ยนมาร์กอัป
การเพิ่มประสิทธิภาพสำหรับมือถือ
การเพิ่มประสิทธิภาพส่วนใหญ่ที่เราทำเป็นสิ่งที่ควรทำตั้งแต่แรกอยู่แล้ว เช่น การลดจำนวนคำขอเครือข่าย การบีบอัด JS/CSS, gzipping (มีให้ใช้ฟรีใน App Engine) และการลดการจัดการ DOM เทคนิคเหล่านี้เป็นแนวทางปฏิบัติแนะนำทั่วไป แต่บางครั้งก็ถูกมองข้ามเมื่อเร่งรีบเปิดตัวเว็บไซต์
ซ่อนแถบที่อยู่โดยอัตโนมัติ
เบราว์เซอร์บนมือถือมีพื้นที่หน้าจอน้อยกว่าเบราว์เซอร์บนเดสก์ท็อป ที่แย่ไปกว่านั้นคือในบางแพลตฟอร์ม คุณอาจพบกับแถบที่อยู่ขนาดใหญ่ที่ด้านบนของหน้าจอ แม้ว่าหน้าเว็บจะโหลดเสร็จแล้วก็ตาม
วิธีง่ายๆ ในการจัดการกับปัญหานี้คือการเลื่อนหน้าเว็บโดยใช้ JavaScript
การเลื่อนลงเพียง 1 พิกเซลก็ช่วยจัดการกับแถบที่อยู่ที่น่ารำคาญได้แล้ว
ในการบังคับซ่อนแถบที่อยู่บน html5rocks ฉันได้แนบเครื่องมือจัดการเหตุการณ์ onload เข้ากับออบเจ็กต์ window และเลื่อนหน้าเว็บในแนวตั้ง 1 พิกเซล
// Hides mobile browser's address bar when page is done loading.
window.addEventListener('load', function(e) {
setTimeout(function() { window.scrollTo(0, 1); }, 1);
}, false);
นอกจากนี้ เรายังรวม Listener นี้ไว้ในตัวแปรเทมเพลต is_mobile เนื่องจากไม่จำเป็นต้องใช้บนเดสก์ท็อป
ลดคำขอเครือข่าย ประหยัดแบนด์วิดท์
เป็นที่ทราบกันดีว่าการลดจำนวนคำขอ HTTP สามารถปรับปรุงประสิทธิภาพได้อย่างมาก อุปกรณ์เคลื่อนที่จะจำกัดจำนวนการเชื่อมต่อพร้อมกันที่เบราว์เซอร์ทำได้ ดังนั้นเว็บไซต์เวอร์ชันอุปกรณ์เคลื่อนที่จะได้รับประโยชน์มากยิ่งขึ้นจากการลดคำขอที่ไม่เกี่ยวข้องเหล่านี้ นอกจากนี้ การลดขนาดทุกไบต์ยังเป็นสิ่งสำคัญเนื่องจากแบนด์วิดท์ในโทรศัพท์มักมีจำกัด คุณอาจทำให้ผู้ใช้เสียเงินโดยไม่จำเป็น
ต่อไปนี้เป็นแนวทางบางส่วนที่เราใช้เพื่อลดคำขอเครือข่ายและลดแบนด์วิดท์ใน html5rocks
นำ iframe ออก - iframe ทำงานช้า เวลาในการตอบสนองส่วนใหญ่ของเรามาจากวิดเจ็ตการแชร์ของบุคคลที่สาม (Buzz, Google Friend Connect, Twitter, Facebook) ในหน้าบทแนะนำ API เหล่านี้รวมอยู่ผ่านแท็ก
<script>และสร้าง iframe ที่ลดความเร็วของหน้าเว็บ ระบบนำวิดเจ็ตออกสำหรับอุปกรณ์เคลื่อนที่display:none- ในบางกรณี เราจะซ่อนมาร์กอัปหากไม่เหมาะกับโปรไฟล์อุปกรณ์เคลื่อนที่ ตัวอย่างที่ดีคือกล่องสี่เหลี่ยมมน 4 กล่องที่ด้านบนของหน้าแรก
ไม่มีในเว็บไซต์เวอร์ชันอุปกรณ์เคลื่อนที่ โปรดทราบว่าเบราว์เซอร์จะยังคงส่งคำขอสำหรับไอคอนแต่ละรายการ แม้ว่าคอนเทนเนอร์จะซ่อนอยู่ด้วย display:none ก็ตาม ดังนั้น การซ่อนปุ่มเหล่านี้จึงไม่เพียงพอ ซึ่งนอกจากจะทำให้เสียแบนด์วิดท์แล้ว ผู้ใช้ยังไม่เห็นผลลัพธ์ของแบนด์วิดท์ที่เสียไปอีกด้วย วิธีแก้ปัญหาคือสร้างบูลีน "is_mobile" ในเทมเพลต Django เพื่อละเว้นส่วนต่างๆ ของ HTML แบบมีเงื่อนไข
เมื่อผู้ใช้ดูเว็บไซต์บนอุปกรณ์อัจฉริยะ ระบบจะไม่แสดงปุ่ม
แคชของแอปพลิเคชัน - ไม่เพียงแต่ช่วยให้เราสามารถรองรับการทำงานแบบออฟไลน์ได้เท่านั้น แต่ยังช่วยให้เริ่มต้นระบบได้เร็วขึ้นอีกด้วย
การบีบอัด CSS/JS - เราใช้คอมเพรสเซอร์ YUI แทน Closure compiler เนื่องจากคอมเพรสเซอร์ YUI จัดการทั้ง CSS และ JS ได้ ปัญหาหนึ่งที่เราพบคือการค้นหาสื่อในบรรทัด (การค้นหาสื่อที่ปรากฏภายในสไตล์ชีต) ไม่ทำงานใน YUI Compressor 2.4.2 (ดูปัญหานี้) การใช้ YUI Compressor 2.4.4 ขึ้นไปจะช่วยแก้ปัญหานี้ได้
ใช้ CSS Image Sprite หากเป็นไปได้
ใช้ pngcrush เพื่อบีบอัดรูปภาพ
ใช้ dataURI สำหรับรูปภาพขนาดเล็ก การเข้ารหัส Base64 จะเพิ่มขนาดรูปภาพประมาณ 30%ขึ้นไป แต่จะช่วยประหยัดคำขอเครือข่าย
โหลด Google Custom Search โดยอัตโนมัติโดยใช้แท็กสคริปต์เดียวแทนการโหลดแบบไดนามิกด้วย
google.load()ส่วนวิธีหลังจะส่งคำขอเพิ่มเติม
<script src="//www.google.com/jsapi?autoload={"modules":[{"name":"search","version":"1"}]}"> </script>
- โค้ด Pretty Printer และ Modernizr ของเราถูกรวมไว้ในทุกหน้า แม้ว่าจะไม่เคยใช้เลยก็ตาม Modernizr เป็นเครื่องมือที่ยอดเยี่ยม แต่จะทำการทดสอบหลายอย่างทุกครั้งที่โหลด การทดสอบบางรายการทำการแก้ไข DOM ที่มีค่าใช้จ่ายสูงและทำให้การโหลดหน้าเว็บช้าลง ตอนนี้เราจะรวมไลบรารีเหล่านี้ไว้ในหน้าเว็บที่จำเป็นต้องใช้เท่านั้น -2 คำขอ :)
การปรับแต่งประสิทธิภาพเพิ่มเติม
- ย้าย JS ทั้งหมดไปที่ด้านล่างของหน้า (หากเป็นไปได้)
- นำแท็ก
<style>ในบรรทัดออกแล้ว - การค้นหา DOM ที่แคชไว้และการจัดการ DOM ที่ลดลง - ทุกครั้งที่คุณแตะ DOM เบราว์เซอร์จะทำการจัดเรียงใหม่ การจัดเรียงใหม่มีค่าใช้จ่ายสูงยิ่งขึ้นในอุปกรณ์เคลื่อนที่
- ลดภาระโค้ดฝั่งไคลเอ็นต์ที่สิ้นเปลืองไปยังเซิร์ฟเวอร์ โดยเฉพาะอย่างยิ่ง การตรวจสอบเพื่อดูการตั้งค่าการจัดรูปแบบการนำทางของหน้าปัจจุบัน
js var lis = document.querySelectorAll('header nav li'); var i = lis.length; while (i--) { var a = lis[i].querySelector('a'); var section = a.getAttribute("data-section"); if (new RegExp(section).test(document.location.href)) { a.className = 'current'; } } - องค์ประกอบที่มีความกว้างคงที่จะถูกแทนที่ด้วย
width:100%หรือwidth:autoแบบไหล
แคชของแอปพลิเคชัน
html5rocks เวอร์ชันสำหรับมือถือใช้แคชของแอปพลิเคชันเพื่อเร่งความเร็วในการโหลดครั้งแรกและช่วยให้ผู้ใช้อ่านเนื้อหาแบบออฟไลน์ได้
เมื่อใช้ AppCache ในเว็บไซต์ คุณไม่ควรแคชไฟล์ Manifest (ไม่ว่าจะแคชอย่างชัดแจ้งในไฟล์ Manifest เองหรือแคชโดยนัยด้วยส่วนหัวการควบคุมแคชจำนวนมาก) หากไฟล์ Manifest ได้รับการแคชโดยเบราว์เซอร์ การแก้ไขข้อบกพร่องจะเป็นเรื่องที่ยากมาก iOS และ Android แคชไฟล์นี้ได้ดีเป็นพิเศษ แต่ไม่มีวิธีที่สะดวกในการล้างแคชเหมือนที่เบราว์เซอร์ในเดสก์ท็อปทำ
เพื่อป้องกันการแคชดังกล่าวสำหรับเว็บไซต์ของเรา ก่อนอื่นเราจะตั้งค่า App Engine ไม่ให้แคชไฟล์ Manifest ดังนี้
- url: /(.*\.(appcache|manifest))
static_files: \1
mime_type: text/cache-manifest
upload: (.*\.(appcache|manifest))
expiration: "0s"
ขั้นที่ 2 เราใช้ JS API เพื่อแจ้งให้ผู้ใช้ทราบเมื่อดาวน์โหลดไฟล์ Manifest ใหม่เสร็จแล้ว ระบบจะแจ้งให้ผู้ใช้รีเฟรชหน้าเว็บ ดังนี้
window.applicationCache.addEventListener('updateready', function(e) {
if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
window.applicationCache.swapCache();
if (confirm('A new version of this site is available. Load it?')) {
window.location.reload();
}
}
}, false);
โปรดทำให้ไฟล์ Manifest เรียบง่ายเพื่อประหยัดการจราจรของข้อมูลในเครือข่าย กล่าวคือ อย่าเรียกใช้ทุกหน้าในเว็บไซต์ เพียงแสดงรายการรูปภาพ, CSS และไฟล์ JavaScript ที่สำคัญ สิ่งสุดท้ายที่คุณต้องการทำคือบังคับให้เบราว์เซอร์บนมือถือดาวน์โหลดชิ้นงานจำนวนมากในการอัปเดต AppCache ทุกครั้ง แต่โปรดทราบว่าเบราว์เซอร์จะแคชหน้า HTML โดยนัยเมื่อผู้ใช้เข้าชม (และมีแอตทริบิวต์ <html manifest="...">)