顯示具有 HTML5 標籤的文章。 顯示所有文章
顯示具有 HTML5 標籤的文章。 顯示所有文章

RESTful API, SPA, SEO 之三角關係

RESTful API, SPA, SEO 之三角關係

twMVC#28 的討論,有個學員問題一則有趣的問題:在導入 RESTful 架構後,純 JavaScript 執行環境(jQuery, AngularJs, React, ...)的前端要如何做 SEO?

Web資訊流:Database → Model → Server Render → HTML → Browser

SPA資訊流:Database → Model → RESTful API ⇆ JS Framework (Browser)

不論是傳統 ASP、ASP.NET (WebForms)、ASP.NET MVC 等都是以產出 HTML 為最終目標。但前端框架不斷爆發後,原本 Server Render 的角色不斷被 RESTful API 給取代,而前端則是各種框架(jQuery、React、Angular、Vue、...)來操作著 Browser 的 HTML 來進行畫面操作與互動。這類以 JavaScript 為核心的 SPA(Single Page Application) 頁面,對於 SEO(Search Engine Optimization) 而言是非常不友善的。

我本身專注在後端(Backend)且公司主要業務面向也非消費端,雖然知道一二,但回家深入瞭解一番之後,原來還有許多技術面向可以討論,以下就目前收集的到的資料討論。如果有更專精前端(Frontend)與前端 SEO 的朋友,也請不吝指教。

表格的欄位為什麼不對齊

表格的欄位為什麼不對齊

表格的欄位不對齊

Table Display Bug

這是一個舊頁面內容,裡面的本來都很正常。但近來有使用者慢慢更新作業系統或瀏覽器後,發現表格原本被隱藏的欄位在點擊後不會正常排版。各位可以點擊標題測試,如果你是舊IE 6~IE 9,以上測試是正常的。但從IE 10開始,上述表格欄位就會不正常。(包含目前主流瀏覽器都不正常)

實用Sublime Text 2套件整理(2012/12)

Sublime Text 2的延伸套件

文字編輯器在接觸Sublime Text 2之前大多以Notepad++為主,筆記本為輔。不過看過Kevin TsengSublime Text 2系列教學文之後,又花了一段時間來上手,發現Sublime Text 2這個又免費又付費的編輯器,實在是用程式設計師的角度來開發,而不是像一般編輯器是用編輯器的角度來開發,慢慢的喜歡上它,而且它多元化的輔助套件,和Visual Studio的擴充套件一樣,令Sublime Text 2加分不少。

以下整理我由A選到Z的套件,分類為安裝與選用,安裝是我正在安裝使用中的套件,選用是可依個人需求安裝使用。

Sublime Text 2實用安裝套件

  • Package Control

    必啟用,沒有它你就無法安裝擴充套件,快速鍵:Ctrl+Shift+P

    啟用請參考:啟用Package Control

  • BracketHighlighter

    讓你在撰寫如HTML程式碼時,能有高亮度提醒功能。請參考以下官方圖片:

    BracketHighlighter功能說明圖
  • ColorHighlighter

    當的游標移至文字中如"#FFFFFF","rgb(255,255,255)","white"會自動顯示對應的顏色。當然,用在CSS居多。

Zen-Coding - 教你極速撰寫HTML5與CSS3程式碼

什麼是Zen-Coding?

Zen Coding本身是個外掛程式,官網上的資料,Zen Coding目前可以使用在36套各類HTML與CSS編輯器中,像是Aptana、TextMate (Mac)、Notepad++、PSPad、Dreamweaver、Sublime Text 2、Visual Studio…等常用的編輯器都有支援Zen Coding。

那Zen-Coding的作用是什麼呢?它的目標很簡單,就是利用已有的技術,高速的架構出HTML、CSS、XML、XSL或HAML。什麼是已有的技術,簡單說,它是CSS Selector(CSS選擇器)的再利用。

一些些改變,能帶來什麼呢?

極速

就我使用Zen-Coding它的經驗而言,就算只是簡單拿來產出HTML5或CSS3的程式碼,Zen-Coding也可以非常有效率的加速我寫HTML5與CSS3的速度,加多少,這我很難用言語或文字表示,先看一段影片:

哇!哇!哇!哇!哇!哇!

如果看完沒有跟著哇!那再來一次!

哇!哇!哇!哇!哇!哇!

加速HTML5應用程式與網站的50個技巧

加速HTML5應用程式與網站的50個技巧

以下是BUILD 2012: 50 Performance Tricks to make your HTML5 Applications and Sites faster的讀書心得,此篇演說的內容和之前討論Web Performance Best Practices and Rules裡的原則有異曲同工之妙,是當我們網站開發上線前後或執行上有瓶頸,要針對網站進行效能調效時,可以有一個很快速的指導方針,BUILD的演說有影片及投影片可以下載,以下重點整理。

加速六大原則

HTML5 Drag and Drop功能DataTransfer物件format參數注意事項

Drag and Drop(DND)是HTML5裡一個趣味與實用性很高的一個功能,在實作時發現一個有趣的小問題。我們從程式碼來看問題比較好說明。

