บทนำ
การพัฒนาสําหรับเว็บบนอุปกรณ์เคลื่อนที่เป็นหัวข้อยอดฮิตในปัจจุบัน ปีนี้เป็นครั้งแรกที่สมาร์ทโฟนขายได้มากกว่า PC ผู้ใช้จํานวนมากขึ้นกําลังใช้อุปกรณ์เคลื่อนที่เพื่อท่องเว็บ ซึ่งหมายความว่านักพัฒนาซอฟต์แวร์จําเป็นต้องเพิ่มประสิทธิภาพเว็บไซต์สําหรับเบราว์เซอร์บนอุปกรณ์เคลื่อนที่
สนามรบ "อุปกรณ์เคลื่อนที่" ยังคงเป็นพื้นที่ที่ไม่คุ้นเคยสำหรับนักพัฒนาแอปจํานวนมาก ผู้ใช้จำนวนมากมีเว็บไซต์เดิมที่ละเลยผู้ใช้อุปกรณ์เคลื่อนที่โดยสิ้นเชิง แต่เว็บไซต์นี้ออกแบบมาเพื่อการท่องเว็บบนเดสก์ท็อปเป็นหลักและทำงานได้ไม่ดีในเบราว์เซอร์บนอุปกรณ์เคลื่อนที่ เว็บไซต์นี้ (html5rocks.com) ก็ไม่มีข้อยกเว้น เมื่อเปิดตัว เราทุ่มเทเวลาให้กับเว็บไซต์เวอร์ชันอุปกรณ์เคลื่อนที่เพียงเล็กน้อย
การสร้าง html5rocks.com ที่เหมาะกับอุปกรณ์เคลื่อนที่
เราลองใช้ html5rocks (เว็บไซต์ HTML5 ที่มีอยู่) เป็นตัวฝึกหัดและเพิ่มเวอร์ชันที่เหมาะกับอุปกรณ์เคลื่อนที่ ฉันกังวลเกี่ยวกับปริมาณงานขั้นต่ำที่จําเป็นในการกําหนดเป้าหมายสมาร์ทโฟน เป้าหมายของการฝึกนี้ไม่ใช่การสร้างเว็บไซต์เวอร์ชันอุปกรณ์เคลื่อนที่ใหม่ทั้งหมดและดูแลรักษาโค้ดเบส 2 เวอร์ชัน ซึ่งจะใช้เวลานานมากและเสียเวลาไปมาก เราได้กําหนดโครงสร้าง (มาร์กอัป) ของเว็บไซต์ไว้แล้ว เราได้ตรวจสอบภาพลักษณ์ (CSS) ฟังก์ชันหลัก (JS) แสดงอยู่ ประเด็นคือเว็บไซต์จำนวนมากก็ประสบปัญหาเดียวกันนี้
บทความนี้จะอธิบายวิธีที่เราสร้าง html5rocks เวอร์ชันอุปกรณ์เคลื่อนที่ซึ่งเพิ่มประสิทธิภาพสำหรับอุปกรณ์ Android และ iOS เพียงโหลด html5rocks.com บนอุปกรณ์ที่รองรับระบบปฏิบัติการอย่างใดอย่างหนึ่งดังกล่าวเพื่อดูความแตกต่าง ไม่มีการเปลี่ยนเส้นทางไปยัง m.html5rocks.com หรือกลโกงอื่นๆ ในลักษณะดังกล่าว คุณจะได้รับ html5rocks ตามที่ระบุไว้ พร้อมข้อดีเพิ่มเติมคือมีความสวยงามและใช้งานได้ดีบนอุปกรณ์เคลื่อนที่


