跳到主要內容區塊

ntuccepaper2019

技術論壇

【網站前端開發學習手札】Alpine-羽量級JS框架(上篇)
  • 卷期:v0068
  • 出版日期:2024-03-20

作者:陳俊佑 / 臺灣大學計算機及資訊網路中心程式設計組行政組員


說到網頁的前端開源框架JavaScript Framework,大多數人都會想到的應該是最有名的御三家React、Angular、Vue,若是開發小型專案,使用React、Angular簡直是殺雞用牛刀。本文要介紹的Alpine羽量級前端框架,雖然框架比較小眾,不過語法跟Vue較為相似,易學易懂...

 

前言

大家好,我是富田町47番地的社畜工程師柚子哥,說到網頁的前端開源框架JavaScript Framework,大多數人都會想到的應該是最有名的御三家React、Angular、Vue,但由於我的工作性質都是開發小型專案,使用React、Angular簡直是殺雞用牛刀,反觀Vue是御三家中較為輕量化框架的首選。但由於開發者是比較敏感的大陸人,行政院有發文表示公家單位為避免機敏資訊遭不當竊取,有使用大陸品牌的資通訊產品都要盤點並汰換掉。當時有用Vue的公家單位就像熱鍋上的螞蟻一樣十分著急,畢竟要替換整個框架不是個簡單的事情,自行開發的單位要去學新的框架、委外開發系統的單位則是要花一筆錢請廠商換框架,實在是勞民傷財。還好民國110年7月13日行政院有發文解除Vue列管,大家可以自行上網搜尋院臺護長字第1100177483號文附件,這才讓一些行政機關鬆了口氣。雖然解除了列管但是上級機關來資安稽核時還是特別容易被盯上,會有一些奇怪的要求。為了避免夜長夢多,因此開發新系統時我就會選用別的框架,就是這次要介紹的Alpine羽量級前端框架,雖然框架比較小眾,不過語法跟Vue較為相似,易學易懂,希望大家會喜歡這篇,順道一提臺大官網也是用Alpine框架。

 

20240320_006808_01

圖1.臺護長字第1100177483號文附件截圖

 

基礎環境建構