以下為http://msdn.microsoft.com/en-us/library/ie/ms536744(v=vs.85).aspx範例程式碼:

var sImageURL;
function InitiateDrag() 
/*  The setData parameters tell the source object
   to transfer data as a URL and provide the path.  */
{   
    event.dataTransfer.setData("URL", oImage.src);
}
function FinishDrag()
/*  The parameter passed to getData tells the target
    object what data format to expect.  */
{
    sImageURL = event.dataTransfer.getData("URL")
    oTarget.innerText = sImageURL;
}

以下為http://www.w3schools.com/html/html5_draganddrop.asp範例程式碼:

function allowDrop(ev)
{
ev.preventDefault();
}

function drag(ev)
{
ev.dataTransfer.setData("Text",ev.target.id);
}

function drop(ev)
{
ev.preventDefault();
var data=ev.dataTransfer.getData("Text");
ev.target.appendChild(document.getElementById(data));
}

問題點於在setData方法的format參數,完整是setData(format,data)。以上程式能正常執行,我們再看其他程式。

JavaScript大量元素選取器效能大PK(含HTML5)

何謂大量元素選取器

這裡所談的JavaScript大量元素選取器是指getElementsByTagName()之類的元素選取器,此類元素選取器與getElementById()不同,getElementById()只回傳一個元素物件,而大量元素選取器會回傳一個陣列物件,陣列物件中包含所有合乎規則的元素內容。在撰寫HTML5程式碼時,心裡面突然有個念頭,這些大量元素選取器(含HTML5才提供的功能)在走訪一個又大又深DOM時,效能如何?

HTML 4主角有:getElementsByName(),getElementsByTagName()

HTML 4派出兩位主角分別是getElementsByName()與getElementsByTagName()。

  • getElementsByName(屬性名稱):以元素屬性 name="value" 的value來取得所有符合名稱的元素集合。
  • getElementsByTagName(元素名稱):以元素名稱,例如"p",來取得所有p元素集合。

HTML5主角有:getElementsByClassName(),querySelectorAll()

HTML5派出兩位主角分別是getElementsByClassName()與querySelectorAll()。

  • getElementsByClassName(類別名稱):以元素屬性 class="value" 的value來取得所有符合名稱的元素集合。
  • querySelectorAll("CSS Selector"):直接透過CSS選擇器規則來進行選取,符合CSS選擇器規則(支援CSS3的虛擬類別)的元素將被選取。

又深又長的DOM

以下JavaScript程式要建立一個又深又長的DOM,以增加走訪DOM的難度。