การค้นหาสื่อ CSS
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'>
ข้อความค้นหาสื่อยังปรากฏภายในแท็ก <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
มีการใช้ 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 พิกเซล ข้อความค้นหาสื่อครอบคลุมสมาร์ทโฟน (~320 พิกเซล) และ iPad (~768 พิกเซล)
ผลลัพธ์: เราจะลบล้างรูปแบบใน base.css
เพิ่มเติม (ตามที่จำเป็นเท่านั้น) เพื่อทําให้สิ่งต่างๆ ดูดีขึ้นบนอุปกรณ์เคลื่อนที่
การเปลี่ยนแปลงการจัดรูปแบบบางอย่างที่ mobile.css
บังคับใช้
- ลดพื้นที่ว่าง/ระยะห่างจากขอบส่วนเกินในเว็บไซต์ หน้าจอขนาดเล็กหมายความว่าพื้นที่มีราคาแพง
- นำสถานะ
:hover
ออก แต่จะไม่เห็นในอุปกรณ์แบบสัมผัส - ปรับเลย์เอาต์ให้เป็นคอลัมน์เดียว เราจะแจ้งข้อมูลเพิ่มเติมในภายหลัง
- นำ
box-shadow
ที่อยู่รอบๆ div คอนเทนเนอร์หลักของเว็บไซต์ออก แสงเงาของกล่องขนาดใหญ่จะลดประสิทธิภาพของหน้าเว็บ - ใช้รูปแบบกล่องยืดหยุ่น CSS
box-ordinal-group
เพื่อเปลี่ยนลําดับของแต่ละส่วนในหน้าแรก คุณจะเห็นส่วน "ดูตามกลุ่มฟีเจอร์ HTML5 หลัก" อยู่ก่อนส่วน "บทแนะนำ" ในหน้าแรก แต่อยู่หลังส่วนดังกล่าวในเวอร์ชันอุปกรณ์เคลื่อนที่ การจัดเรียงนี้เหมาะสมกับอุปกรณ์เคลื่อนที่มากกว่าและไม่จำเป็นต้องมีการเปลี่ยนแปลงมาร์กอัป CSS flexbox FTW - นำการเปลี่ยนแปลง
opacity
ออก การเปลี่ยนแปลงค่าอัลฟ่าจะส่งผลต่อประสิทธิภาพในอุปกรณ์เคลื่อนที่
เมตาแท็กสำหรับอุปกรณ์เคลื่อนที่
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 ขยายแท็กเมตาวิวพอร์ตโดยอนุญาตให้นักพัฒนาแอประบุความละเอียดของหน้าจอที่พัฒนาเว็บไซต์
<meta name="viewport" content="target-densitydpi=device-dpi">
ค่าที่เป็นไปได้สำหรับ target-densitydpi
คือ device-dpi
, high-dpi
,
medium-dpi
, low-dpi
หากต้องการแก้ไขหน้าเว็บสำหรับความหนาแน่นของหน้าจอที่แตกต่างกัน ให้ใช้-webkit-device-pixel-ratio
คิวรีสื่อ CSS และ/หรือพร็อพเพอร์ตี้ window.devicePixelRatio
ใน JavaScript จากนั้นตั้งค่าพร็อพเพอร์ตี้เมตา target-densitydpi
เป็น device-dpi
ซึ่งจะหยุด Android ไม่ให้ปรับขนาดในหน้าเว็บและช่วยให้คุณทำการปรับเปลี่ยนที่จำเป็นสำหรับความละเอียดแต่ละระดับผ่าน CSS และ JavaScript ได้
ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดความละเอียดของอุปกรณ์เป้าหมายได้ที่เอกสารประกอบ WebView ของ Android
การท่องเว็บแบบเต็มหน้าจอ
มีข้อมูลเมตาอีก 2 รายการที่เป็น iOS-sfic 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 เพื่อสร้างเลย์เอาต์ดังกล่าว อีกครั้งโดยไม่ต้องเปลี่ยนแปลงมาร์กอัป




การเพิ่มประสิทธิภาพสำหรับอุปกรณ์เคลื่อนที่
การเพิ่มประสิทธิภาพส่วนใหญ่ที่เราทำนั้นเป็นสิ่งที่ควรทำตั้งแต่แรก เช่น การลดจํานวนคําขอเครือข่าย การบีบอัด JS/CSS การบีบอัด gzip (มีให้ใช้งานฟรีใน App Engine) และการลดการจัดการ DOM เทคนิคเหล่านี้เป็นแนวทางปฏิบัติแนะนำที่พบบ่อย แต่บางครั้งก็ถูกมองข้ามเมื่อต้องรีบเปิดตัวเว็บไซต์
ซ่อนแถบที่อยู่อัตโนมัติ
เบราว์เซอร์ในอุปกรณ์เคลื่อนที่มีพื้นที่บนหน้าจอน้อยกว่าเบราว์เซอร์ในเดสก์ท็อป ที่แย่กว่านั้นคือในแพลตฟอร์มต่างๆ บางครั้งคุณอาจเห็นแถบที่อยู่ขนาดใหญ่ที่ด้านบนของหน้าจอ แม้ว่าหน้าเว็บจะโหลดเสร็จแล้วก็ตาม
วิธีง่ายๆ วิธีหนึ่งในการแก้ปัญหานี้คือเลื่อนหน้าเว็บโดยใช้ JavaScript
แม้แต่การเลื่อนเพียง 1 พิกเซลก็ช่วยกำจัดแถบที่อยู่ที่น่ารำคาญได้
หากต้องการซ่อนแถบที่อยู่บน html5rocks โดยบังคับ ฉันได้แนบ onload
event handler กับออบเจ็กต์ 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);
นอกจากนี้ เรายังรวมตัวรับฟังนี้ไว้ในis_mobile
ตัวแปรเทมเพลตของเราด้วยเนื่องจากไม่จําเป็นต้องใช้บนเดสก์ท็อป
ลดคำขอของเครือข่ายและประหยัดแบนด์วิดท์
เป็นที่ทราบกันดีว่าการลดจำนวนคำขอ HTTP ช่วยปรับปรุงประสิทธิภาพได้อย่างมาก อุปกรณ์เคลื่อนที่จะจำกัดจำนวนการเชื่อมต่อพร้อมกันที่เบราว์เซอร์ทำได้อีก ดังนั้นเว็บไซต์เวอร์ชันอุปกรณ์เคลื่อนที่จะได้รับประโยชน์มากขึ้นจากการลดคำขอที่ไม่จำเป็นเหล่านี้ นอกจากนี้ การลดขนาดทุกไบต์ก็สำคัญเช่นกันเนื่องจากโทรศัพท์มักมีแบนด์วิดท์จํากัด คุณอาจทำให้ผู้ใช้เสียเงิน
ต่อไปนี้คือแนวทางบางส่วนที่เราใช้เพื่อลดคำขอของเครือข่ายและลดแบนด์วิดท์ใน html5rocks
นำ iframe ออก เนื่องจาก iframe ทําให้หน้าเว็บช้า เวลาในการตอบสนองส่วนใหญ่มาจากวิดเจ็ตการแชร์ของบุคคลที่สาม (Buzz, Google Friend Connect, Twitter, Facebook) ในหน้าบทแนะนำ API เหล่านี้รวมอยู่ในแท็ก
<script>
และสร้าง iframe ที่ลดความเร็วของหน้าเว็บ ระบบนำวิดเจ็ตออกสำหรับอุปกรณ์เคลื่อนที่แล้วdisplay:none
- ในบางกรณี เราจะซ่อนมาร์กอัปหากไม่เหมาะกับโปรไฟล์อุปกรณ์เคลื่อนที่ ตัวอย่างที่ดีคือสี่ช่องกลมๆ ที่ด้านบนของหน้าแรก