依照慣例,會把大家當作程式初學者來帶如果已經有底子可以略過這一段,這邊我開發環境使用的是用免費的Visual Studio Code開發平台(https://code.visualstudio.com/),大家可以自行到官網去下載安裝。

Visual Studio Code裡面有2個延伸模組非常建議大家裝上去可以加快學習速度。

20240320_006808_02

圖2.延伸模組

 

第一個是Alpine.js IntelliSense,這個模組是可以智慧感知alpine指令跳出補字選項。

20240320_006808_03

圖3.Alpine.js IntelliSense

 

第二個是Live Server,學前端網頁開發的幾乎都會用這個模組,這個模組強大的地方是開啟一個即時動態刷新的網頁,你程式修改完存檔後就會即時顯示在網頁上。

20240320_006808_04

圖4.Live Server

 

Live Server安裝完後重新啟動Visual Studio Code,就可在右下角看到一個Go Live的選項,點開啟動之後就是會及時刷新的網頁,用完記得再按一次關閉。

20240320_006808_05

圖5.Go Live

 

接下來我們在左邊開新的檔案,建立一個副檔名為html的檔案。

20240320_006808_06

圖6.建新檔案

 

接下來點新建的檔案,建立網頁基礎的設定,主要是告訴瀏覽器這是HTML的文件,網頁送出的編碼字集是utf-8格式。

<!DOCTYPE html>

<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

        <meta charset="utf-8" />

    </head>

    <body>

    </body>

</html>

20240320_006808_07

圖7.基礎設定

 

再來要把今天的主題alpine引用近來,由於是教學範例所以我直接用CDN的方式引入,html中加入

<script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.8.2/dist/alpine.min.js" defer></script>

這樣就完成初步設定。

20240320_006808_08

圖8.完成設定

 

指令

Alpine還有很多指令跟修飾詞,這邊我大致上介紹幾個常用的指令入門教學,剩下更深入的指令與修飾詞用法還是要靠大家自行去摸索使用。

 

x-data:主要功能是宣告alpine作用的HTML區塊及裝載相關的數據、函數等。以下是簡單的簡單範例,在一個div標籤內定義了一個x-data,而x-data內部有一個名為Title的容器,這容器在這div的標籤內可以任意使用。

20240320_006808_09

圖9. x-data指令

 

而這種寫法遇到有很多容器或很多函數時就會發現div標籤越來越長,因此接下來的範例我會改成呼叫function的方式去定義x-data,以下就是修改的方式,x-data="AlpineXdata()",如此我們所定義的資料及函數就會看得比較清楚,當然還有內建Alpine.data()的Globals指令可以使用,不過初期我們先跳過。

20240320_006808_10

圖10.修改後寫法

 

x-text:主要功能是將綁定的文字內容插入到innertext的節點內,以下範例是標題加內文的演示,我在h1跟h4的標籤內分別加入x-text標籤,並分別綁定不同的容器,網頁上就會如實呈現。

20240320_006808_11

圖11.x-text指令

 

20240320_006808_12

圖12.x-text指令結果

 

x-html:功能跟x-text很像,是將綁定的文字內容插入到innerhtml的節點內,以下範例是兩個Article跟Article2的標籤,內容都是用html的粗體標籤包覆著的內容,一個用x-text顯示一個用x-html顯示, x-html會把內容的標籤一起使用,而這其實就容易引發XSS (Cross-Site Scripting)攻擊,所以一般來說能避免使用x-html就避免掉。

 

20240320_006808_13

圖13.x-html指令

 

20240320_006808_14

圖14.x-html指令結果

 

x-on:主要是監聽動態事件,例如滑鼠點擊、畫面上下滾動、鍵盤輸入的動作就會觸發一段副程式,他的寫法就是x-on加冒號再加上要監聽動作事件的修飾詞,而x-on是非常常用的指令,所以他有快捷寫法x-on:可以改用@代替,以下範例是在h1的標籤內加入x-on監測滑鼠點擊(click)之後呼叫副程式然後跳出alert警告。

20240320_006808_15

圖15.x-on指令

 

20240320_006808_16

圖16.X-on指令結果

 

除常用的滑鼠Event (click、mousedown、mouseenter、mouseleave)、鍵盤Event(keydown、keypress、keyup )、視窗Event (scroll、resize),官方還列出了下面這些修飾詞供大家參考。

Modifier修飾詞

Keyboard Key鍵盤按鍵

.shift

Shift

.enter

Enter

.space

Space

.ctrl

Ctrl

.cmd

Cmd

.meta

Cmd on Mac, Windows key on Windows

.alt

Alt

.up .down .left .right

Up/Down/Left/Right arrows

.escape

Escape

.tab

Tab

.caps-lock

Caps Lock

.equal

Equal, =

.period

Period, .

.slash

Forward Slash, /

表1.修飾詞對應表

 

x-bind:其主要功能是設定HTML標籤的屬性,他有簡寫就是(:)冒號,下面範例展示3個標籤,一個是文字輸入框的佔位符placeholder,輔助使用者填寫欄位,增加使用者體驗的標籤,第二個範例是用style控制文字顏色,第三個則是src圖片標籤控制圖片的網址。

 

20240320_006808_17

圖17. x-bind指令

 

20240320_006808_18

圖18. x-bind指令結果

 

x-show:主要是用布林函數去控制該段DOM元素的 display: none 來顯示或隱藏,我用一個div包住內文跟LOGO,並綁定x-show,再x-data中設定x-show初始直為false不顯示,最後在Title標題加個事件監聽,點擊標題就觸發副程式,轉換x-show的值。

20240320_006808_19

圖19. x-show指令

 

20240320_006808_20

圖20. x-show指令初始隱藏狀態

 

20240320_006808_21

圖21.x-show指令點擊標題後顯示狀態

 

x-transition:主要功能是轉場效果,類似CSS 中transition的陽春版,可以跟x-show合併使用,由於大部分的轉場效果都是寫在CSS中,所以這算是一個過渡期的功能,下面列一些基本的指令供參考,就不演示,大家可以自己玩一下。

 

指令

效果

x-show.transition

預設淡入淡出加滑入滑出

x-show.transition.opacity

淡入淡出

x-show.transition.scale

滑入滑出

 

表2.show與transition結合使用

 

x-model:利用input輸入標籤對x-data中的資料進行雙向綁定,可以取得資料也可以設定資料,聽起來很難懂,就從範例下面來看,一開始我在Article的容器內裝入預設值(這是內文),所以圖23一開始標籤及輸入框都會出現這是內文的文字,我們一但在輸入框內輸入test時(用x-model去設定資資料),x-data內的Article內容就變成test如圖24,立即就顯示到網頁上,下面我又設計一個button是直接指定x-data的Article值變成Article,因此我們點一下按紐時,輸入框的內容又被雙向綁定(x-model去取得資料)成Article的文字如圖25。

 

20240320_006808_22

圖22. x-model指令

 

20240320_006808_23

圖23.初始狀態

 

20240320_006808_24

圖24.輸入框控制x-data

 

20240320_006808_25

圖25.x-data控制輸入框內容

 

而x-model可以支援以下這幾種html標籤

<input type="text">

<textarea>

<input type="checkbox">

<input type="radio">

<select>

 

x-if使用上跟x-show很像,都是切換畫面上的元素,但本質上作法不一樣,x-show 是透過display: none 來顯示或隱藏,x-if則是直接刪除或添加DOM來呈現畫面的變化。因此官方建議x-if要放在<template>標籤內使用,不要直接放在真實元素上面,<template>元素是用戶端的暫存機制,不會顯示出來,但可以靠JavaScript去實體化,詳細可以到mozilla的開發者網站說明https://developer.mozilla.org/zh-TW/docs/Web/HTML/Element/template內有非常詳細的說明及範例。這次的範例是我用x-if把內文都包住,且預設是關閉,下面設立兩個按鈕分別是開與關,然後用F12模式觀看HTML變化。

 

20240320_006808_26

圖26.x-if指令

 

20240320_006808_27

圖27.x-if指令起始畫面

 

20240320_006808_28

圖28.x-if指令起始HTML元素

 

20240320_006808_29

圖29.按open=true

 

20240320_006808_30

圖30.內文被實體化並顯示。

 

x-init其功能是alpine的組件初始化時運作一個function,其範例會在後面小試身手一起合併使用展示功能。

 

x-ref其功能必須要搭配魔法特性一起使用,類似getElementById,直接抓取dom元素來操作使用,下面的簡單範例是我在內文綁定一個x-ref="Article",新增一個輸入框跟按鈕,按鈕呼叫副程式使用魔法屬性($ref)定位DOM,去把輸入框輸入的文字更新到Article標籤中。並且可以觀察一下console.log顯示ref抓到的DOM.魔法屬性下篇會講,這邊就先簡單帶過運用。

20240320_006808_31

圖31. x-ref指令。

 

20240320_006808_32

圖32.畫面

 

20240320_006808_33

圖33.輸入test並變更文字

 

20240320_006808_34

圖34.console.log內容。

 

x-for他主要功能就像是把陣列中的資料一一建立成個別的dom元素,而依alpine使用慣例,凡會新增的或刪除dom元素的指令都要寫在<template>元素中,下面範例是x-for的使用實例,讓x-for產生list,把會重複的<li>放在<template>元素中,<template>內放入。

20240320_006808_35

圖35.x-for指令。

 

20240320_006808_36

圖36.x-for指令結果。

 

綜合練習-小試身手

上面幾個基本實用指令學會之後,現在就來綜合應用一下,假設實作情況是我要寫前端使用者腳踏車站查詢列表,用後端工程師給的api去串接,並且新增一個輸入框及按鈕作為查詢地址用,進入頁面預設顯示所有站點。

首先我們用政府資料開放平台(https://data.gov.tw/)的資料去玩,我採用的是youbike站點資訊,裡面的資訊非常多大家可以自行查看,我只選了站點編號、地址、X座標、Y座標的資料來當範例使用,(https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json)

 

  1. Html頁面加入<input>輸入搜尋字串,並雙向綁定x-model="Searchkeyword"跟x-bind:placeholder="placeholder"。
  2. 加入<button>送出搜尋,綁定@click="loadArticleData()",點擊按鈕就執行副程式去抓資料。
  3. <body x-data="AlpineXdata()" x-init="loadArticleData()"> 在body中加了x-data 設定相關資料,因為進頁面時就想要預載資料所以使用x-init指令使其進入時執行初始化loadArticleData()副程式,由副程式去抓資料。
  4. 加入表格<table>,用< template>加入x-for指令,產生<tr><td>表格欄位,每個<td>用x-text綁定不同資料欄。
  5. 副程式中用fetch()取得資料後用json()讀取並解析數據,再加一層filter()濾波器,比對搜尋欄內資料跟地址欄位有相同的字元就列出來。
  6. 再細膩一點用三元運算符,如果搜尋欄位是空的就不用浪費運算力做filter(),直接丟資料進去,(this.Searchkeyword === '') ? data : data.filter(item => item.ar.includes(this.Searchkeyword));。
  7. 加入catch,出錯誤就console.error顯示錯誤資訊,方便Debug。

 

如此一來就完成這次的小試身手作業與目標。

20240320_006808_37

圖37.小試身手HTML段

 

20240320_006808_38

圖38.小試身手JS段

 

20240320_006808_39

圖39.小試身手實際畫面

 

20240320_006808_40

圖40.小試身手搜尋畫面

 

結語

Alpine是個很不錯的羽量級框架,對於我們都是開發無數小專案的工作者來說真是一大福音,學過Vue的再轉到Alpine幾乎可以快速銜接,非常適合公部門的各式小型系統,甚至沒學過其他JS框架的程式小白應該都可以在1天內學會很多入門的功能進而開始使用。

感謝大家耐心的閱讀,如內容有誤請不吝指正,讓我知道最新最正確的資訊,也可以分享給大家少走冤枉路,謝謝。

 

參考資料