สร้างโครงสร้างพื้นฐานของเว็บแอปด้วยเครื่องมือที่ทันสมัย
บทนำ
สวัสดี ใครก็ตามที่เขียนเว็บแอปจะรู้ว่าการรักษาประสิทธิภาพการทำงานของตนเองนั้นสำคัญเพียงใด การต้องกังวลเกี่ยวกับงานที่น่าเบื่ออย่างการค้นหาต้นแบบที่เหมาะสม การตั้งค่าเวิร์กโฟลว์การพัฒนาและการทดสอบ รวมถึงการลดขนาดและการบีบอัดแหล่งที่มาทั้งหมดเป็นเรื่องที่ท้าทาย
โชคดีที่เครื่องมือส่วนหน้าสมัยใหม่ช่วยให้กระบวนการนี้เป็นแบบอัตโนมัติได้เป็นส่วนใหญ่ คุณจึงมุ่งเน้นที่การเขียนแอปที่ยอดเยี่ยมได้ บทความนี้จะแสดงวิธีใช้ Yeoman ซึ่งเป็นเวิร์กโฟลว์ของเครื่องมือสำหรับเว็บแอปเพื่อปรับปรุงการสร้างแอปโดยใช้ Polymer ซึ่งเป็นไลบรารีของ Polyfill และ Sugar สำหรับการพัฒนาแอปโดยใช้คอมโพเนนต์เว็บ
พบกับ Yo, Grunt และ Bower
Yeoman คือชายสวมหมวกที่มีเครื่องมือ 3 อย่างสำหรับเพิ่มประสิทธิภาพการทำงานของคุณ ได้แก่
- yo เป็นเครื่องมือสร้างโครงร่างที่นำเสนอระบบนิเวศของโครงร่างเฉพาะเฟรมเวิร์กที่เรียกว่า Generator ซึ่งสามารถใช้เพื่อทำงานที่น่าเบื่อบางอย่างที่ฉันได้กล่าวถึงก่อนหน้านี้
- grunt ใช้เพื่อสร้าง แสดงตัวอย่าง และทดสอบโปรเจ็กต์ของคุณ ด้วยความช่วยเหลือจากงานที่ดูแลจัดการโดยทีม Yeoman และ grunt-contrib
- bower ใช้สำหรับการจัดการทรัพยากร Dependency เพื่อให้คุณไม่ต้องดาวน์โหลดและจัดการสคริปต์ด้วยตนเองอีกต่อไป
เพียงใช้คำสั่ง 1 หรือ 2 คำสั่ง Yeoman ก็สามารถเขียนโค้ด Boilerplate สำหรับแอป (หรือแต่ละส่วน เช่น โมเดล) คอมไพล์ Sass, ลดขนาดและเชื่อมโยง CSS, JS, HTML และรูปภาพ รวมถึงเปิดเว็บเซิร์ฟเวอร์แบบง่ายในไดเรกทอรีปัจจุบันได้ นอกจากนี้ยังเรียกใช้ Unit Test และอื่นๆ ได้ด้วย
คุณสามารถติดตั้งเครื่องมือสร้างจาก Node Packaged Modules (npm) และตอนนี้มีเครื่องมือสร้างมากกว่า 220 รายการ เผยแพร่แล้ว ซึ่งหลายรายการเขียนขึ้นโดยชุมชนโอเพนซอร์ส เครื่องมือสร้างที่ได้รับความนิยม ได้แก่ generator-angular, generator-backbone และ generator-ember
เมื่อติดตั้ง Node.js เวอร์ชันล่าสุดแล้ว ให้ไปที่เทอร์มินัลที่ใกล้ที่สุดแล้วเรียกใช้คำสั่งต่อไปนี้
$ npm install -g yo
เท่านี้ก็เรียบร้อย ตอนนี้คุณมี Yo, Grunt และ Bower แล้ว และสามารถเรียกใช้ได้โดยตรงจากบรรทัดคำสั่ง นี่คือเอาต์พุตของการเรียกใช้ yo
เครื่องมือสร้างโพลิเมอร์
ดังที่ได้กล่าวไปก่อนหน้านี้ Polymer เป็นไลบรารีของโพลีฟิลล์และซูการ์ที่ช่วยให้สามารถใช้คอมโพเนนต์เว็บในเบราว์เซอร์ที่ทันสมัยได้ โปรเจ็กต์นี้ช่วยให้นักพัฒนาแอปสร้างแอปโดยใช้แพลตฟอร์มแห่งอนาคตและแจ้งให้ W3C ทราบถึงจุดที่สามารถปรับปรุงข้อกำหนดที่อยู่ระหว่างดำเนินการได้
generator-polymer เป็นเครื่องมือสร้างใหม่ที่ช่วยให้คุณสร้างแอป Polymer โดยใช้ Yeoman ซึ่งช่วยให้คุณสร้างและปรับแต่งองค์ประกอบ Polymer (ที่กำหนดเอง) ได้อย่างง่ายดายผ่านบรรทัดคำสั่ง และนำเข้าองค์ประกอบเหล่านั้นโดยใช้การนำเข้า HTML ซึ่งจะช่วยประหยัดเวลาด้วยการเขียนโค้ด Boilerplate ให้คุณ
จากนั้นติดตั้งเครื่องมือสร้างของ Polymer โดยเรียกใช้คำสั่งต่อไปนี้
$ npm install generator-polymer -g
เท่านี้เอง ตอนนี้แอปของคุณมีพลังพิเศษของคอมโพเนนต์เว็บแล้ว
เครื่องมือสร้างที่ติดตั้งใหม่มีส่วนเฉพาะบางอย่างที่คุณจะเข้าถึงได้ ดังนี้
polymer:elementใช้เพื่อสร้างโครงสร้างองค์ประกอบ Polymer ใหม่แต่ละรายการ เช่นyo polymer:element carouselpolymer:appใช้เพื่อสร้างโครงสร้าง index.html เริ่มต้น, Gruntfile.js ที่มีการกำหนดค่าเวลาบิลด์สำหรับโปรเจ็กต์ รวมถึงงาน Grunt และโครงสร้างโฟลเดอร์ที่แนะนำสำหรับโปรเจ็กต์ นอกจากนี้ยังให้ตัวเลือกในการใช้ Sass Bootstrap สำหรับสไตล์ของโปรเจ็กต์ด้วย
มาสร้างแอป Polymer กัน
เราจะสร้างบล็อกง่ายๆ โดยใช้องค์ประกอบ Polymer ที่กำหนดเองและเครื่องมือสร้างใหม่ของเรา
เริ่มต้นโดยไปที่เทอร์มินัล สร้างไดเรกทอรีใหม่ และ cd เข้าไปโดยใช้ mkdir my-new-project && cd $_ ตอนนี้คุณเริ่มใช้แอป Polymer ได้โดยเรียกใช้คำสั่งต่อไปนี้
$ yo polymer
ซึ่งจะดึง Polymer เวอร์ชันล่าสุดจาก Bower และสร้างโครงสร้างพื้นฐานของ index.html, โครงสร้างไดเรกทอรี และงาน Grunt สำหรับเวิร์กโฟลว์ของคุณ ระหว่างรอให้แอปเตรียมพร้อมเสร็จสิ้น คุณจะไปดื่มกาแฟสักแก้วก่อนก็ได้นะ
ต่อไปเราจะเรียกใช้ grunt server เพื่อดูตัวอย่างหน้าตาของแอปได้
เซิร์ฟเวอร์รองรับ LiveReload ซึ่งหมายความว่าคุณสามารถเปิดเครื่องมือแก้ไขข้อความ แก้ไของค์ประกอบที่กำหนดเอง และเบราว์เซอร์จะโหลดซ้ำเมื่อบันทึก ซึ่งจะช่วยให้คุณเห็นภาพรวมแบบเรียลไทม์ของสถานะปัจจุบันของแอป
ต่อไป เราจะสร้างองค์ประกอบ Polymer ใหม่เพื่อแสดงบล็อกโพสต์
$ yo polymer:element post
Yeoman จะถามคำถามเรา 2-3 ข้อ เช่น เราต้องการรวมคอนสตรัคเตอร์หรือใช้การนำเข้า HTML เพื่อรวมองค์ประกอบโพสต์ใน index.html หรือไม่ สมมติว่าเราเลือก "ไม่" สำหรับ 2 ตัวเลือกแรกในตอนนี้ และปล่อยตัวเลือกที่ 3 ว่างไว้
$ yo polymer:element post
[?] Would you like to include constructor=''? No
[?] Import to your index.html using HTML imports? No
[?] Import other elements into this one? (e.g 'another_element.html' or leave blank)
create app/elements/post.html
การดำเนินการนี้จะสร้างองค์ประกอบ Polymer ใหม่ในไดเรกทอรี /elements ที่ชื่อ post.html
<polymer-element name="post-element" attributes="">
<template>
<style>
@host { :scope {display: block;} }
</style>
<span>I'm <b>post-element</b>. This is my Shadow DOM.</span>
</template>
<script>
Polymer('post-element', {
//applyAuthorStyles: true,
//resetStyleInheritance: true,
created: function() { },
enteredView: function() { },
leftView: function() { },
attributeChanged: function(attrName, oldVal, newVal) { }
});
</script>
</polymer-element>
ซึ่งประกอบด้วย
- โค้ด Boilerplate สำหรับองค์ประกอบที่กำหนดเอง ซึ่งช่วยให้คุณใช้องค์ประกอบ DOM ที่กำหนดเองในหน้าเว็บได้ (เช่น
<post-element>) - แท็กเทมเพลตสำหรับการสร้างเทมเพลตฝั่งไคลเอ็นต์ "เนทีฟ" และสไตล์ที่กำหนดขอบเขตตัวอย่างสำหรับการรวมสไตล์ขององค์ประกอบ
- ต้นแบบการลงทะเบียนองค์ประกอบและเหตุการณ์ในวงจร
การทำงานกับแหล่งข้อมูลจริง
บล็อกของเราจะต้องมีพื้นที่สำหรับเขียนและอ่านโพสต์ใหม่ เราจะใช้ Google Apps Spreadsheets API เพื่อสาธิตการทำงานกับบริการข้อมูลจริง ซึ่งจะช่วยให้เราอ่านเนื้อหาของสเปรดชีตที่สร้างโดยใช้ Google เอกสารได้อย่างง่ายดาย
มาเริ่มตั้งค่ากันเลย
เปิดสเปรดชีต Google เอกสารนี้ในเบราว์เซอร์ (ขอแนะนำให้ใช้ Chrome สำหรับขั้นตอนเหล่านี้) โดยจะมีข้อมูลโพสต์ตัวอย่างในช่องต่อไปนี้
- รหัส
- ชื่อ
- ผู้เขียน
- เนื้อหา
- วันที่
- คีย์เวิร์ด
- อีเมล (ของผู้เขียน)
- Slug (สำหรับ URL ของ Slug ของโพสต์)
ไปที่เมนูไฟล์ แล้วเลือกทำสำเนาเพื่อสร้างสำเนาสเปรดชีตของคุณเอง คุณสามารถแก้ไขเนื้อหาได้ตามต้องการ โดยจะเพิ่มหรือนำโพสต์ออกก็ได้
ไปที่เมนูไฟล์อีกครั้ง แล้วเลือกเผยแพร่ไปยังเว็บ
คลิกเริ่มเผยแพร่
ในส่วนรับลิงก์ไปยังข้อมูลที่เผยแพร่ ให้คัดลอกส่วนคีย์ของ URL ที่ระบุจากกล่องข้อความสุดท้าย ซึ่งจะมีลักษณะดังนี้ https://docs.google.com/spreadsheet/ccc?key=0AhcraNy3sgspdDhuQ2pvN21JVW9NeVA0M1h4eGo3RGc#gid=0
วางคีย์ลงใน URL ต่อไปนี้ตรงที่ระบุว่า your-key-goes-here: https://spreadsheets.google.com/feeds/list/your-key-goes-here/od6/public/values?alt=json-in-script&callback= ตัวอย่างการใช้คีย์ด้านบนอาจมีลักษณะดังนี้ https://spreadsheets.google.com/feeds/list/0AhcraNy3sgspdDhuQ2pvN21JVW9NeVA0M1h4eGo3RGc/od6/public/values?alt=json-in-script
คุณสามารถวาง URL ลงในเบราว์เซอร์และไปยัง URL ดังกล่าวเพื่อดูเนื้อหาบล็อกในเวอร์ชัน JSON จดบันทึก URL แล้วใช้เวลาสักครู่เพื่อตรวจสอบรูปแบบของข้อมูลนี้ เนื่องจากคุณจะต้องทำซ้ำเพื่อแสดงข้อมูลบนหน้าจอในภายหลัง
เอาต์พุต JSON ในเบราว์เซอร์อาจดูน่ากลัวเล็กน้อย แต่ไม่ต้องกังวล เราสนใจเฉพาะข้อมูลสำหรับโพสต์ของคุณเท่านั้น
Google Spreadsheets API จะแสดงผลแต่ละช่องในสเปรดชีตบล็อกของคุณด้วยคำนำหน้าพิเศษ post.gsx$ เช่น post.gsx$title.$t, post.gsx$author.$t, post.gsx$content.$t และอื่นๆ เมื่อเราทำซ้ำในแต่ละ "แถว" ในเอาต์พุต JSON เราจะอ้างอิงช่องเหล่านี้เพื่อรับค่าที่เกี่ยวข้องสำหรับแต่ละโพสต์
ตอนนี้คุณสามารถแก้ไของค์ประกอบโพสต์ที่สร้างขึ้นใหม่เพื่อเชื่อมโยงส่วนต่างๆ ของมาร์กอัปกับข้อมูลในสเปรดชีตได้แล้ว โดยเราจะแนะนำแอตทริบิวต์ post ซึ่งจะอ่านชื่อโพสต์ ผู้เขียน เนื้อหา และช่องอื่นๆ ที่เราสร้างไว้ก่อนหน้านี้ แอตทริบิวต์ selected (ซึ่งเราจะป้อนข้อมูลในภายหลัง) ใช้เพื่อแสดงโพสต์ก็ต่อเมื่อผู้ใช้ไปยัง Slug ที่ถูกต้องสำหรับโพสต์นั้นเท่านั้น
<polymer-element name="post-element" attributes="post selected">
<template>
<style>
@host { :scope {display: block;} }
</style>
<div class="col-lg-4">
<template if="[[post.gsx$slug.$t === selected]]">
<h2>
<a href="#[[post.gsx$slug.$t]]">
[[post.gsx$title.$t ]]
</a>
</h2>
<p>By [[post.gsx$author.$t]]</p>
<p>[[post.gsx$content.$t]]</p>
<p>Published on: [[post.gsx$date.$t]]</p>
<small>Keywords: [[post.gsx$keywords.$t]]</small>
</template>
</div>
</template>
<script>
Polymer('post-element', {
created: function() { },
enteredView: function() { },
leftView: function() { },
attributeChanged: function(attrName, oldVal, newVal) { }
});
</script>
</polymer-element>
ถัดไป มาสร้างองค์ประกอบบล็อกซึ่งมีทั้งคอลเล็กชันโพสต์และเลย์เอาต์สำหรับบล็อกโดยเรียกใช้ yo polymer:element blog
$ yo polymer:element blog
[?] Would you like to include constructor=''? No
[?] Import to your index.html using HTML imports? Yes
[?] Import other elements into this one? (e.g 'another_element.html' or leave blank) post.html
create app/elements/blog.html
ครั้งนี้เราจะนำเข้าบล็อกไปยัง index.html โดยใช้การนำเข้า HTML เนื่องจากเราต้องการให้บล็อกปรากฏในหน้าเว็บ สำหรับพรอมต์ที่ 3 โดยเฉพาะ เราจะระบุ post.html เป็นองค์ประกอบที่ต้องการรวมไว้
เช่นเดียวกับก่อนหน้านี้ ระบบจะสร้างไฟล์องค์ประกอบใหม่ (blog.html) และเพิ่มลงใน /elements โดยครั้งนี้จะนำเข้า post.html และรวม <post-element> ไว้ในแท็กเทมเพลต
<link rel="import" href="post.html">
<polymer-element name="blog-element" attributes="">
<template>
<style>
@host { :scope {display: block;} }
</style>
<span>I'm <b>blog-element</b>. This is my Shadow DOM.</span>
<post-element></post-element>
</template>
<script>
Polymer('blog-element', {
//applyAuthorStyles: true,
//resetStyleInheritance: true,
created: function() { },
enteredView: function() { },
leftView: function() { },
attributeChanged: function(attrName, oldVal, newVal) { }
});
</script>
</polymer-element>
เนื่องจากเราขอให้นำเข้าองค์ประกอบบล็อกโดยใช้การนำเข้า HTML (วิธีรวมและนำเอกสาร HTML มาใช้ซ้ำในเอกสาร HTML อื่นๆ) ไปยังดัชนีของเรา เราจึงสามารถยืนยันได้ว่ามีการเพิ่มองค์ประกอบดังกล่าวลงในเอกสาร <head> อย่างถูกต้อง
<!doctype html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" href="styles/main.css">
<!-- build:js scripts/vendor/modernizr.js -->
<script src="bower_components/modernizr/modernizr.js"></script>
<!-- endbuild -->
<!-- Place your HTML imports here -->
<link rel="import" href="elements/blog.html">
</head>
<body>
<div class="container">
<div class="hero-unit" style="width:90%">
<blog-element></blog-element>
</div>
</div>
<script>
document.addEventListener('WebComponentsReady', function() {
// Perform some behaviour
});
</script>
<!-- build:js scripts/vendor.js -->
<script src="bower_components/polymer/polymer.min.js"></script>
<!-- endbuild -->
</body>
</html>
เยี่ยมเลย
การเพิ่มทรัพยากร Dependency โดยใช้ Bower
ถัดไป เราจะแก้ไของค์ประกอบเพื่อใช้องค์ประกอบยูทิลิตี Polymer JSONP เพื่ออ่านใน posts.json คุณสามารถรับอะแดปเตอร์ได้โดยการโคลนที่เก็บ Git หรือติดตั้ง polymer-elements ผ่าน Bower โดยเรียกใช้ bower install polymer-elements
เมื่อมียูทิลิตีแล้ว คุณจะต้องรวมยูทิลิตีดังกล่าวเป็นการนําเข้าในองค์ประกอบ blog.html โดยใช้โค้ดต่อไปนี้
<link rel="import" href="../bower_components/polymer-jsonp/polymer-jsonp.html">
ถัดไป ให้ใส่แท็กสำหรับคอลัมน์ดังกล่าวและระบุ url ลงในสเปรดชีตบล็อกโพสต์จากก่อนหน้านี้ โดยเพิ่ม &callback= ต่อท้าย ดังนี้
<polymer-jsonp auto url="https://spreadsheets.google.com/feeds/list/your-key-value/od6/public/values?alt=json-in-script&callback=" response="[[posts]]"></polymer-jsonp>
เมื่อมีข้อมูลนี้แล้ว เราจะเพิ่มเทมเพลตเพื่อทำซ้ำในสเปรดชีตได้เมื่ออ่านข้อมูลแล้ว เอาต์พุตแรกจะแสดงสารบัญพร้อมชื่อที่ลิงก์สำหรับโพสต์ที่ชี้ไปยัง Slug ของโพสต์นั้น
<!-- Table of contents -->
<ul>
<template repeat="[[post in posts.feed.entry]]">
<li><a href="#[[post.gsx$slug.$t]]">[[post.gsx$title.$t]]</a></li>
</template>
</ul>
ส่วนที่ 2 จะแสดงผลอินสแตนซ์ post-element 1 รายการสำหรับแต่ละรายการที่พบ โดยส่งเนื้อหาโพสต์ไปยังอินสแตนซ์นั้นตามลำดับ โปรดทราบว่าเรากำลังส่งผ่านแอตทริบิวต์ post ซึ่งแสดงเนื้อหาโพสต์สำหรับแถวสเปรดชีตแถวเดียว และแอตทริบิวต์ selected ซึ่งเราจะป้อนข้อมูลด้วยเส้นทาง
<!-- Post content -->
<template repeat="[[post in posts.feed.entry]]">
<post-element post="[[post]]" selected="[[route]]"></post-element>
</template>
แอตทริบิวต์ repeat ที่คุณเห็นว่ามีการใช้ในเทมเพลตของเราจะสร้างและรักษาอินสแตนซ์ที่มี [[ bindings ]] สำหรับทุกองค์ประกอบในคอลเล็กชันอาร์เรย์ของโพสต์เมื่อมีการระบุ
ตอนนี้เพื่อให้เราได้ [[route]] ปัจจุบันที่สร้างขึ้น เราจะโกงและใช้ไลบรารีที่ชื่อว่า Flatiron director ซึ่งจะเชื่อมโยงกับ [[route]] ทุกครั้งที่แฮช URL มีการเปลี่ยนแปลง
โชคดีที่มีองค์ประกอบ Polymer (ส่วนหนึ่งของแพ็กเกจ more-elements) ที่เราสามารถนำมาใช้ได้ เมื่อคัดลอกไปยังไดเรกทอรี /elements แล้ว เราจะอ้างอิงได้ด้วย <flatiron-director route="[[route]]" autoHash></flatiron-director> โดยระบุ route เป็นพร็อพเพอร์ตี้ที่เราต้องการเชื่อมโยงและบอกให้อ่านค่าของการเปลี่ยนแปลงแฮช (autoHash) โดยอัตโนมัติ
เมื่อนำทุกอย่างมารวมกัน เราจะได้ผลลัพธ์ดังนี้
<link rel="import" href="post.html">
<link rel="import" href="polymer-jsonp/polymer-jsonp.html">
<link rel="import" href="flatiron-director/flatiron-director.html">
<polymer-element name="blog-element" attributes="">
<template>
<style>
@host { :scope {display: block;} }
</style>
<div class="row">
<h1><a href="/#">My Polymer Blog</a></h1>
<flatiron-director route="[[route]]" autoHash></flatiron-director>
<h2>Posts</h2>
<!-- Table of contents -->
<ul>
<template repeat="[[post in posts.feed.entry]]">
<li><a href="#[[post.gsx$slug.$t]]">[[post.gsx$title.$t]]</a></li>
</template>
</ul>
<!-- Post content -->
<template repeat="[[post in posts.feed.entry]]">
<post-element post="[[post]]" selected="[[route]]"></post-element>
</template>
</div>
<polymer-jsonp auto url="https://spreadsheets.google.com/feeds/list/0AhcraNy3sgspdHVQUGd2M2Q0MEZnRms3c3dDQWQ3V1E/od6/public/values?alt=json-in-script&callback=" response="[[posts]]"></polymer-jsonp>
</template>
<script>
Polymer('blog-element', {
created: function() {},
enteredView: function() { },
leftView: function() { },
attributeChanged: function(attrName, oldVal, newVal) { }
});
</script>
</polymer-element>
เย่! ตอนนี้เรามีบล็อกง่ายๆ ที่อ่านข้อมูลจาก JSON และใช้องค์ประกอบ Polymer 2 รายการที่สร้างขึ้นด้วย Yeoman
การทำงานกับองค์ประกอบของบุคคลที่สาม
ระบบนิเวศขององค์ประกอบรอบๆ คอมโพเนนต์เว็บเติบโตขึ้นในช่วงหลังๆ โดยมีเว็บไซต์แกลเลอรีคอมโพเนนต์อย่าง customelements.io เริ่มปรากฏขึ้น เมื่อดูองค์ประกอบที่ชุมชนสร้างขึ้น ฉันพบองค์ประกอบหนึ่งสำหรับการดึงข้อมูลโปรไฟล์ Gravatar และเราสามารถดึงข้อมูลและเพิ่มลงในเว็บไซต์บล็อกของเราได้ด้วย
คัดลอกแหล่งที่มาขององค์ประกอบ Gravatar ไปยังไดเรกทอรี /elements รวมไว้ผ่านการนำเข้า HTML ใน post.html แล้วเพิ่ม
<link rel="import" href="gravatar-element/src/gravatar.html">
<polymer-element name="post-element" attributes="post selected">
<template>
<style>
@host { :scope {display: block;} }
</style>
<div class="col-lg-4">
<template if="[[post.gsx$slug.$t === selected]]">
<h2><a href="#[[post.gsx$slug.$t]]">[[post.gsx$title.$t]]</a></h2>
<p>By [[post.gsx$author.$t]]</p>
<gravatar-element username="[[post.gsx$email.$t]]" size="100"></gravatar-element>
<p>[[post.gsx$content.$t]]</p>
<p>[[post.gsx$date.$t]]</p>
<small>Keywords: [[post.gsx$keywords.$t]]</small>
</template>
</div>
</template>
<script>
Polymer('post-element', {
created: function() { },
enteredView: function() { },
leftView: function() { },
attributeChanged: function(attrName, oldVal, newVal) { }
});
</script>
</polymer-element>
มาดูกันว่าเราจะได้อะไรจากข้อมูลนี้บ้าง
สวยงาม
ในเวลาอันสั้น เราได้สร้างแอปพลิเคชันง่ายๆ ที่ประกอบด้วยคอมโพเนนต์เว็บหลายรายการโดยไม่ต้องกังวลเกี่ยวกับการเขียนโค้ด Boilerplate, การดาวน์โหลดทรัพยากร Dependency ด้วยตนเอง หรือการตั้งค่าเซิร์ฟเวอร์ในเครื่องหรือเวิร์กโฟลว์การสร้าง
การเพิ่มประสิทธิภาพแอปพลิเคชัน
เวิร์กโฟลว์ Yeoman มีโปรเจ็กต์โอเพนซอร์สอีกโปรเจ็กต์หนึ่งที่เรียกว่า Grunt ซึ่งเป็นตัวรันงานที่สามารถเรียกใช้งานเฉพาะบิลด์จำนวนหนึ่ง (กำหนดไว้ใน Gruntfile) เพื่อสร้างแอปพลิเคชันเวอร์ชันที่เพิ่มประสิทธิภาพแล้ว การเรียกใช้ grunt ด้วยตัวเองจะดำเนินการงาน default ที่เครื่องมือสร้างได้ตั้งค่าไว้สำหรับการวิเคราะห์โค้ด การทดสอบ และการสร้าง ดังนี้
grunt.registerTask('default', [
'jshint',
'test',
'build'
]);
งาน jshint ด้านบนจะตรวจสอบกับไฟล์ .jshintrc เพื่อดูค่ากำหนดของคุณ จากนั้นจะเรียกใช้กับไฟล์ JavaScript ทั้งหมดในโปรเจ็กต์ หากต้องการดูตัวเลือกทั้งหมดที่มีใน JSHint โปรดดูเอกสารประกอบ
งาน test จะมีลักษณะดังนี้ และสามารถสร้างและแสดงแอปของคุณสำหรับเฟรมเวิร์กการทดสอบที่เราแนะนำได้ทันที ซึ่งก็คือ Mocha นอกจากนี้ ระบบจะทำการทดสอบให้คุณด้วย ดังนี้
grunt.registerTask('test', [
'clean:server',
'createDefaultTemplate',
'jst',
'compass',
'connect:test',
'mocha'
]);
เนื่องจากแอปของเราในกรณีนี้ค่อนข้างเรียบง่าย เราจึงจะปล่อยให้คุณเขียนการทดสอบเป็นแบบฝึกหัดแยกต่างหาก มีสิ่งอื่นๆ อีก 2-3 อย่างที่เราต้องให้กระบวนการบิลด์จัดการ ดังนั้นมาดูกันว่างาน grunt build ที่กำหนดไว้ใน Gruntfile.js จะทำอะไรบ้าง
grunt.registerTask('build', [
'clean:dist', // Clears out your .tmp/ and dist/ folders
'compass:dist', // Compiles your Sassiness
'useminPrepare', // Looks for <!-- special blocks --> in your HTML
'imagemin', // Optimizes your images!
'htmlmin', // Minifies your HTML files
'concat', // Task used to concatenate your JS and CSS
'cssmin', // Minifies your CSS files
'uglify', // Task used to minify your JS
'copy', // Copies files from .tmp/ and app/ into dist/
'usemin' // Updates the references in your HTML with the new files
]);
เรียกใช้ grunt build แล้วระบบจะสร้างแอปเวอร์ชันที่พร้อมใช้งานจริงและพร้อมให้คุณจัดส่ง มาลองใช้กันเลย
สำเร็จ!
หากติดขัด คุณสามารถดู polymer-blog เวอร์ชันที่สร้างไว้ล่วงหน้าได้ที่ https://github.com/addyosmani/polymer-blog
เรามีอะไรอีกบ้าง
คอมโพเนนต์เว็บยังคงอยู่ในสถานะของการพัฒนา และเครื่องมือที่เกี่ยวข้องก็เช่นกัน
ปัจจุบันเรากำลังพิจารณาวิธีที่นักพัฒนาซอฟต์แวร์อาจใช้เพื่อเชื่อมโยงการนำเข้า HTML เพื่อปรับปรุงประสิทธิภาพการโหลดผ่านโปรเจ็กต์ต่างๆ เช่น Vulcanize (เครื่องมือจากโปรเจ็กต์ Polymer) และวิธีที่ระบบนิเวศสำหรับคอมโพเนนต์อาจทำงานร่วมกับเครื่องมือจัดการแพ็กเกจอย่าง Bower
เราจะแจ้งให้คุณทราบเมื่อมีคำตอบที่ดีกว่าสำหรับคำถามเหล่านี้ แต่ยังมีเรื่องน่าตื่นเต้นอีกมากมายรออยู่ข้างหน้า
การติดตั้ง Polymer แบบสแตนด์อโลนด้วย Bower
หากต้องการเริ่มต้นใช้งาน Polymer แบบเบาๆ คุณสามารถติดตั้งแบบสแตนด์อโลนได้โดยตรงจาก Bower โดยเรียกใช้คำสั่งต่อไปนี้
bower install polymer
ซึ่งจะเพิ่มลงในไดเรกทอรี bower_components จากนั้นคุณสามารถอ้างอิงถึงไฟล์ดังกล่าวในดัชนีแอปพลิเคชันด้วยตนเองและเตรียมพร้อมสำหรับอนาคตได้เลย
คุณมีความคิดเห็นอย่างไร
ตอนนี้คุณทราบวิธีสร้างแอป Polymer โดยใช้คอมโพเนนต์เว็บด้วย Yeoman แล้ว หากคุณมีความคิดเห็นเกี่ยวกับเครื่องมือสร้าง โปรดแจ้งให้เราทราบในความคิดเห็น หรือรายงานข้อบกพร่องหรือโพสต์ไปยัง Issue Tracker ของ Yeoman เราอยากทราบว่ามีสิ่งใดที่คุณต้องการให้เครื่องมือสร้างนี้ทำได้ดีขึ้นหรือไม่ เนื่องจากเราจะปรับปรุงได้ก็ต่อเมื่อคุณใช้งานและแสดงความคิดเห็นเท่านั้น :)