// 先在頁面上新增一個
元素 var test = document.getElementById("test"); for (var i = 0; i < 1000; i++) { var d = document.createElement("div"); d.setAttribute("id", "div" + i); d.setAttribute("class", "div100") for (var j = 0; j <= 1000; j++) { var para = document.createElement("p"); para.setAttribute("class", "sale"); para.setAttribute("name", "sale"); var txt = document.createTextNode(j); para.appendChild(txt); d.appendChild(para); } // 讓層數加深 if (i === 0) { test.appendChild(d); } else { var dp = document.getElementById("div" + (i - 1)); dp.appendChild(d); } }

每一個div裡有1001個p元素,第1002個是div元素,再包1001個p元素,第1002個是div元素...會有1000層的深度及1001000個p元素。

// 測試取得大量元素的時間
var star_time = new Date();
var select_para = document.getElementsByName("sale");
//var select_para = document.getElementsByTagName("p");
//var select_para = document.getElementsByClassName("sale");
//var select_para = document.querySelectorAll("p");
//var select_para = document.querySelectorAll(".sale");
var end_time = new Date();

console.log("取得p元素個數: " + select_para.length);
console.log("Start: " + star_time.getMinutes() + ":" +
                        star_time.getSeconds() + ":" +
                        star_time.getMilliseconds() +
                        ", time: " + star_time.getTime());
console.log("End: " + end_time.getMinutes() + ":" +
                      end_time.getSeconds() + ":" +
                      end_time.getMilliseconds() +
                      ", time: " + end_time.getTime());

這邊讓我偷懶一下,用偷懶的寫法。這樣就可以取得每個大量元素選取器的執行時間。

從EverNote的求職需求看未來開發人員應有的技能

EverNote的求職需求

此篇靈感來自Johnny.Net的Plurk,Johnny.NET貼了一個EverNote的求職連結,從中我們可以看到一些趨勢,我簡單做個整理,各位開發者做個Check List,其中你擁有了幾項技能。

EverNote技能需求

EverNote 職位職責

EverNote技能需求職責

這裡的關鍵點有幾個:

  1. HTML5/CSS/JavaScript的應用程式

    這裡談的是應用程式,不單只是網站網頁,我會強調在application app。

  2. prototype(原型),我猜這是指JavaScript裡的原型,通常使用到prototype都已經是JavaScript裡的物件導向(OOP)。以前JavaScript可以隨便寫寫,能動就好,現在連JavaScript都開始走物件導向(OOP)。

EverNote 技能最低需求

EverNote技能最低需求

這裡的關鍵點有幾個:

Visual Studio 2012 RC 中讓撰寫JavaScript與.NET程式碼使用相同自動完成鍵

從HTML5 API說起

近來,把許多心力放在 HTML5 的學習使用上,學過 HTML5 的人都知道,如果只是語意標籤(article, section, nav, footer),幾分鐘就可以學完,就幾個語意標籤如何造成整個網路上的大浪潮?當然不可能,重點在HTML5 背後整個大量且實用的 API,而這些 API 有非常大量的都是透過 JavaScript 實作出來,也就是說,你必須透過 JavaScript 來調用這些 HTML5 API 來使用。問題就在這裡,我在 Visual Studio 裡寫 JavaScript 的時間與機會大大增加。

撰寫 .NET Framework 的自動完成鍵

我們在 Visual Studio 寫 .NET Framework 程式碼,應該很少人會把每行每字都完整打出來,絕大部份都是透過 IntelliSense 所提供的自動完成功能,例如,【 Dim a As inte 】應該就會跳出提示:

.NET Framework 程式碼 IntelliSense 功能

然後我們會按下【空白鍵, space】,來完成整個【Integer】這個關鍵字。這是我們非常習慣的程式碼撰寫方式。

撰寫 JavaScript 的自動完成鍵

我要先給 Visual Studio 2012 RC 拍拍手,這一版本真的是我目前為止使用撰寫 JavaScript 最好的工具。不過在 Visual Studio 2012 RC 裡寫 JavaScript 一直有問題困擾我,舉例說明,我輸入【 func

JavaScript 程式碼 IntelliSense 功能

我們很順就給它按【空白鍵, space】,結果是給你一個空白!變成了【 func 】(最後面是一個空白),而正確的使用方式是按【 Enter 或 Tab 】。

這兩個使用方式的不同步,常常讓我浪費許多時間,變成在寫 .NET 按 Enter,在寫 JavaScript 按 space,時常錯亂。是我人老手眼腦不協調嗎?想說,是否可以同步一下這兩個 IntelliSense 的使用方式。看了一下Visual Studio 2012 RC 裡的設定:

看起來也沒有特別可調整的地方。想說上 connect 反應一下好了,好久沒上 connect(沒bug上來做什麼) 好像有些不一樣了,多了一個【Submit Idea】,看起來是要區分【Bug】與【建議】,很好很好,我這應該不算 Bug,所以就到 Idea 寫個建議 (各位無聊可以上去幫忙投票,每人可以投三票,小弟英文不好,如有寫錯或表達不清的地方,請指教)。

解決撰寫 JavaScript IntelliSense 的問題

HTML5元素中區段內容(Sectioning Content)選用流程

什麼是區段內容?

學習 HTML5 的過程裡,最簡單也最常使用應該是語意標籤(Semantic Tag),它擴充了 HTML 4 的不足,也讓 HTML 4 頁面裡充滿 div 元素現象得以改善。我們一方面要面對的是,一方面對的的搜尋引擎。如果你不在乎搜尋引擎,那使用 HTML 4 或 HTML5 對你一點影響也沒有。反正你的網站使用 table 或 div 排版,對於只看內容的人而言,沒有差別。但又有很怪異的事,一堆結構不佳的網站(通常是用 table 排版,現在還是有很多網站還在用 table 在做 layout。 >.<"),又花錢在買網路廣告,買網路排名,買 SEO 服務!怪怪。

區段內容是 HTML5 裡提出比 div 更合適拿來設計排版的元素,例如,nav 元素就是拿來設計【巡覽列】,使用 <nav> 元素和 <div id="nav"> / <div id="sidebar"> 元素,很明顯 nav 在語意上有先天優勢,當搜尋引擎一來進,nav 元素內是巡覽內容,article 元素內是獨立的內容,section 元素是一區塊…等,不過當你實際使用時,常會有這裡應該用 article 還是 section 呢?也就是說,常有在一個地方好像可以有多個 HTML5 區段內容可選擇時,我要如何選擇呢?

區段內容的選擇

html5Doctor 網站裡提供了一份很好的參考資料:

HTML5 Element Flowchart 圖片來源:html5Doctor

下載 PDF:HTML5 Element Flowchart

這是一份很好的區段內容元素選擇流程圖。

區段內容元素選擇流程

以下就流程圖內紅色選擇條件進行解說:

HTML5 完美風暴推薦序

XHTML 騙了我好多年

直到最近,我才知道,原來 XHTML 騙了我好多年,我們寫出來的程式,從來就沒有成為 XHTML 的一天,但一直以為只要我把那非常長的 DOCTYPE 加入,然後使用良好格式(well-formated)來撰寫,並且只要通過 w3 的驗證器認證,就可以大聲說,我很厲害,而且還可以把 w3 官方 XHTML Logo 放在網頁上,以示眾人。

HTML5 完美風暴封面
來源:呂高旭作者點部落 - HTML5 完美風暴封面