รายการดังกล่าวไม่อยู่ในเว็บไซต์เวอร์ชันอุปกรณ์เคลื่อนที่ โปรดทราบว่าเบราว์เซอร์จะยังคงส่งคำขอสำหรับไอคอนแต่ละรายการ แม้ว่าจะซ่อนคอนเทนเนอร์ด้วย display:none
ก็ตาม ดังนั้น การซ่อนปุ่มเหล่านี้เพียงอย่างเดียวจึงยังไม่เพียงพอ ไม่เพียงแต่จะสิ้นเปลืองแบนด์วิดท์เท่านั้น แต่ผู้ใช้จะไม่เห็นผลลัพธ์จากแบนด์วิดท์ที่เสียไปอีกด้วย ทางออกคือการสร้างบูลีน
"is_mobile" ในเทมเพลต Django เพื่อละเว้นส่วนต่างๆ ของ HTML ตามเงื่อนไข
เมื่อผู้ใช้ดูเว็บไซต์บนอุปกรณ์อัจฉริยะ ระบบจะไม่แสดงปุ่ม
แคชแอปพลิเคชัน - แคชนี้ไม่เพียงช่วยให้เรารองรับการทำงานแบบออฟไลน์เท่านั้น แต่ยังช่วยให้การเริ่มต้นทำงานเร็วขึ้นด้วย
การบีบอัด CSS/JS - เราใช้ YUI Compressor แทน Closure Compiler หลักๆ เพราะเราจัดการได้ทั้ง CSS และ JS ปัญหาอย่างหนึ่งที่เราพบคือ Media Query ในบรรทัด (Media Query ที่ปรากฏภายในสไตล์ชีต) แสดงผลไม่ถูกต้องใน YUI Compressor 2.4.2 (ดูปัญหานี้) การใช้ YUI Compressor 2.4.4 ขึ้นไปช่วยแก้ปัญหาได้
ใช้ CSS Image Sprite เมื่อเป็นไปได้
ใช้ pngcrush ในการบีบอัดรูปภาพ
ใช้ dataURI สำหรับรูปภาพขนาดเล็ก การเข้ารหัส Base64 จะเพิ่มขนาดรูปภาพประมาณ 30%ขึ้นไป แต่จะช่วยประหยัดคำขอเครือข่าย
โหลด Google Search ที่กําหนดเองโดยอัตโนมัติโดยใช้แท็กสคริปต์เดียวแทนการโหลดแบบไดนามิกด้วย
google.load()
ส่วนหลังจะส่งคําขอเพิ่มเติม
<script src="//www.google.com/jsapi?autoload={"modules":[{"name":"search","version":"1"}]}"> </script>
- เครื่องพิมพ์โค้ดที่แสดงผลเป็นรูปแบบที่อ่านง่ายและ 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 เวอร์ชันอุปกรณ์เคลื่อนที่ใช้ Application Cache เพื่อเพิ่มความเร็วในการโหลดครั้งแรกและช่วยให้ผู้ใช้อ่านเนื้อหาแบบออฟไลน์ได้
เมื่อใช้ 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="...">
)