tag:blogger.com,1999:blog-74137248389214205812024-03-16T09:13:05.399+08:00大匠之風程式開發經驗分享Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.comBlogger642125tag:blogger.com,1999:blog-7413724838921420581.post-20698723219880519872024-03-11T10:50:00.000+08:002024-03-11T10:50:03.338+08:00FastScript 實現多語言設計<p> </p>
<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p>
<p> </p>
<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEild27HMd4SPQUkMflaZoZ8dzshe1segpnvo2BeH6i2U5FOPLHTz4nKF4IamaCFRgePteA9Thua4Irl-law2TblTCNlooGjvxj0oQdPAYFrQnxKa5SB-ARFVP713KiaheM8ldreVquuvbjMNKZLAXzwVUb-AVfCXtIvxiQTJ2EyLLF8dZZUXzPESay-fYXL/s1280/pexels-g%C3%BCl-i%C5%9F%C4%B1k-3957616.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="848" data-original-width="1280" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEild27HMd4SPQUkMflaZoZ8dzshe1segpnvo2BeH6i2U5FOPLHTz4nKF4IamaCFRgePteA9Thua4Irl-law2TblTCNlooGjvxj0oQdPAYFrQnxKa5SB-ARFVP713KiaheM8ldreVquuvbjMNKZLAXzwVUb-AVfCXtIvxiQTJ2EyLLF8dZZUXzPESay-fYXL/w640-h424/pexels-g%C3%BCl-i%C5%9F%C4%B1k-3957616.jpg" width="640" /></a></div><br /> <p></p><p>最近我的程式莫名出現了:EOleSysError: 類別未登錄, ProgID:
"MSScriptControl.ScriptControl" 的錯誤訊息。一查才知道原來是 Windows 沒有提供
Microsoft Script Control 64 位元版本,但許多程式會用到
JScript。遇到這難題該怎麼處理呢?
</p>
<p> </p>
<p></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEnMaHq2yeMox6K4Q_Y-lHn6DFHyGW5uHEHFDh5gkjyBCr-ph-0YdhFygGQTuF6tqWcnOMbYYQ7Fzmz-XA3ojNd7EYbAe5ycTOfUEbErK4AeLAgTqoFxjRWsdLjaWL63o1dcQwos0AdqAOBiuieFyhBXAbj7R2ZjMpUCk4ClaQfZJTVMZxG-ytLf6MAS_C/s396/Snipaste_2024-03-11_10-23-55.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="225" data-original-width="396" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEnMaHq2yeMox6K4Q_Y-lHn6DFHyGW5uHEHFDh5gkjyBCr-ph-0YdhFygGQTuF6tqWcnOMbYYQ7Fzmz-XA3ojNd7EYbAe5ycTOfUEbErK4AeLAgTqoFxjRWsdLjaWL63o1dcQwos0AdqAOBiuieFyhBXAbj7R2ZjMpUCk4ClaQfZJTVMZxG-ytLf6MAS_C/w640-h364/Snipaste_2024-03-11_10-23-55.png" width="640" /></a>
</div>
<br />
<p> </p>
<h3 style="text-align: left;">使用外掛 Tablacus Script Control 64</h3>
<p> </p>
<p>
外國網友 Gaku 提供了好用的 OCX 套件:<a href="https://tablacus.github.io/scriptcontrol_en.html" rel="nofollow" target="_blank">Tablacus Script Control 64</a>。現有的程式幾乎不用修改就可以使用。缺點是必須要另外安裝。截取官方範例如下:
</p>
<p> </p>
<blockquote>
var SC = new ActiveXObject("ScriptControl");<br />SC.Language = "JScript";<br />SC.AddObject("WScript",
WScript);<br />SC.AddCode('function fnx(a,b,c){ WScript.Echo(a + ":" + b + ":"
+ c) }');<br />SC.Run("fnx", 1, "data2", "data3");
</blockquote>
<p> </p>
<h3 style="text-align: left;">使用直譯式工具 FastScript</h3>
<p><br /></p>
<p>
FastScript 是 FastReport
公司旗下的直譯式跨語言開發套件,可在不開啟程式編譯器的場合下做簡易的程式開發。使用起來也相當簡單。缺點就是
JScript 語言支援度比微軟老舊的 JScript 版本更為受限。
</p>
<p> </p>
<blockquote>
procedure TForm2.Button1Click(Sender: TObject);<br />var<br />
LfsResult: Variant;<br />begin<br /> fsScript1.Clear;<br />
fsScript1.Parent := fsGlobalUnit;<br /> fsScript1.SyntaxType :=
'JScript';<br /> fsScript1.Lines.Text := 'function jMethod(a, b){return
a+b}';<br /> if fsScript1.Compile then<br /> begin<br />
LfsResult := fsScript1.CallFunction('jMethod',VarArrayOf([1, 1]));<br />
ShowMessage(LfsResult);<br /> end;<br />end;
</blockquote>
<p> </p>
<h3 style="text-align: left;">總結</h3>
<p> </p>
<p>兩種解決方案各有優缺點,使用者可根據自身需求進行選擇:</p>
<p> </p>
<p style="margin-left: 40px; text-align: left;">
若需要使用現有的程式,且對相容性要求較高,採用 Tablacus Script Control 64
外掛可以很快進入狀況
</p>
<p> </p>
<p style="margin-left: 40px; text-align: left;">
若需要快速開發簡易的 JScript 程式,或對相容性要求不高,則可以使用 FastScript
直譯式工具
</p>
<p> </p>
<p>
其他注意事項<br /><br /> 使用 Tablacus Script Control 64
外掛時,需注意其版本與 Windows 系統的版本是否相符。<br />
使用 FastScript 直譯式工具時,需注意其對 JScript 語言的支持程度。<br /><br /><br /><br />本文介紹了兩種解決
Windows 64 位元系統下使用 JScript 的方案,希望能對相關使用者有所幫助。
</p>
<p> </p>
<p> 和你分享</p>
<p> </p>
<h3 style="text-align: left;">See also</h3>
<p> </p>
<ul style="text-align: left;">
<li>
<a href="https://www.cnblogs.com/hnxxcxg/archive/2010/07/06/2940690.html" rel="nofollow" target="_blank">FASTSCRIPT脚本实现多国语言</a>
</li>
<li>
<a href="https://stackoverflow.com/questions/15549308/microsoft-script-control-64-bit" rel="nofollow" target="_blank">Microsoft Script Control 64 bit?</a>
</li>
<li>
<a href="https://tablacus.github.io/scriptcontrol_en.html" rel="nofollow" target="_blank">Tablacus Script Control 64</a>
</li>
<li>
<a href="https://origin2.cdn.componentsource.com/sites/default/files/resources/fast-reports/538951/fs_en.pdf" rel="nofollow" target="_blank">FastScript 1.9 Scripting library Developer's manual</a></li><li>文首圖片來源:攝影師:Gül Işık: https://www.pexels.com/zh-tw/photo/3957616/
<br />
</li>
</ul>
<p><br /></p>
Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-24299623875452717742024-03-07T14:20:00.153+08:002024-03-11T15:15:19.276+08:00DevExtreme DataGrid 新手必讀!淺入淺出教學系列<p> </p>
<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p>
<p> </p>
<p></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipKdLqxA1a6OsJ96iHVcwwtPuUDZ3hy0JvRq5unzhOHqsjdgQf6-aQl6bK9X4m0dKPpp4M0n69YwQ-kxgL7F1hB_nSOR5m_4zgWunwLEiF6sazVMiaqC_8LVZbwFCVAYcmFGazktSblxDymunPFDnfNKXbGpQyYqc1tBRtYz5UnarUIaYf0O2meQx78aFa/s1450/DataGrid_props.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="609" data-original-width="1450" height="268" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipKdLqxA1a6OsJ96iHVcwwtPuUDZ3hy0JvRq5unzhOHqsjdgQf6-aQl6bK9X4m0dKPpp4M0n69YwQ-kxgL7F1hB_nSOR5m_4zgWunwLEiF6sazVMiaqC_8LVZbwFCVAYcmFGazktSblxDymunPFDnfNKXbGpQyYqc1tBRtYz5UnarUIaYf0O2meQx78aFa/w640-h268/DataGrid_props.png" width="640" /></a>
</div>
<p><br /></p>
<p>
DataGrid,DevExtreme 最重要的元件之一,也是 WinForm 界夢幻逸品 cxGrid 的
Web 化元件。若能精通它,所有元件都能百分百理解!
</p>
<p> </p>
<p>
對於初學者而言,DataGrid 可能有些陌生,但它的用途非常廣泛。這篇文章將帶你一窺
DataGrid 的神奇之處,從最基礎的 Array 顯示開始,一路探索至增刪改的高階操作!
</p>
<p> </p>
<p>
要進入增刪改階段,可能會遇到一些困難,但不用擔心,我們會一步步解決這些難題。
</p>
<p> </p>
<p>
首先,讓我們從新增階段開始。在這篇文章中,將重點放在 DataGrid 屬性 dataSource
和 store 上。dataSource
是一個大容器,可以根據需求的大小進行調整。你可以使用平舖的
Array,也可以使用更複雜的 DataSource
類別實作。不管你遇到什麼樣的需求,DataSource 都能應對自如!
</p>
<p> </p>
<p>
如果你覺得講得太難,別擔心!這裡也提供了 DevExtreme 官方文件的 Data Layer
Overview,讓你更容易理解。留言下方告訴我,你覺得更容易理解的是哪一種方法!
</p>
<p> </p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGRTOAyukgr04OjiAQtkSxmpVcDDP2VGfUYYc7SobTKkJ-mhbkWA5zQdYKXXEv67u0Z-0ZRw5M9Xxcmpd1CL2Sy3ZNDDTAgADQYrs4nF0Uplx0284cBx-o57nz0utxJUFtkuSOCXRysID-i3DhEnI702nVtRpl8W6zDjCrB06mIa2d74ovH-UK4TLCT_wB/s651/scheme-data-layer.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="627" data-original-width="651" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGRTOAyukgr04OjiAQtkSxmpVcDDP2VGfUYYc7SobTKkJ-mhbkWA5zQdYKXXEv67u0Z-0ZRw5M9Xxcmpd1CL2Sy3ZNDDTAgADQYrs4nF0Uplx0284cBx-o57nz0utxJUFtkuSOCXRysID-i3DhEnI702nVtRpl8W6zDjCrB06mIa2d74ovH-UK4TLCT_wB/s16000/scheme-data-layer.png" /></a>
</div>
<p> </p>
<h3 style="text-align: left;">本章目標:快速建立可以 CRUD 的 DataGrid 頁面</h3>
<p> </p>
<p>
使用簡單的 array 就可以成為 DataGrid
的資料來源,官方很貼心的提供展示用的人事資料(<a href="https://github.com/DevExpress/devextreme-reactive/blob/master/packages/dx-react-grid-demos/src/demo-data/employees.js" rel="nofollow" target="_blank">連結在此</a>)。將上一章 "<b>WinForm 設計師的 Web 開發秘訣:DevExtreme 教學</b>"
建立的HelloWorld 頁面,顯示內容的地方置換為 DataGrid,並在 import
區域導入上述的人事資料及 DataGrid 依賴的套件檔,完成後的程式碼應如下內容。
</p>
<p><br /></p>
<pre class="code_syntax" style="background: rgb(255, 255, 255); color: black;"><span class="line_wrapper"><span style="color: maroon; font-weight: bold;">import</span> React from <span style="color: maroon;">'</span><span style="color: #0000e6;">react</span><span style="color: maroon;">'</span><span style="color: purple;">;</span></span>
<span class="line_wrapper"><span style="color: maroon; font-weight: bold;">import</span> <span style="color: maroon;">'</span><span style="color: #0000e6;">./hello.scss</span><span style="color: maroon;">'</span><span style="color: purple;">;</span></span>
<span class="line_wrapper"></span>
<span class="line_wrapper"><span style="color: maroon; font-weight: bold;">import</span> <span style="color: purple;">{</span> employees <span style="color: purple;">}</span> from <span style="color: maroon;">'</span><span style="color: #0000e6;">./emp</span><span style="color: maroon;">'</span><span style="color: purple;">;</span></span>
<span class="line_wrapper"><span style="color: maroon; font-weight: bold;">import</span> <span style="color: purple;">{</span></span>
<span class="line_wrapper"> DataGrid</span>
<span class="line_wrapper"><span style="color: purple;">}</span> from <span style="color: maroon;">'</span><span style="color: #0000e6;">devextreme-react/data-grid</span><span style="color: maroon;">'</span><span style="color: purple;">;</span></span>
<span class="line_wrapper"></span>
<span class="line_wrapper"><span style="color: maroon; font-weight: bold;">export</span> <span style="color: maroon; font-weight: bold;">default</span> <span style="color: #808030;">(</span><span style="color: #808030;">)</span> <span style="color: #808030;">=</span><span style="color: #808030;">></span> <span style="color: #808030;">(</span></span>
<span class="line_wrapper"> <span style="color: #808030;"><</span>React<span style="color: #808030;">.</span>Fragment<span style="color: #808030;">></span></span>
<span class="line_wrapper"> <span style="color: #808030;"><</span>h2 className<span style="color: #808030;">=</span><span style="color: purple;">{</span><span style="color: maroon;">'</span><span style="color: #0000e6;">content-block</span><span style="color: maroon;">'</span><span style="color: purple;">}</span><span style="color: #808030;">></span>Hello<span style="color: #808030;"><</span><span style="color: #808030;">/</span>h2<span style="color: #808030;">></span></span>
<span class="line_wrapper"> <span style="color: #808030;"><</span>DataGrid</span>
<span class="line_wrapper"> className<span style="color: #808030;">=</span><span style="color: purple;">{</span><span style="color: maroon;">'</span><span style="color: #0000e6;">dx-card wide-card</span><span style="color: maroon;">'</span><span style="color: purple;">}</span></span>
<span class="line_wrapper"> dataSource<span style="color: #808030;">=</span><span style="color: purple;">{</span>employees<span style="color: purple;">}</span></span>
<span class="line_wrapper"> keyExpr<span style="color: #808030;">=</span><span style="color: maroon;">"</span><span style="color: #0000e6;">ID</span><span style="color: maroon;">"</span><span style="color: #808030;">></span></span>
<span class="line_wrapper"> <span style="color: #808030;"><</span><span style="color: #808030;">/</span>DataGrid<span style="color: #808030;">></span></span>
<span class="line_wrapper"> <span style="color: #808030;"><</span><span style="color: #808030;">/</span>React<span style="color: #808030;">.</span>Fragment<span style="color: #808030;">></span></span>
<span class="line_wrapper"><span style="color: #808030;">)</span><span style="color: purple;">;</span></span>
<span class="line_wrapper"></span></pre>
<p><br /></p>
<div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBWBcIeK5m6KCyheNtDqR2mtlS_DKkRwYgXD58agrlLIILAiltoFWznE-XyZlym56-_TXZRYvNHEIgeSIty-LaPw5jSmD798FfSwcrZ_Y2BupzhprVAFHcaFwlKqM-g7ojh-_J3PlrvK2nWvEiCocttrEBN23cNqVb4Zy5AYZL8Pe6hBAEjoYcVFVfhP02/s838/Snipaste_2024-03-11_14-32-40.png" style="display: block; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="838" data-original-width="773" height="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBWBcIeK5m6KCyheNtDqR2mtlS_DKkRwYgXD58agrlLIILAiltoFWznE-XyZlym56-_TXZRYvNHEIgeSIty-LaPw5jSmD798FfSwcrZ_Y2BupzhprVAFHcaFwlKqM-g7ojh-_J3PlrvK2nWvEiCocttrEBN23cNqVb4Zy5AYZL8Pe6hBAEjoYcVFVfhP02/s600/Snipaste_2024-03-11_14-32-40.png" /></a>
</div>
<p> </p>
<p> </p>
<h3 style="text-align: left;">調整顯示欄位</h3>
<p><br /></p>
<p>
由於欄位數量太多,畫面顯得相當擁擠。所以接下來調整要顯示的欄位內容。 <br />
</p>
<p><br /></p>
<h3 style="text-align: left;">使用 Column 建立自定欄位 </h3>
<p><br /></p>
<p>
這裡限制僅顯示 FirstName, Position, BirthDate, HireDate
四個欄位。簡單指定欄位時只要填入 <Column
dataField={FieldName}></Column> 即可,需要指定型別時再加入 dataType
等屬性,如下表程式碼粗體文字內容。DataGrid allowColumnReordering
屬性則是允許使用者自行調整欄位順序。<br />
</p>
<p><br /></p><p></p><blockquote>...<br />import { DataGrid, <b>Column </b>} from 'devextreme-react/data-grid';<br />...<br /><DataGrid<br /> className={'dx-card wide-card'}<br /> dataSource={employees}<br /> keyExpr="ID"<br /> <b>allowColumnReordering={true}</b>><br /> <b><Column dataField="FirstName"></Column><br /> <Column dataField="Position"></Column><br /> <Column<br /> dataField="BirthDate"<br /> dataType="date"><br /> </Column><br /> <Column<br /> dataField="HireDate"<br /> dataType="date"><br /> </Column></b><br /></DataGrid> </blockquote><br /><p></p><p><br /></p>
<p></p>
<p></p>
<h3 style="text-align: left;">開啟編輯功能</h3>
<p><br /></p><p>加入 <b>Editing </b>標籤,並指定顯示方式為 <b>popup </b>氣泡顯示模式,並加入 <b>allowUpdating</b>, <b>allowDeleting</b>, <b>allowAdding </b>及設定為 <b>true</b>。如此就完成第一部份「帶有 CRUD 的 DataGrid」的內容。<br /></p>
<p><br /></p><blockquote>import { DataGrid, Column, <b>Editing </b>} from 'devextreme-react/data-grid';<br />...<br /><DataGrid><br /> <Column>...</Column><br /> ...<br /><b> <Editing<br /> mode="popup"<br /> allowUpdating={true}<br /> allowDeleting={true}<br /> allowAdding={true}<br /> /></b><br /></DataGrid></blockquote><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4r_vszyHunTHxIb44uMzXHItsqnduy70hwuJahv3BszLRhKaFOC0s1X4SOPAJ8zAvnWpyrvx7WCcTYX9BMEzk31LRiMYe2lpV-nzv1Nay4Bpr_JIpg7h__63KVfU2HeRQvlozmMiDFYPo7Wvrcfo9wY7Ldg4Na9HbfPKhdns70z5scugqjwUqxZ4DaoBe/s839/Snipaste_2024-03-11_15-09-28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="839" data-original-width="776" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4r_vszyHunTHxIb44uMzXHItsqnduy70hwuJahv3BszLRhKaFOC0s1X4SOPAJ8zAvnWpyrvx7WCcTYX9BMEzk31LRiMYe2lpV-nzv1Nay4Bpr_JIpg7h__63KVfU2HeRQvlozmMiDFYPo7Wvrcfo9wY7Ldg4Na9HbfPKhdns70z5scugqjwUqxZ4DaoBe/w592-h640/Snipaste_2024-03-11_15-09-28.png" width="592" /></a></div><br /><p><br /></p>
<p><br /></p>
<h3 style="text-align: left;">總結</h3>
<p><br /></p>
<p>
這篇文章說明 DevExtreme DataGrid
是目前商業套件中最強大的表格工具,面對新手或簡單功能的場合下,在設計上依然容易學習及使用
</p>
<p><br /></p>
<p>
無論你是新手還是有經驗的開發者,這篇文章都會帶給你全新的視角和啟發。DataGrid
這個元件越研究越有意思,讓我們一起持續消化中!
</p>
<p> </p>
<p>喜歡這篇文章的話,記得分享給更多人哦!</p>
<p> </p>
<p> </p>
<h3 style="text-align: left;">See also</h3>
<p></p>
<p><br /></p>
<ul style="text-align: left;">
<li>
<a href="https://js.devexpress.com/React/Documentation/Guide/Data_Binding/Data_Layer/" rel="nofollow" target="_blank">DevExtreme React - Data Layer</a>
</li>
<li><a href="https://js.devexpress.com/React/Documentation/Guide/UI_Components/DataGrid/Getting_Started_with_DataGrid/" rel="nofollow" target="_blank">React DataGrid - Getting Started</a></li>
<li>
<a href="https://grandruru.blogspot.com/2020/08/devextreme-react.html">【翻譯】建立 DevExtreme React 應用程式</a>
</li>
<li>
<a href="https://grandruru.blogspot.com/2024/03/winform-web-helloworld-devextreme.html">WinForm 設計師的 Web 開發秘訣:DevExtreme 教學</a>
</li>
</ul>
<div class="simple-translate-system-theme" id="simple-translate"><div><div class="simple-translate-button isShow" style="background-image: url("moz-extension://9bd1064f-25c0-4051-a38e-b2b7dad0b074/icons/512.png"); height: 22px; left: 54px; top: 650px; width: 22px;"></div><div class="simple-translate-panel " style="font-size: 13px; height: 200px; left: 0px; top: 0px; width: 300px;"><div class="simple-translate-result-wrapper" style="overflow: hidden;"><div class="simple-translate-move" draggable="true"></div><div class="simple-translate-result-contents"><p class="simple-translate-result" dir="auto"></p><p class="simple-translate-candidate" dir="auto"></p></div></div></div></div></div>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-21298215122321263302024-03-04T18:26:00.008+08:002024-03-05T11:29:11.023+08:00WinForm 設計師的 Web 開發秘訣:DevExtreme 教學<p> </p><p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p><p> </p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirad4YijLZtN915Mu3VDK3IPvLeh0-jzr1AxiVxQjillfs6VSDfi79zuG1HjWsqRwDp-_5aEEr99TzQd3MaFeDbCVyFt9b13A846uWBhuTOQqmFKSdqS44RGMWk3aGNtR7BmppGw5oXRcsKfBRJ9hbrqwhLMqA4ZW7onFbYmSF3yNjCFE9Lm6oKH2YC253/s5472/pexels-maria-tyutina-954599.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="3648" data-original-width="5472" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirad4YijLZtN915Mu3VDK3IPvLeh0-jzr1AxiVxQjillfs6VSDfi79zuG1HjWsqRwDp-_5aEEr99TzQd3MaFeDbCVyFt9b13A846uWBhuTOQqmFKSdqS44RGMWk3aGNtR7BmppGw5oXRcsKfBRJ9hbrqwhLMqA4ZW7onFbYmSF3yNjCFE9Lm6oKH2YC253/w640-h426/pexels-maria-tyutina-954599.jpg" width="640" /></a></div>
<p><br /></p>
<p>
許多 WinForm
設計者都被傳統開發方式所制約,要在短時間內寫出符合桌面、平板、手機通用的畫面實在是非常困難。坊間有許多解決方案,以後端
(Back-End) 設計為主的有:ASP.NET 的 Web Form;Delphi 的 IntraWeb、UniGUI
等他們都是以傳統 WinForm 設計概念所發展的框架,佈局和 UI
元件都已經配置好,設計者只要會操作即可。</p><p> </p><h3 style="text-align: left;">後端設計很好,但前端仍然要碰</h3><h3 style="text-align: left;"> </h3>
<p>
後端玩過一陣後,還是覺得以後端為主的 Web
應用程式很沉重,不論是設計還是操作上都是。除此之外,前後端混雜交錯的網頁 (MVC
裡的 V 最明顯)
複雜的程度很高,能接手的大多已是專家級,能交付任務的人選並不多。WinForm 轉 Web
的設計師往往是蠟燭兩頭燒,有沒有更好的作法?</p><p> </p><h3 style="text-align: left;">前端框架學完才發現只有骨架</h3>
<p> </p><p>WinForm 設計者已經習慣邏輯設計,全心學習前端後,我的情況是發現:三大框架
Angular、VUE、React 都只有設計框架,佈局、元件還得另學
HTML、CSS。後台要的格式就那樣,每次都要手刻也太辛苦。而且前端 CSS
佈局難度其實比邏輯更加困難,如果有人可以把 UI
調整一致就能讓我專注在邏輯上了。</p><p> </p><h3 style="text-align: left;">入門?就從 DevExtreme 開始</h3>
<p> </p><p>Bootstrap、EasyUI 都有推 Augular, VUE, React 元件,佈局也沒問題,然而
DevExtreme 還提供了命令列工具,新增頁面、調整配色都可以使用 DevExtreme-CLI
命令列工具完成,這種感覺和操作 Visual Studio Code 的 File > New File
快沒什麼兩樣了。但在這之前請先安裝好
DevExtreme-CLI,如果還沒安裝,請先參閱:<a href="https://grandruru.blogspot.com/2020/08/devextreme-react.html">【翻譯】建立 DevExtreme React 應用程式</a> </p><p> </p>
<h3 style="text-align: left;">
以 DevExtreme + React 為例,建立 Web 應用程式專案
</h3>
<p> </p><p>使用如下的 DevExtreme-CLI 指令建立 my-hello-world
專案,並以預設值:TypeScript、Outer toolbar Layout
作為開始。建立完成後進入該目錄。</p><p> </p><blockquote>
<p>devextreme new react-app my-hello-world<br />cd my-hello-world<br /></p>
</blockquote>
<p><br /></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf3QC3nn7EFCqRRzZh77qCOF_f1pcMBMfXG16okN9xWHoRf3oQbS4vYmyAtrmAKehyl54_AmYNpQinA4x1h6Votr5BwCZxiYd6C2afQgiqqi_uNfBNv91fWbpAX-rak0uUTiY0jPDpbbntut_fYM_WHZG7uSgJU4yWLY4mwSyWCI6YcCOVssrVzSbJyLto/s1113/Snipaste_2024-03-04_16-28-54.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="294" data-original-width="1113" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf3QC3nn7EFCqRRzZh77qCOF_f1pcMBMfXG16okN9xWHoRf3oQbS4vYmyAtrmAKehyl54_AmYNpQinA4x1h6Votr5BwCZxiYd6C2afQgiqqi_uNfBNv91fWbpAX-rak0uUTiY0jPDpbbntut_fYM_WHZG7uSgJU4yWLY4mwSyWCI6YcCOVssrVzSbJyLto/w640-h170/Snipaste_2024-03-04_16-28-54.png" width="640" /></a>
</div><p><br /></p>
<h3 style="text-align: left;">建立 HelloWorld 分頁</h3>
<p>
專案剛建立會有幾張頁面,以方便我們參考。在使用 Visual Studio Code
開啟目錄之前,我們先使用 DevExtreme-CLI 建立一張新頁面,使用指令:</p><p> </p><blockquote>
<p>devextreme add view HelloWorld <br /></p>
</blockquote>
<p> </p>
<p>
接下來啟動 Visual Studio Code, 開啟 my-hello-world 目錄,可以在
<b>Pages</b> 路徑看到剛才建立的 <b>HelloWorld</b> 資料夾,裡面有
<b>HelloWorld.css</b> 和 <b>HelloWorld.tsx</b> 檔案,副檔名 tsx 表示為 支援
TypeScript 的設計檔案。畫面應如下顯示:</p><p> </p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigLXU6IVdtMMjkfl5RlBUiNDUlUo6bBsvxSN69afj3jrCrNd588Tbm3YMHwF5tHtpwGVuPPu3XWxoi99PqgWs0TgFjwQzgZFOVPr41FgxcAQw4-wAbfokZBwJyc0Od5AM7QF4FZaWo-AEP_snjN3389D1UrvlPC_ScdMNXGRmEkEoBwrMyZBWHi4py0EBd/s1024/Snipaste_2024-03-04_17-50-52.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="520" data-original-width="1024" height="326" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigLXU6IVdtMMjkfl5RlBUiNDUlUo6bBsvxSN69afj3jrCrNd588Tbm3YMHwF5tHtpwGVuPPu3XWxoi99PqgWs0TgFjwQzgZFOVPr41FgxcAQw4-wAbfokZBwJyc0Od5AM7QF4FZaWo-AEP_snjN3389D1UrvlPC_ScdMNXGRmEkEoBwrMyZBWHi4py0EBd/w640-h326/Snipaste_2024-03-04_17-50-52.png" width="640" /></a>
</div>
<p><br /></p>
<h3 style="text-align: left;">主菜 -- 建立 Button<br /></h3>
<p> </p><p>接在 import 區的最末句,輸入:</p><br />
<blockquote>
<p>import { Button } from 'devextreme-react';<br /></p>
</blockquote>
<p> </p><p>把 "Put your content here" 內容置換為 <b>Button</b> 標籤,並設定按下後會跳出 <b>Hello World</b> 的提示訊息:</p><p> </p>
<blockquote>
<p>
<Button text='Eden Button' onClick={()=>alert("Hello
World!")}></Button><br />
</p>
</blockquote>
<p> </p><p>此時程式畫面應如下所示:</p><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipCdAlw9FI055gekIBXW8GS-MmPcMpJN-Rl07gdU-SrzaevC34nnc1gNSvmJMAevbmqxybCpmK55EstFEgMiq-v5AvHJJNg9653rdk79CR3n8ZJRM7y9eGW_NOWwiOvQZWCrCSc9JrJwsjhMN9w8nKrJfJ-wB9svkcdfZVUvAh7dQZoR4uUxh_ldz99i0t/s879/Snipaste_2024-03-04_17-54-57.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="445" data-original-width="879" height="324" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipCdAlw9FI055gekIBXW8GS-MmPcMpJN-Rl07gdU-SrzaevC34nnc1gNSvmJMAevbmqxybCpmK55EstFEgMiq-v5AvHJJNg9653rdk79CR3n8ZJRM7y9eGW_NOWwiOvQZWCrCSc9JrJwsjhMN9w8nKrJfJ-wB9svkcdfZVUvAh7dQZoR4uUxh_ldz99i0t/w640-h324/Snipaste_2024-03-04_17-54-57.png" width="640" /></a></div><p><br /></p>
<h3 style="text-align: left;">啟動 Hello World 服務,來看成果吧!</h3>
<p> </p><p>開啟 Visual Studio Code 的終端機頁面,輸入:</p><p> </p><blockquote>npm run start</blockquote><p> </p><p>啟動網站後等它一段時間,系統會自動開啟瀏覽器,並開啟我們的 my-hello-world 網站。接下來點擊選單中的 HelloWorld 項目就會看到剛剛我們所建立的頁面,裡面會看到一個按鈕,按下後就會看到 Hello World 的提示訊息。此時畫面效果應該如下所示:<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9IwPAdgPu12tSgNpaOGmv10q-SJyBNr_GTT5qG7KvcSKGUGEPtULPbUcVTqkLfvANZvhi2OFEFcjXciSTRQHH7RJ3B21De3jTUNWoSOgEiT8C9yOGZdICcBZY1IErifoJ08j2kj5a6g7oU-Rfni5ayk9WoSm46gnUlL_cn4XPDOBonCvrpcPBqT7TTLX3/s986/Snipaste_2024-03-04_18-13-54.png" style="display: block; padding: 1em 0px; text-align: center;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9IwPAdgPu12tSgNpaOGmv10q-SJyBNr_GTT5qG7KvcSKGUGEPtULPbUcVTqkLfvANZvhi2OFEFcjXciSTRQHH7RJ3B21De3jTUNWoSOgEiT8C9yOGZdICcBZY1IErifoJ08j2kj5a6g7oU-Rfni5ayk9WoSm46gnUlL_cn4XPDOBonCvrpcPBqT7TTLX3/s986/Snipaste_2024-03-04_18-13-54.png" style="display: block; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="683" data-original-width="986" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9IwPAdgPu12tSgNpaOGmv10q-SJyBNr_GTT5qG7KvcSKGUGEPtULPbUcVTqkLfvANZvhi2OFEFcjXciSTRQHH7RJ3B21De3jTUNWoSOgEiT8C9yOGZdICcBZY1IErifoJ08j2kj5a6g7oU-Rfni5ayk9WoSm46gnUlL_cn4XPDOBonCvrpcPBqT7TTLX3/s600/Snipaste_2024-03-04_18-13-54.png" width="600" /></a></p><br /><h3 style="text-align: left;">總結</h3><p> </p>
<p>習慣 WinForm 體貼的 IDE 工具開發者在切換到指令模式可能剛開始還不習慣。把上述的指令多敲幾次後就會習慣使用 DevExtreme-CLI 的開發模式。</p><p>和完全從無到有的鍵盤輸入,DevExtreme-CLI 縮短了很多重複建立環境的時間。下一回我會介紹選單內容和標題的修改的教學。</p><p> </p><p>和你分享</p><p> </p>
<h3 style="text-align: left;">See also</h3><p> </p><ul style="text-align: left;"><li><a href="https://grandruru.blogspot.com/2020/08/devextreme-react.html">【翻譯】建立 DevExtreme React 應用程式</a></li><li>文首圖片來源:Pexels 上由 Maria Tyutina 拍攝的相片: https://www.pexels.com/zh-tw/photo/hello-hello-moulding-clay-954599/</li></ul>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-6794020814556232732024-03-04T15:20:00.010+08:002024-03-05T11:29:05.495+08:00SharpDevelop 使用 NuGet 套件管理器,以 Newtonsoft.Json 為例<p> </p><p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p>
<p> </p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXg9XtKXiXCZo-oBJYKhxUAvCznZqohJEyVoZ26Ex8pxmeXHqMq9e84Edwm2aC3YGd7U2217mDHbgVwKP6BqW0VCoa-PfV8-nIyTK1eToOqdxhWXwzAfJYWs6yS8Y4lJ0rSSVFCoR-PNT2KrY5WvopBDO6brP_2aGKvwiAOrPNHZF_Ogar2OVDec4cNedx/s6000/pexels-alberta-studios-9943846.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="4000" data-original-width="6000" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXg9XtKXiXCZo-oBJYKhxUAvCznZqohJEyVoZ26Ex8pxmeXHqMq9e84Edwm2aC3YGd7U2217mDHbgVwKP6BqW0VCoa-PfV8-nIyTK1eToOqdxhWXwzAfJYWs6yS8Y4lJ0rSSVFCoR-PNT2KrY5WvopBDO6brP_2aGKvwiAOrPNHZF_Ogar2OVDec4cNedx/w640-h426/pexels-alberta-studios-9943846.jpg" width="640" /></a>
</div>
<p> </p>
<p>
在 Delphi 裡寫了轉 Json 超好用的
<a href="https://github.com/Eden5Wu/HelperClass/blob/master/EdenDBXJsonHelper.pas">TDBXJSONToolsHelper</a>
單元後,在 C# 開發工具裡 SharpDevelop 卻沒看到類似的 Json
分析工具,覺得很奇怪,一查才知道 C# 裡的 Json 分析有兩款套件:
</p>
<p> </p>
<ul style="text-align: left;">
<li>Newtonsoft.Json (Dot Net 2 - 4.5.2)</li>
<li>System.Text.Json (Dot Net 4.7.2 以上)</li>
</ul>
<p> </p>
<p>
使用 SharpDevelop 有幾個困難,首先是它只支援到 Dot Net 4.5.2,所以只能使用
<b>Newtonsoft.Json</b>。Newtonsoft.Json 也很好,但它卻沒有內建在 Dot Net 4.5
中。所以必須自己另外安裝其套件。最後是 SharpDevelop 並沒有設置
<b>NuGet 套件管理工具</b>,再來是 SharpDevelop
要如何導入這些套件。底下會一步一步帶你做完所有流程。
</p>
<p> </p>
<h3 style="text-align: left;">NuGet 套件管理器安裝<br /></h3>
<p> </p>
<p>
雖然 SharpDevelop 並沒有像 Visual Studio 內建 NuGet
套件管理器,不過微軟有主動對開發生態系有釋出 NuGet 獨立執行檔,讓任何 Dot Net
工程師都可以享受 NuGet 套件的便利。你可以到
<b>https://www.nuget.org</b> 的下載頁面取得獨立執行檔 -- <b>nuget.exe</b>。
</p>
<p> </p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhexkK6qEYS6gaOIMaFD_ym6dpBRV8XNJYsFeDM0VyjHCYai8N-hlf6ijM-F2c6mFKD5ZXWLnBpX5a_UXX48pSvL5PnIBd8okb77yLxU-K1kh-UX92g5sm7MHnO9GKCW290XS-9Gbw1K5AIoTekdk7jQruTHzoEALMT-mpaBV9U_MGryhGALj5mBl9VON4z/s1170/Snipaste_2024-03-04_14-33-15.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="940" data-original-width="1170" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhexkK6qEYS6gaOIMaFD_ym6dpBRV8XNJYsFeDM0VyjHCYai8N-hlf6ijM-F2c6mFKD5ZXWLnBpX5a_UXX48pSvL5PnIBd8okb77yLxU-K1kh-UX92g5sm7MHnO9GKCW290XS-9Gbw1K5AIoTekdk7jQruTHzoEALMT-mpaBV9U_MGryhGALj5mBl9VON4z/w400-h321/Snipaste_2024-03-04_14-33-15.png" width="400" /></a>
</div>
<p> </p>
<h3 style="text-align: left;">Newtonsoft.Json 套件使用 NuGet 下載<br /></h3>
<p> </p>
<p>
使用 "<b>命令提示字元</b>" 進入 NuGet
檔案目錄,並使用以下指令進行安裝。預設會安裝最新版本。安裝後可以在 NuGet
所在路徑看到 Newtonsoft.Json 目錄出現。
</p>
<p><br /></p>
<blockquote>
<p>nuget install Newtonsoft.Json<br /></p>
</blockquote>
<p> </p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-eax8tI8TElCp2wDpsxDU_ige7Mse8Co6cD6f2wAnZLRIgFaJGC8PmcwrDPy_guvkC03k5fOAgagdmst50FbAOMrwx8jmMEGvqsgDVr5KWEpYfAa9j6SGQxamtJj49drG_vA4Fr0zq-rEUwC3qb0MxrFJCSNkx3UyNFTKRLnL7jxQaca3NHbQTvLGyXgZ/s1113/Snipaste_2024-03-04_14-36-48.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="532" data-original-width="1113" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-eax8tI8TElCp2wDpsxDU_ige7Mse8Co6cD6f2wAnZLRIgFaJGC8PmcwrDPy_guvkC03k5fOAgagdmst50FbAOMrwx8jmMEGvqsgDVr5KWEpYfAa9j6SGQxamtJj49drG_vA4Fr0zq-rEUwC3qb0MxrFJCSNkx3UyNFTKRLnL7jxQaca3NHbQTvLGyXgZ/w400-h191/Snipaste_2024-03-04_14-36-48.png" width="400" /></a>
</div>
<p> </p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpcamkvhES_EHFc6bkXXRiRj9RCJkSRAdeKMqWiEBmy6a5yJ6V6Qcf5iCnsxblJAYIsBoJUjDzHGQvpFDCy5p-f8R4h-VoBWMLulNAeXO3j1PAfcIEMJdUNS5aX6e_cuIBfdvjBpxwi_2iW-XBWYwMieFhqw_6v_b0s1PRZHpX-FxTGUJgOIvvn5RQTFXB/s633/Snipaste_2024-03-04_14-39-22.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="233" data-original-width="633" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpcamkvhES_EHFc6bkXXRiRj9RCJkSRAdeKMqWiEBmy6a5yJ6V6Qcf5iCnsxblJAYIsBoJUjDzHGQvpFDCy5p-f8R4h-VoBWMLulNAeXO3j1PAfcIEMJdUNS5aX6e_cuIBfdvjBpxwi_2iW-XBWYwMieFhqw_6v_b0s1PRZHpX-FxTGUJgOIvvn5RQTFXB/w400-h148/Snipaste_2024-03-04_14-39-22.png" width="400" /></a>
</div>
<p style="text-align: left;"> </p>
<h3 style="text-align: left;">SharpDevelop 導入 Newtonsoft.Json 方法<br /></h3>
<p> </p><p>使用 SharpDevelop 開啟你的專案,在 Project 管理視窗點擊滑鼠右鍵,路徑
<b>Add Reference > .NET Assembly Browser > Browse... >
Newtonsoft.Json lib 目錄 > Newtonsoft.Json.dll</b>。之後就可以在你的專案使用。<br /><br />
</p><p> </p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0y8gVBHBqBkxMUPbKdAzWaQv8mGaKQNJm_KgaM-1PkMJySjZU3ue4iJoPuJdTlrPRImAaL2fqJ0iVIuKqkeyqqzNGYDsQtbY9-4JtLyM1sRrerwI6gg717JQipKvORREVHwEMKtRa3Iboa5cxBx1LoeG3edd4h6cL4NpAMt6tVAgYuGg5MqWa76R5yi9v/s444/Snipaste_2024-03-04_14-44-27.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="444" data-original-width="423" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0y8gVBHBqBkxMUPbKdAzWaQv8mGaKQNJm_KgaM-1PkMJySjZU3ue4iJoPuJdTlrPRImAaL2fqJ0iVIuKqkeyqqzNGYDsQtbY9-4JtLyM1sRrerwI6gg717JQipKvORREVHwEMKtRa3Iboa5cxBx1LoeG3edd4h6cL4NpAMt6tVAgYuGg5MqWa76R5yi9v/s320/Snipaste_2024-03-04_14-44-27.png" width="305" /></a>
</div>
<p> </p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga2U1o__aP48EseN4UmeY4sy8fGGLe0QMF92lYrqM-D8T0IjOL65TKb8QJkhU_MnlyaCT8eRJ-_PZAbJe85XORbSrU9CdQkbApnKIs4i908eMJDU2C2wv8dXh-wjv46KWo_yFc_uXLVfjxIDc78Y9Vv7YQ1-gPjVOJpFTRZDjLkXg7bXfjG588ruAdSZgU/s572/Snipaste_2024-03-04_14-47-54.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="431" data-original-width="572" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga2U1o__aP48EseN4UmeY4sy8fGGLe0QMF92lYrqM-D8T0IjOL65TKb8QJkhU_MnlyaCT8eRJ-_PZAbJe85XORbSrU9CdQkbApnKIs4i908eMJDU2C2wv8dXh-wjv46KWo_yFc_uXLVfjxIDc78Y9Vv7YQ1-gPjVOJpFTRZDjLkXg7bXfjG588ruAdSZgU/s320/Snipaste_2024-03-04_14-47-54.png" width="320" /></a>
</div>
<p> </p>
<h4 style="text-align: left;">範例程式碼</h4><p> </p>
<p>
使用一個簡單的 Json 字串並使用 Newtonsoft.Json 套件載入,最後顯示屬性內容
"hello"
</p><p> </p>
<!--HTML generated using hilite.me-->
<div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"> <span style="color: blue;">void</span> Button1Click(<span style="color: #2b91af;">object</span> sender, EventArgs e)
{
<span style="color: #2b91af;">string</span> json = <span style="color: #a31515;">@"{""name"":""hello""}"</span>;
<span style="color: #2b91af;">var</span> obj = JsonConvert.DeserializeObject<<span style="color: #2b91af;">dynamic</span>>(json);
<span style="color: #2b91af;">var</span> name = obj[<span style="color: #a31515;">"name"</span>];
MessageBox.Show(<span style="color: #a31515;">"Hello, "</span> + name);
}
</pre>
</div>
<p> </p>
<h3 style="text-align: left;">總結<br /></h3>
<p>
微軟為了 Dot NET 生態圈所打造的 NuGet 套件管理器著實好用,就算是 SharpDevelop
也能享受到它的福利,使 Dot NET
開發者不用再為套件一個一個去拜訪其官網,只需要一個 NuGet
就可以整合在一起,這真的太好用!<br /><br />
</p>
<p> </p>
<p>和你分享</p>
<p> </p>
<h3 style="text-align: left;">See also</h3><p> </p>
<ul style="text-align: left;">
<li>
<a href="https://stackoverflow.com/questions/58649974/how-to-use-nuget-in-sharpdevelop" rel="nofollow" target="_blank">How to use Nuget in SharpDevelop?</a>
</li>
<li>
<a href="https://www.nuget.org/downloads" rel="nofollow" target="_blank">NuGet.org</a>
</li>
<li>
<a href="https://www.newtonsoft.com/json" rel="nofollow" target="_blank">Newtonsoft.com/json</a>
</li>
<li>
文首圖片來源攝影師:Alberta Studios:
https://www.pexels.com/zh-tw/photo/9943846/ <br />
</li>
</ul>
Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-30893361295336840692024-02-17T16:44:00.001+08:002024-02-17T16:44:44.834+08:00【新手必看】CSS Grid 排版主畫面,從零到一教學!<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p>
<br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg2URq6R52tW8OfuJf1P2rUMTVNJN6FsgtX7xOnmUmfMIoOdqSLoJ071UPEeiSqhJLC3qLRTK9fTLZ33P4HbweCmFzUPwjLGxwWJ_xkkFq4y2DxiDAyXSlFQfqu8CNfHh61VhqzFv5XTBT_c3VP6f72w-i2oBMwmVKnfA8J6qRPhyphenhyphenXBrOLFNVwxP9m1k9x/s1279/pexels-mary-taylor-6009206.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="853" data-original-width="1279" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg2URq6R52tW8OfuJf1P2rUMTVNJN6FsgtX7xOnmUmfMIoOdqSLoJ071UPEeiSqhJLC3qLRTK9fTLZ33P4HbweCmFzUPwjLGxwWJ_xkkFq4y2DxiDAyXSlFQfqu8CNfHh61VhqzFv5XTBT_c3VP6f72w-i2oBMwmVKnfA8J6qRPhyphenhyphenXBrOLFNVwxP9m1k9x/w640-h426/pexels-mary-taylor-6009206.jpg" width="640" /></a></div><br /><br />
<p>
在我的【<a href="https://grandruru.blogspot.com/2020/07/delphi-in-depth-datasnap.html">Delphi in Depth DataSnap 網站應用程式全端開發</a>】一書裡提到,主畫面的製作會使用 東西南北<strike><span style="font-size: x-small;">發</span></strike>中(EWSNC)的版面配置。這是由於網頁前端沒有像 WinForm framework
般有內建制式的版面配置,若要實現類 WinForm 版面配置就要借助 Layout
概念元件來實現,在 EasyUI 中採用【Layout 布局】,在 ExtJS 則採用 【Border
Layout】。
</p>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<td style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8nqOq4Lv5pQJEs0gxOXygEv6ENEciLtMhsg-Hxb6QwSwjZ6G4UulbMxYoudiS3Pr4hyLTlg4eY-yNXmPba_NoUWcdMgK_zDZWGjNc8k_ju6oheMmSB8OsyNOwi3o5NauBNEN9RSLVvJA_RXU7ctRM72LWF_ooI3ZlHV7ICUie0Dm7DA2hCytwJ1Kar1Zs/s604/plugins_layout.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="324" data-original-width="604" height="344" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8nqOq4Lv5pQJEs0gxOXygEv6ENEciLtMhsg-Hxb6QwSwjZ6G4UulbMxYoudiS3Pr4hyLTlg4eY-yNXmPba_NoUWcdMgK_zDZWGjNc8k_ju6oheMmSB8OsyNOwi3o5NauBNEN9RSLVvJA_RXU7ctRM72LWF_ooI3ZlHV7ICUie0Dm7DA2hCytwJ1Kar1Zs/w640-h344/plugins_layout.png" width="640" /></a>
</td>
</tr>
<tr>
<td class="tr-caption" style="text-align: center;">
EasyUI Layout 布局<br />
</td>
</tr>
</tbody>
</table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<td style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdnz3DeIDJwWF6Ej_skzrwneudK7cvdRl0aJWrnxjk6T7iYQt9wZjYWhxaM9uQJR78nBGPvKogTX-a-cc2QP67_sJHN4mAQOjUAT_XoDX8ApB-7rvi5XePaDgXcYp_hSMcoAQfux9RmREW0r6jjfgOVANPlT6zVuiz3gk3MHO20JAIMYFoC7YWkGgpCB9b/s741/26162317_630882f5135c355648.webp" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="531" data-original-width="741" height="458" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdnz3DeIDJwWF6Ej_skzrwneudK7cvdRl0aJWrnxjk6T7iYQt9wZjYWhxaM9uQJR78nBGPvKogTX-a-cc2QP67_sJHN4mAQOjUAT_XoDX8ApB-7rvi5XePaDgXcYp_hSMcoAQfux9RmREW0r6jjfgOVANPlT6zVuiz3gk3MHO20JAIMYFoC7YWkGgpCB9b/w640-h458/26162317_630882f5135c355648.webp" width="640" /></a>
</td>
</tr>
<tr>
<td class="tr-caption" style="text-align: center;">
ExtJS Border Layout<br />
</td>
</tr>
</tbody>
</table>
<p><br /><br /></p>
<h3 style="text-align: left;">傷腦筋,使用多組三方元件時 CSS 就必打架</h3>
<p>EasyUI 和 ExtJS 他們都屬於 JavaScript 應用程式框架,他們的差異在於:</p>
<ul style="text-align: left;">
<li>
EasyUI:jQuery 為核心的可佈局元件組,也可讓 Angular, VUE, React 等框架使用
</li>
<li>
ExtJS:MVVM 為設計概念的 JS 框架,從佈局到小元件的使用採一條龍式的完整框架
</li>
</ul>
<p>
不論是哪一種,只要使用完整的三方元件解決方案, 他們大多會控制到最底層的 CSS
顯示效果,進而造成彼此間的 CSS
或多或少互相干擾的情形。所以可能的話還是要自己試著寫寫看 CSS
Layout,來減少干擾的可能。<br /><br />
</p>
<h3 style="text-align: left;">自己做 Layout 如何?<br /></h3>
<p>
Layout
要自己做而不用元件,這很有挑戰性,目標先定在把東西南北中建立起來,至於可隱藏、自由調整寬度等功能就先忽略。<br /><br />
</p>
<p>之後就來看看僅用 HTML 和 CSS 如何建立 Border Layout。<br /><br /></p>
<h4 style="text-align: left;">HTML</h4>
<p>東西南北中佈局,從字面上來看可以知道會有五個格子,HTML 可以寫成以下內容,實際呈現時可以發現它們會從上到下排列。<br /><br /></p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"> <span style="color: navy; font-weight: bold;"><div</span> <span style="color: red;">class=</span><span style="color: blue;">"container"</span><span style="color: navy; font-weight: bold;">></span>
<span style="color: navy; font-weight: bold;"><header></span>北<span style="color: navy; font-weight: bold;"></header></span>
<span style="color: navy; font-weight: bold;"><nav></span>東<span style="color: navy; font-weight: bold;"></nav></span>
<span style="color: navy; font-weight: bold;"><main></span>
中
<span style="color: navy; font-weight: bold;"></main></span>
<span style="color: navy; font-weight: bold;"><aside></span>西<span style="color: navy; font-weight: bold;"></aside></span>
<span style="color: navy; font-weight: bold;"><footer></span>南<span style="color: navy; font-weight: bold;"></footer></span>
<span style="color: navy; font-weight: bold;"></div></span>
</pre></div>
<br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-IP-w5I2C_NiCYDhmsWxo7OaT95XALhStRKUGDJls2Go3jC0LNxAjBkIZwVDlARY7cQe10DqkhqeXoaibqJMMEIjqDfaplCwRE56ptGkLKvyRFDduSfKqfMSeaEWkMugXwQ0fxoSIDv1_uSKlVDFVLOPBFhSkdgKj_ERpfALwtaF8UauRBLOxMFlsIcEZ/s141/Snipaste_2024-02-17_15-27-33.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="134" data-original-width="141" height="134" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-IP-w5I2C_NiCYDhmsWxo7OaT95XALhStRKUGDJls2Go3jC0LNxAjBkIZwVDlARY7cQe10DqkhqeXoaibqJMMEIjqDfaplCwRE56ptGkLKvyRFDduSfKqfMSeaEWkMugXwQ0fxoSIDv1_uSKlVDFVLOPBFhSkdgKj_ERpfALwtaF8UauRBLOxMFlsIcEZ/s1600/Snipaste_2024-02-17_15-27-33.png" width="141" /></a></div><br />"header" 標籤顧名思義就是佈局最頂端的位置,通常會設立標題在此處。"nav" 標籤用於導覽及連結,常見的是 Tree 元件。"main" 為中間的主要顯示區塊。"aside" 放側邊欄或額外內容。"footer" 放在佈局最底端的內容,通常用於版權宣告。<br /><p><br /></p><p><br /></p>
<h4 style="text-align: left;">CSS <br /></h4>
<p>東西南北中的佈局方式相當制式,類似於表格,所以可以使用 CSS Grid 排版法進行處理。由於呈現"東西中"及"南北中"交錯,所以 Grid 設為 3 x 3 的方式進行排版。"container" 為圖層最底端,決定在它之上的圖層要怎麼排版。按底下的 CSS 設定完成後應該會像下圖顯示的那般好看。<br /></p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;">.container {
<span style="color: navy; font-weight: bold;">display</span>: grid;
grid-template-columns: <span style="color: blue;">16</span>rem <span style="color: blue;">1</span>fr <span style="color: blue;">16</span>rem;
grid-template-rows: <span style="color: navy; font-weight: bold;">auto</span> <span style="color: blue;">1</span>fr <span style="color: navy; font-weight: bold;">auto</span>;
grid-template-areas:
<span style="color: blue;">"header header header"</span>
<span style="color: blue;">"nav content sidebar"</span>
<span style="color: blue;">"footer footer footer"</span>;
<span style="color: navy; font-weight: bold;">min-height</span>: <span style="color: blue;">100</span>dvh;
}
<span style="color: navy; font-weight: bold;">header</span> {
grid-area: header;
<span style="color: navy; font-weight: bold;">padding</span>: <span style="color: blue;">2</span>rem;
<span style="color: navy; font-weight: bold;">background-color</span>: <span style="color: blue;">#C5E1A5</span>;
}
<span style="color: navy; font-weight: bold;">nav</span> {
grid-area: nav;
<span style="color: navy; font-weight: bold;">padding</span>: <span style="color: blue;">2</span>rem;
<span style="color: navy; font-weight: bold;">background-color</span>: <span style="color: blue;">#90CAF9</span>;
}
<span style="color: navy; font-weight: bold;">main</span> {
grid-area: <span style="color: navy; font-weight: bold;">content</span>;
<span style="color: navy; font-weight: bold;">padding</span>: <span style="color: blue;">2</span>rem;
<span style="color: navy; font-weight: bold;">background-color</span>: <span style="color: blue;">#F48FB1</span>;
}
<span style="color: navy; font-weight: bold;">aside</span> {
grid-area: sidebar;
<span style="color: navy; font-weight: bold;">padding</span>: <span style="color: blue;">2</span>rem;
<span style="color: navy; font-weight: bold;">background-color</span>: <span style="color: blue;">#FFAB91</span>;
}
<span style="color: navy; font-weight: bold;">footer</span> {
grid-area: footer;
<span style="color: navy; font-weight: bold;">padding</span>: <span style="color: blue;">2</span>rem;
<span style="color: navy; font-weight: bold;">background-color</span>: <span style="color: blue;">#FFF59D</span>;
}
</pre></div>
<p><br /><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSlw_dE0hmbtEh44YLawuE6ldxFtMVMqsoMfQgjFKtb5eTAfZWPLPn2JqaThma2g8N9SQ4BLZ35N-NkIY2cpeDh2ef4GFwVHvJXabsB9IWY4RN_1TxQ8tde21SoLfnr-fri6jaik6wl3FSHr4EdjvSXfpdRTbZWMOgXeaxdQ_zBsastOwO58vw-3e_tGI8/s1069/Snipaste_2024-02-17_15-56-55.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="603" data-original-width="1069" height="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSlw_dE0hmbtEh44YLawuE6ldxFtMVMqsoMfQgjFKtb5eTAfZWPLPn2JqaThma2g8N9SQ4BLZ35N-NkIY2cpeDh2ef4GFwVHvJXabsB9IWY4RN_1TxQ8tde21SoLfnr-fri6jaik6wl3FSHr4EdjvSXfpdRTbZWMOgXeaxdQ_zBsastOwO58vw-3e_tGI8/w640-h362/Snipaste_2024-02-17_15-56-55.png" width="640" /></a></div><br />"container" 在 "中" 的區塊都用 1fr 將所有剩餘空間給它。關鍵在 "grid-template-areas" 區塊排版內容,這裡使用硬編碼將 3 x 3 的區塊都寫上去,雖然囉嗦了點,但一看就知道整個版型大概的模樣。其它標籤定義 "grid-area" 區塊名稱,grid-template-areas 就是按照 grid-area 進行排版的。<br /><br />
<p></p>
<h3 style="text-align: left;">加入 RWD 吧!<br /></h3>
<p>既然都自己刻 CSS 了,自動適應畫面也順便一起加上去,就加入手機大小的 RWD 處理。因為手機畫面屬於寬度較短,高度較長,所以就使用由上到下排列的方式進行排版。由於有五個區塊,且資訊顯示的權重也不一樣,所以高度的呈現也有所調整。最後使用 "grid-template-areas" 決定手機版面顯示區塊的順序。畫面應如下顯示。<br /> <br /></p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: navy; font-weight: bold;">@media</span> (<span style="color: navy; font-weight: bold;">max-width</span>: <span style="color: navy; font-weight: bold;">1024px</span>) {
.container {
grid-template-columns: <span style="color: blue;">1</span>fr;
grid-template-rows: <span style="color: navy; font-weight: bold;">auto</span> minmax(<span style="color: blue;">5</span>rem, <span style="color: navy; font-weight: bold;">auto</span>) <span style="color: blue;">1</span>fr minmax(<span style="color: blue;">5</span>rem, <span style="color: navy; font-weight: bold;">auto</span>) <span style="color: navy; font-weight: bold;">auto</span>;
grid-template-areas:
<span style="color: blue;">"header"</span>
<span style="color: blue;">"nav"</span>
<span style="color: blue;">"content"</span>
<span style="color: blue;">"sidebar"</span>
<span style="color: blue;">"footer"</span>;
}
}
</pre></div>
<p><br /><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6b3DZtCcVhQ-tTZZy3kiE89NyNFHamKwntC7HXFouVNDOO6iKiRAnCov4CsjvZjOMdGhjGoqxufPo3im-GcG93Ma0aaj_-9Sr1HaGe85auXCuyWrVe4ocgp4JiNpiz-aUxM0VLA54Uefb0rOTeZ_PhMXIWXauKIwSEUPvqbB9Ys1-79C8UVAC96-pY8pS/s770/Snipaste_2024-02-17_16-23-40.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="770" data-original-width="612" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6b3DZtCcVhQ-tTZZy3kiE89NyNFHamKwntC7HXFouVNDOO6iKiRAnCov4CsjvZjOMdGhjGoqxufPo3im-GcG93Ma0aaj_-9Sr1HaGe85auXCuyWrVe4ocgp4JiNpiz-aUxM0VLA54Uefb0rOTeZ_PhMXIWXauKIwSEUPvqbB9Ys1-79C8UVAC96-pY8pS/w509-h640/Snipaste_2024-02-17_16-23-40.png" width="509" /></a></div><br /><br /><p>"grid-template-rows" 對於"東"、"西"兩個區塊使用 minmax(5rem, auto) 限制它最小高度為 5rem,最大高度為 auto。<br /><br /></p><h3 style="text-align: left;">總結</h3><p>本篇文章主要講述使用三方廠商的排版解決方案時,可能遇到因為 CSS 設定底層顯示方式不同而產生的衝突問題。若是底層沒有很複雜,自己寫排版畫面或許可以減少三方廠商元件的衝突問題。至於如何開始,這篇的教學內容相信可以讓你很快速地從 0 到 1 排出心目中理想的畫面。<br /></p><p>和你分享<br /><br /></p>
<h3 style="text-align: left;">See also</h3><ul style="text-align: left;"><li><a href="https://www.youtube.com/watch?v=_gef_lj0FXc" rel="nofollow" target="_blank">Learn How to Make a Responsive CSS Grid Layout</a></li><li><a href="https://developer.mozilla.org/zh-TW/docs/Web/CSS/CSS_grid_layout/Basic_concepts_of_grid_layout" rel="nofollow" target="_blank">格線佈局的基本概念</a></li><li><a href="https://www.books.com.tw/products/0010949821" rel="nofollow" target="_blank">哎呀!原來 React 這麼有趣好玩:圈叉、貪吃蛇、記憶方塊三款經典遊戲實戰練習</a> </li><li>攝影師:Mary Taylor: https://www.pexels.com/zh-tw/photo/polo-6009206/ <br /></li></ul><p><br /></p>
Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-68542339067155875692024-01-19T09:29:00.004+08:002024-01-19T09:31:14.818+08:00如何在 React 18 使用 React Router v6.4 建立路由,超簡單<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p><br /><br />
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_LbEDbhJ3-ibuQ4wl2Fx4hAEx3xTIyduVYCjm6bqs2vuqnFIfSoMtvykO04RPkORuhLQkDvkgTmKNBNNJvjWgOKWSKgjs_z_4AK2QHDikz_lrArI54tnBIlz7b-2PxyqBSG5SUoE93ePshAU6APFWVrldNCMCK8GYJXK06_lfjjgobOsminGPyoRIwTEU/s1280/pexels-photo-19804230.jpeg" style="display: block; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="1280" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_LbEDbhJ3-ibuQ4wl2Fx4hAEx3xTIyduVYCjm6bqs2vuqnFIfSoMtvykO04RPkORuhLQkDvkgTmKNBNNJvjWgOKWSKgjs_z_4AK2QHDikz_lrArI54tnBIlz7b-2PxyqBSG5SUoE93ePshAU6APFWVrldNCMCK8GYJXK06_lfjjgobOsminGPyoRIwTEU/s600/pexels-photo-19804230.jpeg" width="600" /></a></div><br /><br />
<p>
React Router 目的在實現"客戶端路由" (Client Site Routing)。官方文件是這麼介紹的:
</p>
<p>在傳統網站(Server Site),瀏覽器從網站服務端下載文件,解析 CSS 和 JavaScript 資源,之後呈現服務端所要顯示的 HTML 內容。當使用者點擊網頁內的超連結時,它會在頁面(同一個或新頁面)上重新啟動此流程。</p>
<p>客戶端路由可以實現在您的頁面透過點擊超連結更新 URL 時,不需要再從網站服務端再次下載另一個文件。您的頁面可以立即顯示一些新的 UI,並使用 fetch 實現 AJAX,以新資訊來刷新頁面。來讓使用者有更好的操作體驗</p>
<p>React Router 和 React Redux 幾乎是 React 開發者必須會學會的函式庫,本篇文章會逐步帶你邊做邊學如何在 React 18 使用 React Router v6 建立路由,超簡單</p><div style="text-align: left;"><br /></div><div style="text-align: left;"> </div><h3 style="text-align: left;">前置作業:安裝 pnpm 管理 npm 套件</h3><p>因為 pnpm 官方是這麼說的:</p><p></p><blockquote>使用 npm 時,若您有 100 件專案都使用了同個依附套件,磁碟中就會有 100 份該套件的副本。 反之,有了 pnpm,該依附套件會被儲存在一個由內容定址的儲存區,因此:<br /><br /> 如果您同時需要該依附套件的不同版本,只有存在差異的檔案才會被加入儲存區。 例如,如果此依賴套件有 100 個檔案,而新的 版本僅變更其中一個檔案,則 pnpm update 將只會新增一個 新的檔案到儲存庫中,而不會為了單一檔案的變更而複製整個依賴套件。<br /> 所有依賴套件的檔案將被儲存在磁碟中的單一位置。 當依賴套件被 安裝時,依賴套件的檔案會被硬鏈結至該位置,不會消耗 額外的磁碟空間。 這將允許您在不同專案之間共享相同版本的依賴套件。<br /><br />由於上述原因,您將節省大量的磁碟空間,這將與您的 專案和依賴套件的數量成正比,並且將大幅提升安裝的速度!</blockquote><br /><p></p><p>所以我現在也改用 pnpm 來管理 npm 套件:</p><blockquote><p>npm install -g pnpm<br /></p></blockquote><p></p><br /><br /><h3 style="text-align: left;">Step 1. 建立新的 React 應用程式</h3>
<p>使用 pnpm 建立 React 應用程式:</p>
<blockquote>pnpm create vite my-react-router --template react</blockquote><br /><br />
<p>移動到建立的目錄中</p>
<blockquote>cd my-react-router</blockquote><br /><br />
<p>安裝專案所需套件</p>
<blockquote>pnpm install</blockquote><br /><br />
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3ZoopyE9s99p63L4E6jgHi3ukyKd8KeLDP2FrJ1o8d4YLABhh-MZsqVHdeAND31R3lIHevaF_-6WKFL1VFLR0hcBAyALFDEvOyIUMDMSUt7WdlTxAcmnvhiZ4QSdJaGx9WaXTjcVTjTWL_6V6wEgShoUpmfZN2AALOiq82xs2QZc57vZLOwm51JW1e2EL/s1113/Snipaste_2024-01-18_10-37-23.png" style="display: block; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="740" data-original-width="1113" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3ZoopyE9s99p63L4E6jgHi3ukyKd8KeLDP2FrJ1o8d4YLABhh-MZsqVHdeAND31R3lIHevaF_-6WKFL1VFLR0hcBAyALFDEvOyIUMDMSUt7WdlTxAcmnvhiZ4QSdJaGx9WaXTjcVTjTWL_6V6wEgShoUpmfZN2AALOiq82xs2QZc57vZLOwm51JW1e2EL/w400-h266/Snipaste_2024-01-18_10-37-23.png" width="400" /></a></div><br /><br />
<h3 style="text-align: left;">Step 2. 建立呈現的頁面</h3>
<p>在資料夾 src 中建立 pages 資料夾</p>
<p>接著在資料夾 src/pages 建立 Home.jsx</p>
<div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, "Courier New", monospace; font-size: 18px; font-weight: normal; line-height: 24px; white-space: pre;"><div><span style="color: #569cd6;">const</span><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">Home</span><span style="color: #cccccc;"> </span><span style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> () </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #569cd6;">div</span><span style="color: grey;">></span><span style="color: #cccccc;">Home</span><span style="color: grey;"></</span><span style="color: #569cd6;">div</span><span style="color: grey;">></span></div><div><span style="color: #c586c0;">export</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">default</span><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">Home</span></div></div><br /><br />
<p>接著在資料夾 src/pages 建立 Content.jsx</p>
<div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, "Courier New", monospace; font-size: 18px; font-weight: normal; line-height: 24px; white-space: pre;"><div><span style="color: #569cd6;">const</span><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">Content</span><span style="color: #cccccc;"> </span><span style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> () </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #569cd6;">div</span><span style="color: grey;">></span><span style="color: #cccccc;">Content</span><span style="color: grey;"></</span><span style="color: #569cd6;">div</span><span style="color: grey;">></span></div><div><span style="color: #c586c0;">export</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">default</span><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">Content</span></div></div><br /><br /><p>接著在資料夾 src/pages 建立 About.jsx</p>
<div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, "Courier New", monospace; font-size: 18px; font-weight: normal; line-height: 24px; white-space: pre;"><div><span style="color: #569cd6;">const</span><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">About</span><span style="color: #cccccc;"> </span><span style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> () </span><span style="color: #569cd6;">=></span><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #569cd6;">div</span><span style="color: grey;">></span><span style="color: #cccccc;">About Me</span><span style="color: grey;"></</span><span style="color: #569cd6;">div</span><span style="color: grey;">></span></div><div><span style="color: #c586c0;">export</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">default</span><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">About</span></div></div><p></p><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div>
<h3 style="text-align: left;">Step 3. 安裝本次主角: React Router npm 套件<br /></h3>
<p>使用官方教學的安裝指令進行安裝: <br /></p><blockquote><p>pnpm install react-router-dom localforage match-sorter sort-by <br /></p></blockquote><div style="text-align: left;"> </div><h3 style="text-align: left;">Step 4. 註冊 Router<br /></h3><p>這裡註冊 Router 的意思是指建立一個路由分配器,建立時也一併新建路徑及對應頁面,打開 <span style="background-color: #eeeeee;">src/main.jsx</span>,修改後文件應該會如下表所示。</p><br /><br />
src/main.jsx<br />
<div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, "Courier New", monospace; font-size: 18px; font-weight: normal; line-height: 24px; white-space: pre;"><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">React</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">'react'</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">ReactDOM</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">'react-dom/client'</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">App</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">'./App.jsx'</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">'./index.css'</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> {</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">createBrowserRouter</span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">RouterProvider</span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;">} </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">"react-router-dom"</span><span style="color: #cccccc;">;</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">Home</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">"./pages/Home"</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">Content</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">"./pages/Content"</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">About</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">"./pages/About"</span></div><br /><div><span style="color: #569cd6;">const</span><span style="color: #cccccc;"> </span><span style="color: #4fc1ff;">router</span><span style="color: #cccccc;"> </span><span style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">createBrowserRouter</span><span style="color: #cccccc;">([</span></div><div><span style="color: #cccccc;"> {</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">path</span><span style="color: #9cdcfe;">:</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">"/"</span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">element</span><span style="color: #9cdcfe;">:</span><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">App</span><span style="color: #cccccc;"> </span><span style="color: grey;">/></span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">children</span><span style="color: #9cdcfe;">:</span><span style="color: #cccccc;"> [</span></div><div><span style="color: #cccccc;"> {</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">path</span><span style="color: #9cdcfe;">:</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">"Home"</span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">element</span><span style="color: #9cdcfe;">:</span><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Home</span><span style="color: #cccccc;"> </span><span style="color: grey;">/></span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;"> },</span></div><div><span style="color: #cccccc;"> {</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">path</span><span style="color: #9cdcfe;">:</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">"content"</span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">element</span><span style="color: #9cdcfe;">:</span><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Content</span><span style="color: #cccccc;"> </span><span style="color: grey;">/></span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;"> },</span></div><div><span style="color: #cccccc;"> {</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">path</span><span style="color: #9cdcfe;">:</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">"about"</span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">element</span><span style="color: #9cdcfe;">:</span><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">About</span><span style="color: #cccccc;"> </span><span style="color: grey;">/></span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;"> },</span></div><div><span style="color: #cccccc;"> ],</span></div><div><span style="color: #cccccc;"> },</span></div><div><span style="color: #cccccc;">]);</span></div><br /><div><span style="color: #9cdcfe;">ReactDOM</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">createRoot</span><span style="color: #cccccc;">(</span><span style="color: #9cdcfe;">document</span><span style="color: #cccccc;">.</span><span style="color: #dcdcaa;">getElementById</span><span style="color: #cccccc;">(</span><span style="color: #ce9178;">'root'</span><span style="color: #cccccc;">)).</span><span style="color: #dcdcaa;">render</span><span style="color: #cccccc;">(</span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">React.StrictMode</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">RouterProvider</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">router</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: #4fc1ff;">router</span><span style="color: #569cd6;">}</span><span style="color: #cccccc;"> </span><span style="color: grey;">/></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"></</span><span style="color: #4ec9b0;">React.StrictMode</span><span style="color: grey;">></span><span style="color: #cccccc;">,</span></div><div><span style="color: #cccccc;">)</span></div></div><br /><br />
<p>因為我計畫在 Root Layout 裡切換分頁,所以在 root 裡加入 children 內容。</p><br /><br />
<h3 style="text-align: left;">Step 5. 製作導覽功能</h3><p>開啟 <span style="background-color: #eeeeee;">src/App.jsx</span> ,並加入導覽介面,將以下程式碼置換原模板內容</p><p> </p><div style="text-align: left;">src/App.jsx <br /></div><div style="background-color: #1f1f1f; color: #cccccc; font-family: Consolas, "Courier New", monospace; font-size: 18px; font-weight: normal; line-height: 24px; white-space: pre;"><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">'./App.css'</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> { </span><span style="color: #9cdcfe;">Routes</span><span style="color: #cccccc;">, </span><span style="color: #9cdcfe;">Route</span><span style="color: #cccccc;">, </span><span style="color: #9cdcfe;">NavLink</span><span style="color: #cccccc;">, </span><span style="color: #9cdcfe;">Outlet</span><span style="color: #cccccc;"> } </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">"react-router-dom"</span><span style="color: #cccccc;">;</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">Home</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">'./pages/Home'</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">Content</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">'./pages/Content'</span><span style="color: #cccccc;">;</span></div><div><span style="color: #c586c0;">import</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">About</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">from</span><span style="color: #cccccc;"> </span><span style="color: #ce9178;">'./pages/About'</span><span style="color: #cccccc;">;</span></div><br /><div><span style="color: #569cd6;">function</span><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">Layout</span><span style="color: #cccccc;">() {</span></div><div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span><span style="color: #cccccc;"> (</span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #569cd6;">header</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #569cd6;">h1</span><span style="color: grey;">></span><span style="color: #cccccc;">My Super Cool App</span><span style="color: grey;"></</span><span style="color: #569cd6;">h1</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">NavLink</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">to</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"/"</span><span style="color: grey;">></span><span style="color: #cccccc;">首頁</span><span style="color: grey;"></</span><span style="color: #4ec9b0;">NavLink</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">NavLink</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">to</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"/content"</span><span style="color: grey;">></span><span style="color: #cccccc;">內容</span><span style="color: grey;"></</span><span style="color: #4ec9b0;">NavLink</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">NavLink</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">to</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"/about"</span><span style="color: grey;">></span><span style="color: #cccccc;">關於</span><span style="color: grey;"></</span><span style="color: #4ec9b0;">NavLink</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"></</span><span style="color: #569cd6;">header</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #569cd6;">main</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Outlet</span><span style="color: #cccccc;"> </span><span style="color: grey;">/></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"></</span><span style="color: #569cd6;">main</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #569cd6;">footer</span><span style="color: grey;">></span><span style="color: #cccccc;">©️ Eden 2024</span><span style="color: grey;"></</span><span style="color: #569cd6;">footer</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"></></span></div><div><span style="color: #cccccc;"> );</span></div><div><span style="color: #cccccc;">}</span></div><br /><div><span style="color: #569cd6;">function</span><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">App</span><span style="color: #cccccc;">() {</span></div><div><span style="color: #cccccc;"> </span><span style="color: #c586c0;">return</span><span style="color: #cccccc;"> (</span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Routes</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Route</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">element</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Layout</span><span style="color: #d4d4d4;"> </span><span style="color: grey;">/></span><span style="color: #569cd6;">}</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Route</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">path</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"/"</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">element</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Home</span><span style="color: #d4d4d4;"> </span><span style="color: grey;">/></span><span style="color: #569cd6;">}</span><span style="color: #cccccc;"> </span><span style="color: grey;">/></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Route</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">path</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"/content"</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">element</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Content</span><span style="color: #d4d4d4;"> </span><span style="color: grey;">/></span><span style="color: #569cd6;">}</span><span style="color: #cccccc;"> </span><span style="color: grey;">/></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"><</span><span style="color: #4ec9b0;">Route</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">path</span><span style="color: #d4d4d4;">=</span><span style="color: #ce9178;">"/about"</span><span style="color: #cccccc;"> </span><span style="color: #9cdcfe;">element</span><span style="color: #d4d4d4;">=</span><span style="color: #569cd6;">{</span><span style="color: grey;"><</span><span style="color: #4ec9b0;">About</span><span style="color: #d4d4d4;"> </span><span style="color: grey;">/></span><span style="color: #569cd6;">}</span><span style="color: #cccccc;"> </span><span style="color: grey;">/></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"></</span><span style="color: #4ec9b0;">Route</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"></</span><span style="color: #4ec9b0;">Routes</span><span style="color: grey;">></span></div><div><span style="color: #cccccc;"> </span><span style="color: grey;"></></span></div><div><span style="color: #cccccc;"> )</span></div><div><span style="color: #cccccc;">}</span></div><br /><div><span style="color: #c586c0;">export</span><span style="color: #cccccc;"> </span><span style="color: #c586c0;">default</span><span style="color: #cccccc;"> </span><span style="color: #dcdcaa;">App</span></div></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /><p style="text-align: left;">在同一頁進行切換頁面的場合下,會需要在 App 裡增加 Layout 層級,並使用 <span style="background-color: #eeeeee;"> Router Outlet </span> 來顯示 <span style="background-color: #eeeeee;"> Route </span> 內容。<br /><br /><br /></p></div><h3 style="text-align: left;">Step 6. 啟動瀏覽器執行 React 應用程式</h3><p>使用以下指令啟動 Web 服務:</p><blockquote><p>pnpm run dev<br /></p></blockquote><p> </p><p>按照預設值,您可以透過以下網址進入 React 應用程式<br /></p><blockquote><p>http://localhost:5173/</p></blockquote><p> </p><p>畫面應該長成這樣:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhebzxTF9tMNwRBVJZCI7KQrt4-L8BmW7w_9WzFV9GDXIDQPDLDmWtcYZjsEQyo79KFXsTz1g-QAOc8g-fePNs9Z0UogMU2OVrXTxgjou_TNbpOZXxN57EADQLWes-ftgDiM3sCEih1u0Wdh1T1MCYqQcTrLptqY9ZsOQ4oXAxN5OMSzK-J_nuLLuuPWQJM/s638/Snipaste_2024-01-19_09-13-22.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="350" data-original-width="638" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhebzxTF9tMNwRBVJZCI7KQrt4-L8BmW7w_9WzFV9GDXIDQPDLDmWtcYZjsEQyo79KFXsTz1g-QAOc8g-fePNs9Z0UogMU2OVrXTxgjou_TNbpOZXxN57EADQLWes-ftgDiM3sCEih1u0Wdh1T1MCYqQcTrLptqY9ZsOQ4oXAxN5OMSzK-J_nuLLuuPWQJM/w400-h220/Snipaste_2024-01-19_09-13-22.png" width="400" /></a></div><br /><h3 style="text-align: left;">總結</h3><p>本篇介紹 pnpm 套件管理器的好處,以及 Vite 建立 React 應用程式的方法,和 React Router v6.4 的使用。在 Router v6.4 中,由於添加 Remix Data APIs,所以原作者開始推薦使用 RouterProvider 來替代舊版 <BrowserRouter> 的使用,所以這篇文章的寫法可能會和你之前所學過的不太一樣。目前 BrowserRouter 仍然可以相容使用,不過身為前端工程師的我們,還是得接受前端技術會不斷進化的現實。學吧!一起加油!</p><p>和你分享<br /><br /><br /></p><h3 style="text-align: left;">See also</h3><p></p><ul style="text-align: left;"><li><a href="https://pnpm.io/zh-TW/installation#%E4%BD%BF%E7%94%A8-npm-%E4%BE%86%E5%AE%89%E8%A3%9D" rel="nofollow" target="_blank">pnpm 使用 npm 安裝</a> <br /></li><li><a href="https://morioh.com/a/14738c4eee93/react-18-react-router-v6" rel="nofollow" target="_blank">React 18 で React Router v6 を使用してルートを作成する方法</a></li><li><a href="https://reactrouter.com/en/main" rel="nofollow" target="_blank">React Router</a></li></ul><p> <br /></p>
Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-55648192187446783832024-01-17T15:43:00.004+08:002024-01-18T10:33:14.689+08:002 種在 Windows 下快速刪除 node_modules 的方法<div><p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a><br /><br /></p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUI_qn3dSZs4BMwsSHK_VGX-oHiTxXyV5OdDX4gjUfPpKXWFHinFWQ9sOJ_hofD1vAht_hc4Lrfu2xrfulODx6VInIegy20boozeArkoIXMu_zBZKWV1txdW3iAFfkx-lpPHAmK3lC4cgG5KBPAibKHBP1nokm8IvJPK94RJIVySb2JcXv7doRBLzl7FHu/s1280/pexels-pixabay-40784.jpg" style="display: block; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="853" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUI_qn3dSZs4BMwsSHK_VGX-oHiTxXyV5OdDX4gjUfPpKXWFHinFWQ9sOJ_hofD1vAht_hc4Lrfu2xrfulODx6VInIegy20boozeArkoIXMu_zBZKWV1txdW3iAFfkx-lpPHAmK3lC4cgG5KBPAibKHBP1nokm8IvJPK94RJIVySb2JcXv7doRBLzl7FHu/s600/pexels-pixabay-40784.jpg" width="600" /></a></div>
<p>
使用 Node.js 練習開發 JavaScript 專案時,或多或少會遇到需要刪除 node_modules 目錄的情況。以 create-react-app 為例,安裝完成時,node_modules 就有 39,674 個檔案,5,060 個資料夾,約 234 MB。檔案大小估且不計,但 39,674 個檔案光是刪除就要花很多的時間。<br /><br />
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihZNEt_58bMEt8QSFKT_MyQrYBMscIhk1cwuoaxmmzlce3kJ14KmvHCKvGhOpjdwnRwYjszjdjsK9GaWJZrG0UesZn7P1h6kVeV0MmxWL6WfFhX02SICiaAaELd06_dQngfhRerTLYmIyWXubNdfWemerper8EyfXonLENC3WRGZvoxgsUVqpA3S3uUM-v/s397/Snipaste_2024-01-17_11-26-20.png" style="display: block; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="217" data-original-width="397" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihZNEt_58bMEt8QSFKT_MyQrYBMscIhk1cwuoaxmmzlce3kJ14KmvHCKvGhOpjdwnRwYjszjdjsK9GaWJZrG0UesZn7P1h6kVeV0MmxWL6WfFhX02SICiaAaELd06_dQngfhRerTLYmIyWXubNdfWemerper8EyfXonLENC3WRGZvoxgsUVqpA3S3uUM-v/s400/Snipaste_2024-01-17_11-26-20.png" width="400" /></a></div><br /><br />
<h3 style="text-align: left;">糟糕的刪除方式</h3><p>Windows 常見的刪除有 2 種:移至資源回收筒、檔案總管下 Shift+ DELETE 直接刪除。這 2 種都是糟糕到不行的刪除方式。<br /><br /></p>
<br /></div><h4 style="text-align: left;">移至資源回收筒</h4><p>搬到資源回收筒目錄,還需要再刪除一次。<br /><br /><br /></p><h4 style="text-align: left;">檔案總管下 Shift+ DELETE 直接刪除</h4><p>刪除資料前還需為花費大量時間為每個檔案進行檢查。</p><p><br /></p>
<p>除了刪除 node_modules 之外,如果你的目錄也是零碎檔案很多時,也會有相同的問題。這似乎是 Windows 的問題,有沒有可以解決刪除花費大量時間的方法呢?答案是有的,而且還有 2 種:使用 npm rimraf、使用 dos command。<br /><br /></p>
<h3 style="text-align: left;">2 種快速删除 node_modules 的方法</h3>
<h4 style="text-align: left;">使用 npm rimraf</h4>
<p>isaacs 製作了名叫 "rimraf" 的 npm 套件,作者對此套件的說明如下:<br /><br /></p>
<blockquote>The UNIX command rm -rf for node.<br /><br />Install with npm install rimraf.</blockquote><br /><br />
<p>作者復刻 Unix 的 rm 指令(remove),藉由 npm 的架構,讓此套件能跨平台使用。<br /><br /></p>
<h4 style="text-align: left;">rimraf 安裝</h4>
<blockquote>npm install rimraf -g # 可全域使用</blockquote><br /><br />
<h4 style="text-align: left;">rimraf 使用</h4>
<blockquote>rimraf node_modules # 移除 node_modules 目錄</blockquote><br /><br />
<h4 style="text-align: left;">使用 Dos Command</h4>
<p>上述內容可以知道使用 Windows 檔案總管刪除資料並不是這麼理想,不過使用 Dos Command 可是非常有效率的,你可以使用 <span style="background-color: #cccccc;"> <b>rmdir /s/q [FolderName] </b></span> 刪除整個目錄其指令;或使用 <span style="background-color: #cccccc;"> <b>del /f/s/q [FolderName]</b> </span> 刪除所有檔案,只是 del 的指令仍會保留目錄及子目錄結構。整理之後的指令如下:</p><blockquote>del /f/s/q node_modules > nul<br />rmdir /s/q node_modules </blockquote><br />nul 的用意是不要把刪除的流程顯示出來,盡可能地加快刪除效率。<br /><p>StackOverflow 有網友測試了 WinXP 加密磁碟下刪除了 30GB / 1,000,000 個檔案 / 15,000 個資料夾,rmdir 使用約 2.5 小時;del + rmdir 則約 53 分鐘。</p><p>於是可以將以上指令濃縮在一行處理:</p><blockquote>
<p>del /f/s/q node_modules > nul && rmdir /s/q node_modules<br /></p></blockquote><br /><br />
<p>可以確保刪除 node_modeuls 內檔案成功後,再刪除 node_modeuls 資料夾結構。 <br /><br /></p><p>
del 命令說明:</p><ul style="text-align: left;"><li>/f - 強制刪除 (僅管是唯讀的)</li><li>/s - 遞迴子資料夾 </li><li>/q - 安靜執行 (不會有提示給使用者確認)</li></ul><p><br /><br /></p><p>rmdir 命令說明:</p><ul style="text-align: left;"><li>/s - 遞迴子資料夾 (和 del /s 參數指令相同)</li><li>/q - 安靜執行 (和 del /q 參數指令相同)</li></ul><br /><br />
<h3 style="text-align: left;">製作 rm.bat 快速刪除指定資料夾</h3>
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #888888">REM rm.bat</span>
@<span style="color: #008800; font-weight: bold">echo</span> <span style="color: #008800; font-weight: bold">off</span>
<span style="color: #008800; font-weight: bold">if</span> <span style="background-color: #fff0f0">"%1"</span><span style="color: #333333">==</span><span style="background-color: #fff0f0">""</span> (
<span style="color: #008800; font-weight: bold">echo</span> Usage: rm.bat ^<directory^>
exit /b <span style="color: #6600EE; font-weight: bold">1</span>
)
<span style="color: #008800; font-weight: bold">set</span> <span style="background-color: #fff0f0">"target_directory=%1"</span>
<span style="color: #008800; font-weight: bold">echo</span> Deleting <span style="color: #996633">%target_directory%</span>...
<span style="color: #008800; font-weight: bold">del</span> /f /s /q <span style="background-color: #fff0f0">"%target_directory%"</span> > nul
rmdir /s /q <span style="background-color: #fff0f0">"%target_directory%"</span>
<span style="color: #008800; font-weight: bold">echo</span> Cleanup complete.
exit /b <span style="color: #6600EE; font-weight: bold">0</span>
</pre></div>
<br />
<br />
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVBH8yUHse_nprDJJsNOJCeXbNcAJbY2KXIIzdxp_MvHse6pc6RhFDime6fEWDHhQDAvoMCw0Y4qivBeyESJyrdyZiYJ7paLa714qtpoNombdklGf1NqbJ3oAeGyFht5DcxaXtEeD4JaLMoiW5Rym_7rmpvlvI9f47Km6GCY26fdKFLws2ZxTWt9F-JXqd/s333/Snipaste_2024-01-18_10-32-10.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="193" data-original-width="333" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVBH8yUHse_nprDJJsNOJCeXbNcAJbY2KXIIzdxp_MvHse6pc6RhFDime6fEWDHhQDAvoMCw0Y4qivBeyESJyrdyZiYJ7paLa714qtpoNombdklGf1NqbJ3oAeGyFht5DcxaXtEeD4JaLMoiW5Rym_7rmpvlvI9f47Km6GCY26fdKFLws2ZxTWt9F-JXqd/s400/Snipaste_2024-01-18_10-32-10.png"/></a></div>
<br />
<br />
<h3 style="text-align: left;">結論</h3><p>本文介紹 Windows 刪除檔案最常用的方式在刪除 node_modules 目錄時會引發可能的災難。進而說明更有效率的刪除方式有 npm rimraf 和 Dos Command 兩種方式。rimraf 可以讓刪除功能在各家平台都能保持其一致性,Dos Command 則能在 Windows 平台下發揮其最大效能。我個人會偏好使用 Dos Command 並使用批次檔讓執行變得更加容易。不過我相信您在看完這份文件後也可以挑選出適合您的方案。有任何想法都歡迎留言。</p><p>和你分享。</p><br /><br />
<h3 style="text-align: left;">See also</h3>
<ul style="text-align: left;"><li><a href="https://stackoverflow.com/questions/186737/whats-the-fastest-way-to-delete-a-large-folder-in-windows" rel="nofollow" target="_blank">What's the fastest way to delete a large folder in Windows?</a></li><li>
<a href="https://www.cnblogs.com/yeminglong/p/12620473.html" rel="nofollow" target="_blank">windows下快速删除node_modules</a></li><li>文首圖片來源:攝影師:Pixabay: https://www.pexels.com/zh-tw/photo/40784/</li></ul>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-19851708277679859982023-12-20T08:30:00.000+08:002023-12-20T08:30:00.135+08:00Node.js 製作呼叫 Express 的前端網站<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p>
<p> </p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWFrVKTYA6AMXwA4w5CRoHvumaMreoJMD2Eww6ZHzr6oNwe5YjdARWgsMn3iILQ-nDSB-uH6cRROrbIIRX0cKM4-CEh58YqvqastTVGJDUYXxun85hfgpURePtrZAQ8r_Tp7eZCAoARRTb0lX2looR6uJvEE9F-fo9uSyKY5YISphdoq_W05CPyayHIykx/s6000/pexels-ketut-subiyanto-4560148.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="4000" data-original-width="6000" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWFrVKTYA6AMXwA4w5CRoHvumaMreoJMD2Eww6ZHzr6oNwe5YjdARWgsMn3iILQ-nDSB-uH6cRROrbIIRX0cKM4-CEh58YqvqastTVGJDUYXxun85hfgpURePtrZAQ8r_Tp7eZCAoARRTb0lX2looR6uJvEE9F-fo9uSyKY5YISphdoq_W05CPyayHIykx/w640-h426/pexels-ketut-subiyanto-4560148.jpg" width="640" /></a></div><br /> <p></p>
<p> </p>
<p>
後端網站已經完成,前端要怎麼和後端連線和除錯?難道需要先將後端網站放上線,再開發前端去和上線後端連線並除錯。如果後端有錯誤時再回到後端專案來除錯?來看看這個前端範例來如何解決問題吧。
</p>
<p><br /> </p>
<h3 style="text-align: left;">建立前端網站目錄及環境<br /></h3>
<p>建立一個目錄,本範例建立 "my_es6" 目錄。在專案根目錄下初始化npm:</p>
<blockquote>
<p>npm init -y<br /></p>
</blockquote>
<p><br /> </p>
<h4 style="text-align: left;">安裝 Webpack 和相關套件: <br /></h4>
<blockquote>
<p>npm install --save-dev webpack webpack-cli<br /></p>
</blockquote>
<p> <br /></p>
<h4 style="text-align: left;">安裝 webpack-dev-server:</h4>
<blockquote>
<p>npm install webpack-dev-server@latest --save-dev<br /></p>
</blockquote>
<p><br /></p><h4 style="text-align: left;">安裝 html-webpack-plugin:</h4><blockquote><p>npm install html-webpack-plugin --save-dev<br /></p></blockquote><p><br /></p>
<h4 style="text-align: left;">安裝Babel相關套件,用於轉譯ES6語法: <br /></h4>
<blockquote>
<p>
npm install --save-dev @babel/core @babel/preset-env babel-loader <br />
</p>
</blockquote>
<p> <br /><br /></p>
<h4 style="text-align: left;">建立 ".babelrc" 檔案,並配置 Babel:</h4>
<p></p>
<blockquote>{<br /> "presets": ["@babel/preset-env"]<br />}</blockquote>
<br />
<p></p>
<h4 style="text-align: left;">
在專案根目錄下建立 Webpack 配置檔(本例為:webpack.config.js):
</h4>
<p></p>
<blockquote>const path = require('path');<br />const HtmlWebpackPlugin = require('html-webpack-plugin');<br /><br />module.exports = {<br /> mode: 'development',<br /> entry: {<br /> main: './src/index.js',<br /> },<br /> output: {<br /> filename: 'bundle.js',<br /> path: path.resolve(__dirname, 'dist'),<br /> },<br /> devServer: {<br /> static: {<br /> directory: path.join(__dirname, 'public'),<br /> },<br /> port: 8080,<br /> },<br /> plugins: [<br /> new HtmlWebpackPlugin({<br /> template: './public/index.html',<br /> }),<br /> ],<br /> module: {<br /> rules: [<br /> {<br /> test: /\.js$/,<br /> exclude: /node_modules/,<br /> use: {<br /> loader: 'babel-loader',<br /> },<br /> },<br /> ],<br /> },<br />};<br />
</blockquote>
<p>
<br />
</p>
<h4 style="text-align: left;">建立 public 目錄及 index.html 檔案,將以下內容貼上:</h4>
<blockquote>
<!-- index.html --><br /><!DOCTYPE html><br /><html
lang="en"><br /><head><br /> <meta charset="UTF-8"><br />
<meta name="viewport" content="width=device-width,
initial-scale=1.0"><br /> <title>Your ES6
Website</title><br /></head><br /><body><br /> Hello
world<br /> <div id="app"></div><br /></body><br /></html><br />
</blockquote>
<p><br /></p>
<p></p>
<h4 style="text-align: left;">
建立 src 目錄,並在 src 目錄下建立你的網站入口文件(本例為:index.js),將以下
ES6 程式碼貼到這個檔案裡: <br />
</h4>
<p></p>
<blockquote>
// src/index.js<br />const greeting = () => {<br />
console.log('Hello, webpack with ES6!');<br />};<br /><br />greeting();
</blockquote>
<br />
<h4 style="text-align: left;">在 package.json 中新建腳本:</h4>
<p></p>
<blockquote>
"scripts": {<br /> ...<br /> "build": "webpack",<br />
"start": "webpack-dev-server --open",<br />}
</blockquote>
<p>這個設定中的 --open 選項會在啟動時自動打開瀏覽器。</p>
<p> <br /></p>
<h4 style="text-align: left;">執行腳本,啟動網站: <br /></h4>
<blockquote>
<p>npm run start<br /></p>
</blockquote>
<p>
此命令會使用 webpack-dev-server
啟動本地開發伺服器,並且在瀏覽器中開啟你的網頁應用程式。 <br />
</p>
<p> </p>
<h4 style="text-align: left;">若要發佈網站時,建構網站的指令:</h4>
<blockquote>
<p>npm run build<br /></p>
</blockquote>
<p> Webpack 將處理你的 ES6 程式碼,使用 Babel 進行轉譯,並在 dist 目錄下產生
bundle.js。你可以將 bundle.js 引入到你的 HTML
文件中,以在瀏覽器中運行你的網站。下圖是成功運行的圖片:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3veQ_NpajkozjFw2PJNLSVCDvzu9oB9CNsRaTCGRQXuq7AEgVi069GpUCmJrIPJX344z7ky0T4G644YD1fZn54C-FXZGmwdqHvM15InFptGpoHZ820ySkBrjeJCpQULHfXnVg2SILV0_PJDOwTe5ikLxE17CMk7lXAI4y8ytHPXTqwAebRPxRAEAJG83P/s805/screen.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="541" data-original-width="805" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3veQ_NpajkozjFw2PJNLSVCDvzu9oB9CNsRaTCGRQXuq7AEgVi069GpUCmJrIPJX344z7ky0T4G644YD1fZn54C-FXZGmwdqHvM15InFptGpoHZ820ySkBrjeJCpQULHfXnVg2SILV0_PJDOwTe5ikLxE17CMk7lXAI4y8ytHPXTqwAebRPxRAEAJG83P/w400-h269/screen.jpg" width="400" /></a></div><br /> <p></p>
<h3 style="text-align: left;"> 建立呼叫後端 API 的程式及畫面<br /></h3>
<p> </p>
<h4 style="text-align: left;"> 在 webpack 設定檔中 devServer 設定區堿調整如下:</h4><p></p><blockquote> devServer: {<br /> static: {<br /> directory: path.join(__dirname),<br /> },<br /> port: 8080,<br /> proxy: {<br /> '/api': {<br /> target: 'http://localhost:3000',<br /> pathRewrite: { '^/api': '' },<br /> changeOrigin: true,<br /> secure: false,<br /> },<br /> },<br /> },</blockquote><br /><p></p>
<p>這裡的 proxy 設定會把所有 /api/* 的請求導向到 http://localhost:3000。pathRewrite 用來把請求路徑中的 /api 前綴去除,以符合目標伺服器的預期路徑。changeOrigin 設為 true,這樣就會修改請求頭的 Host 欄位,指向目標伺服器。secure 設為 false 可以禁用 SSL 證書驗證,在開發環境中可能會很有用。 <br /></p>
<p><br /> </p>
<h4 style="text-align: left;">修改 index.html 內容: <br /></h4>
<p><br /></p><blockquote><!-- index.html --><br /><!DOCTYPE html><br /><html lang="en"><br /><head><br /> <meta charset="UTF-8"><br /> <meta name="viewport" content="width=device-width, initial-scale=1.0"><br /> <title>Your ES6 Website</title><br /></head><br /><body><br /> <h1>Webpack Front Site Project</h1><br /> <div id="app"></div><br /> <div id="contentdiv"><br /> <table><br /> <tr><br /> <td><br /> <input id="valueField" type="text" value="A B C" /><br /> </td><br /> <td><br /> <button id="btnReverse"><br /> ReverseString<br /> </button><br /> </td><br /> </tr><br /> </table><br /> </div><br /></body><br /></html><br /></blockquote>
<p> </p>
<h4 style="text-align: left;"> 修改 index.js 內容<br /></h4>
<p> </p>
<p></p><blockquote> // src/index.js<br />function onReverseStringClick() {<br /> const valueField = document.getElementById('valueField');<br /> const inputValue = valueField.value;<br /><br /> // 使用 Fetch API 來呼叫伺服器端的 /api/reverse_string<br /> fetch('/api/reverse_string/' + inputValue, {<br /> method: 'GET',<br /> headers: {<br /> 'Content-Type': 'application/json',<br /> },<br /> })<br /> .then(response => response.json())<br /> .then(data => {<br /> // 處理伺服器回傳的資料<br /> const valueField = document.getElementById('valueField');<br /> valueField.value = data.result;<br /> console.log('Reversed String:', data.result);<br /> })<br /> .catch(error => {<br /> console.error('Error:', error);<br /> });<br />}<br /><br />const greeting = () => {<br /> console.log('Hello, webpack with ES6!');<br /> };<br /> <br />greeting();<br /><br />const app = document.getElementById('app');<br />app.innerHTML = '<h1>Hello, Webpack!</h1>';<br /><br />document.getElementById('btnReverse').addEventListener('click', onReverseStringClick);</blockquote><p></p><p><br /></p><p>這段程式碼主要是一個簡單的前端 JavaScript 應用程式,使用了現代的 ES6 語法和 Fetch API 來與後端伺服器進行通訊。以下是程式碼的大致解說:<br /><br /> onReverseStringClick 函式:這是當按鈕被點擊時觸發的事件處理器。它首先從網頁中取得一個 id 為 'valueField' 的輸入元素,然後獲取該元素的值,並使用 Fetch API 發送 GET 請求到伺服器的 /api/reverse_string 路徑。接著,它處理伺服器回傳的 JSON 資料,將反轉後的字串顯示在 'valueField' 輸入元素中,並在控制台輸出反轉後的字串。<br /><br /> greeting 函式:這是一個簡單的箭頭函式,僅在控制台輸出 "Hello, webpack with ES6!"。<br /><br /> app 元素:這裡使用 document.getElementById 取得 id 為 'app' 的元素,並修改其 innerHTML 屬性,插入一個包含 "Hello, Webpack!" 的標題標籤。<br /><br /> 事件監聽器:這裡使用 document.getElementById 取得 id 為 'btnReverse' 的按鈕元素,然後對其添加一個點擊事件監聽器,當按鈕被點擊時,將觸發 onReverseStringClick 函式。<br /></p><p>最後,重新啟動網站。下圖為完成後可能的畫面。<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfD3usNhU_8J16Y9imWYMUTkcTcmBio5EI8wSVMoDXNQPY3hybQmyalkA7h-sQ4GD4XJAiRYne_78itSRxD2umL8C8T0PHS9kGRr17eRFGmghdBh1Zv8Z4c4dYF55Zfw30nt1Q_3JT7NdGXUw70DpFl5d9op2TMLJ-ODvxnccZNmUxltK_eQ67ILHEHBWP/s805/screen.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="541" data-original-width="805" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfD3usNhU_8J16Y9imWYMUTkcTcmBio5EI8wSVMoDXNQPY3hybQmyalkA7h-sQ4GD4XJAiRYne_78itSRxD2umL8C8T0PHS9kGRr17eRFGmghdBh1Zv8Z4c4dYF55Zfw30nt1Q_3JT7NdGXUw70DpFl5d9op2TMLJ-ODvxnccZNmUxltK_eQ67ILHEHBWP/w400-h269/screen.jpg" width="400" /></a></div><h3 style="text-align: left;">總結</h3><p>到目前為止已經將後端和前端快速地製作完成,程式相當簡單,相信任何人經過這套教學流程都能很快將前後端串連起來。期待你能利用這套簡易全端架構再創造出屬於你的網頁應用程式。</p><p>和你分享。</p><p><br /></p><p>See also</p><p>文首圖片來源:攝影師:Ketut Subiyanto: https://www.pexels.com/zh-tw/photo/4560148/</p>
<div class="simple-translate-system-theme" id="simple-translate"><div><div class="simple-translate-button isShow" style="background-image: url("moz-extension://9c7dacad-d792-4a81-b889-bb84ecc2c57a/icons/512.png"); height: 22px; left: 350px; top: 181px; width: 22px;"></div><div class="simple-translate-panel" style="font-size: 13px; height: 200px; left: 0px; top: 0px; width: 300px;"><div class="simple-translate-result-wrapper" style="overflow: hidden;"><div class="simple-translate-move" draggable="true"></div><div class="simple-translate-result-contents"><p class="simple-translate-result" dir="auto"></p><p class="simple-translate-candidate" dir="auto"></p></div></div></div></div></div>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-80749932735638950922023-12-18T08:30:00.007+08:002023-12-18T08:30:00.142+08:00Express 的 Basic Authentication 實作<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a> <br /></p>
<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik1svmtWKM53ekOFNXZSwxS_acUSuM7w2rWGBGC0b4rvAFNlOoZoPRBtJw5dNc_EbScM4tEJ3aAJZLfGLxlCczI4-9PgW5ariaUb_kuskDDbeZNWhrGCAoeDItBc2X6ueaHvDKJRrTv1tpd7SvgoV5lTqKrJds8qFkHNAem7jv-M7vNenI_QmBitxOF60P/s1280/pexels-life-of-pix-4291.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="853" data-original-width="1280" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik1svmtWKM53ekOFNXZSwxS_acUSuM7w2rWGBGC0b4rvAFNlOoZoPRBtJw5dNc_EbScM4tEJ3aAJZLfGLxlCczI4-9PgW5ariaUb_kuskDDbeZNWhrGCAoeDItBc2X6ueaHvDKJRrTv1tpd7SvgoV5lTqKrJds8qFkHNAem7jv-M7vNenI_QmBitxOF60P/w640-h426/pexels-life-of-pix-4291.jpg" width="640" /></a></div><br /> <p></p>
<p> Express 框架本身並未內建基本身份驗證(Basic
Authentication)的功能,但你可以使用第三方的中介軟體(middleware)來實現。一個常見的方式是使用
basic-auth 這個 npm 套件。以下是一個簡單的範例:
</p>
<p>首先,安裝 basic-auth 套件: <br /></p>
<blockquote>
<p> npm install basic-auth<br /></p>
</blockquote>
<br /><br /><p>然後,在你的 Express 應用程式中使用它:</p>
<p> </p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-weight: bold;">const</span> auth <span style="color: #333333;">=</span> require(<span style="background-color: #fff0f0;">'basic-auth'</span>);
<span style="color: #888888;">// 中介軟體函式,用於進行基本身份驗證</span>
<span style="color: #008800; font-weight: bold;">const</span> basicAuth <span style="color: #333333;">=</span> (req, res, next) <span style="color: #333333;">=></span> {
<span style="color: #008800; font-weight: bold;">const</span> credentials <span style="color: #333333;">=</span> auth(req);
<span style="color: #008800; font-weight: bold;">if</span> (<span style="color: #333333;">!</span>credentials <span style="color: #333333;">||</span> credentials.name <span style="color: #333333;">!==</span> <span style="background-color: #fff0f0;">'username'</span> <span style="color: #333333;">||</span> credentials.pass <span style="color: #333333;">!==</span> <span style="background-color: #fff0f0;">'password'</span>) {
res.setHeader(<span style="background-color: #fff0f0;">'WWW-Authenticate'</span>, <span style="background-color: #fff0f0;">'Basic realm="example"'</span>);
res.status(<span style="color: #0000dd; font-weight: bold;">401</span>).send(<span style="background-color: #fff0f0;">'Authentication required'</span>);
<span style="color: #008800; font-weight: bold;">return</span>;
}
<span style="color: #888888;">// 認證成功,繼續處理下一個中介軟體或路由</span>
next();
};
<span style="color: #888888;">// 使用中介軟體進行基本身份驗證</span>
app.use(basicAuth);
</pre></div>
<br /><br />
<p>這個範例中,我們引入了 basic-auth 套件,並建立一個自定義的中介軟體 basicAuth 用於進行基本身份驗證。當瀏覽其它任何路由時,會先使用 app.use(basicAuth) 將中介軟體套用到所有路由之前,進行身份驗證。你可以將 'username' 和 'password' 替換為實際的使用者名稱和密碼。</p>
<p>請注意,基本身份驗證的方式相對簡單,建議在實際應用中使用更強大的身份驗證機制,例如 JSON Web Tokens(JWT)或 OAuth。</p>
<p>使用基本身份驗證是在開發時可以很快速的有個驗證機制,之後要替換也很快速。<br /></p>
<p> </p>
<h3 style="text-align: left;">接下來呢? <br /></h3>
<p>你可以在 basicAuth 時先使用 session 檢查,如果已經登入就不再需要經過基本身份驗證。大概如下面的程式範例。<br /></p>
<p></p><blockquote>const basicAuth = (req, res, next) => {<br /> if (req.session.user) {<br /> next();<br /> return;<br /> }</blockquote><br /><p></p>
<h3 style="text-align: left;">總結 <br /></h3>
<p>Basic Authentication 基本身份驗證是多數 Web API 服務所支援的基礎驗證技術(就如它的名字一樣),由於是明碼在網路上傳輸,所以安全性來說相對較低。若實戰要使用時請務必使用加密傳輸 (https),才能確保其服務的安全。<br /></p>
<p>不過在開發的過程一直要驗證也是挺麻煩的,所以驗證功能通常會在專案的最後再上線。提供您參考。 <br /></p>
<p> </p>
<p>和你分享。</p>
<p> </p>
<p> </p>
<p> See also<br /></p>
<p> 文首圖片來源:攝影師:Life Of Pix: https://www.pexels.com/zh-tw/photo/4291/</p>
Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-2146934143232129202023-12-15T08:30:00.001+08:002023-12-15T08:30:00.166+08:00使用 Swagger UI 來為你的 Express 應用程式中的路由生成 API 說明文件<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a><br /></p><p> </p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOBuGtOlO6IbcFe-nbL2W8GhCq47VxEB3fBMlAq4iQ0lLqTM6Q9fw6A6VXB-vxmKvL4cGvQxIOi42W4fzkg4K2STVWaut9MfnnBjzezx1Sea9xxUUgqENoAZqIb78tlkuc7AO5icdpHnwkUM1qG0OYrf0tgPH9eZF6KLzw83eyF3_lHhfK3zewdfiJxFIe/s4212/pexels-karolina-grabowska-4476376.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2808" data-original-width="4212" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOBuGtOlO6IbcFe-nbL2W8GhCq47VxEB3fBMlAq4iQ0lLqTM6Q9fw6A6VXB-vxmKvL4cGvQxIOi42W4fzkg4K2STVWaut9MfnnBjzezx1Sea9xxUUgqENoAZqIb78tlkuc7AO5icdpHnwkUM1qG0OYrf0tgPH9eZF6KLzw83eyF3_lHhfK3zewdfiJxFIe/w640-h426/pexels-karolina-grabowska-4476376.jpg" width="640" /></a></div><br /> <p></p><p> </p><p>使用 Swagger UI 來為你的 Express 應用程式中的路由生成API說明文件。Swagger UI 提供了一個直觀且互動的方式,讓開發者能夠查看和測試你的 API。</p><p>以下是如何將 Swagger UI 整合到你的 Express 應用程式中的基本步驟: </p><p><br /></p><h3 style="text-align: left;">安裝 Swagger UI 套件</h3><p>使用以下指令安裝:</p><blockquote><p>npm install swagger-jsdoc swagger-ui-express<br /></p></blockquote><p><br /><br /></p><h3 style="text-align: left;">設定 Swagger 設定檔案:<br /></h3><p>在你的專案中建立一個 swagger.js 檔案,用於配置 Swagger UI。例如:<br /></p><p></p><blockquote>const swaggerJsdoc = require('swagger-jsdoc');<br /><br />const options = {<br /> definition: {<br /> openapi: '3.0.0',<br /> info: {<br /> title: 'Express API with Swagger',<br /> version: '1.0.0',<br /> description: 'Documentation for Express API',<br /> },<br /> },<br /> apis: ['./app/*.js'], // 指定 API 路徑,這裡可能需要調整<br />};<br /><br />const specs = swaggerJsdoc(options);<br /><br />module.exports = specs;</blockquote><p></p><p><br /><br /></p><p>設定 Swagger UI 中介軟體:</p><p>在 server.js 中,加入以下程式碼:<br /></p><p></p><blockquote>const express = require('express');<br />const swaggerUi = require('swagger-ui-express');<br />const specs = require('./swagger');<br /><br />const app = express();<br /><br />// ... 其他程式碼 ...<br /><br />// 設定 Swagger UI 中介軟體<br />app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(specs));<br /><br />const PORT = 3000;<br />app.listen(PORT, () => {<br /> console.log(`Server running at http://localhost:${PORT}/`);<br />});</blockquote><p></p><p>在這裡,我們將 Swagger UI 中介軟體掛載到 /api-docs 路徑上,它將使用先前定義的 Swagger 設定檔案(specs)。<br /></p><p><br /><br /></p><h3 style="text-align: left;">註解你的路由:</h3><p>在 server.js 檔案中,使用 Swagger 註解來描述每個路由的信息。以下是一個簡單的範例:<br /></p><p></p><blockquote>/**<br /> * @swagger<br /> * tags:<br /> * name: Strings<br /> * description: Operations related to strings<br /> */<br /><br />/**<br /> * @swagger<br /> * /echo_string/{value}:<br /> * get:<br /> * summary: Echoes the input string<br /> * tags: [Strings]<br /> * parameters:<br /> * - in: path<br /> * name: value<br /> * required: true<br /> * description: The string to be echoed<br /> * schema:<br /> * type: string<br /> * responses:<br /> * 200:<br /> * description: Successful response<br /> * content:<br /> * application/json:<br /> * example: { result: "input_string" }<br /> */<br /><br />app.get('/echo_string/:value', (req, res) => {<br /> res.json({ result: serverMethods.echoString(req.params.value) });<br />});<br /><br />/**<br /> * @swagger<br /> * /reverse_string/{value}:<br /> * get:<br /> * summary: Reverses the input string<br /> * tags: [Strings]<br /> * parameters:<br /> * - in: path<br /> * name: value<br /> * required: true<br /> * description: The string to be reversed<br /> * schema:<br /> * type: string<br /> * responses:<br /> * 200:<br /> * description: Successful response<br /> * content:<br /> * application/json:<br /> * example: { result: "gnirts_tupni" }<br /> */<br /><br />app.get('/reverse_string/:value', (req, res) => {<br /> res.json({ result: serverMethods.reverseString(req.params.value) });<br />});</blockquote><br />這樣的註解會被 Swagger 解析,並顯示在 Swagger UI 中。<br /><p></p><p><br /><br /></p><h3 style="text-align: left;">執行應用程式:</h3><p>最後,執行 node server.js,並瀏覽網址 http://localhost:3000/api-docs,你應該能夠看到 Swagger UI,其中包含你的 API 說明文件。畫面應該長得像下圖的圖片。<br /><br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie_umJqEf5W_QfYalcMg6ZMIM58MVrpasFTjt_0Q7vdopSNsgHUzE9J3pvJStvq_vMRWMc3M98WJ5EpOLFmhSczA4RiwDx53SH1_PF3hTcFw1VfLQgeXzwtYUZQlZpYYiJ3uvFd1VzRryxGZiIpInV2PkbHE88GLPA8J2BQikgbpBoTSdVfAGEU-iUwoBq/s1872/Snipaste_2023-12-08_17-53-41.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1028" data-original-width="1872" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie_umJqEf5W_QfYalcMg6ZMIM58MVrpasFTjt_0Q7vdopSNsgHUzE9J3pvJStvq_vMRWMc3M98WJ5EpOLFmhSczA4RiwDx53SH1_PF3hTcFw1VfLQgeXzwtYUZQlZpYYiJ3uvFd1VzRryxGZiIpInV2PkbHE88GLPA8J2BQikgbpBoTSdVfAGEU-iUwoBq/s320/Snipaste_2023-12-08_17-53-41.png" width="320" /></a></div><br /><br />這樣就完成了 Swagger UI 的整合。透過 Swagger,你能夠更容易地為你的 API 提供說明文件,並讓開發者更容易了解和使用你的 API。<br /><p></p><br /><p>和你分享。<br /></p><p><br /></p><p>See also<br /></p><p>文首圖片來源:攝影師:Karolina Grabowska: https://www.pexels.com/zh-tw/photo/4476376/</p><p><br /></p>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-73246697559005576262023-12-13T08:30:00.001+08:002023-12-13T08:30:00.134+08:00Express 加入 Session 機制<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwE0qlIQRNlcyv4DnPmbh_EKIYwrCxICVX24MTH2fHV88kSReVxI-uSfelQ4xr_ytT9ZKI2ushBd6hh10ubZW-tupbMCS_mC09PZueP6VF_sDtHoBtTz5yUOF3YUSY8Ur8lAJU9-9gZjUYoBH1-ic54RibOdBGFB59bM6pgoG5bUj7inhdA5yTGtyZWm9C/s1280/pexels-shvets-production-7176317.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="853" data-original-width="1280" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwE0qlIQRNlcyv4DnPmbh_EKIYwrCxICVX24MTH2fHV88kSReVxI-uSfelQ4xr_ytT9ZKI2ushBd6hh10ubZW-tupbMCS_mC09PZueP6VF_sDtHoBtTz5yUOF3YUSY8Ur8lAJU9-9gZjUYoBH1-ic54RibOdBGFB59bM6pgoG5bUj7inhdA5yTGtyZWm9C/w640-h426/pexels-shvets-production-7176317.jpg" width="640" /></a></div><br /><p><br /></p><p>這篇文章會介紹 Express 加入 Session 中介軟體後具備狀態管理能力,處理機敏資料來說,Session 仍是一個還蠻不錯的機制,不一定需要全有或是全無。接下來帶您一步一步將 Session 功能建立起來。<br /> <br /></p><h3 style="text-align: left;">安裝 express-session 套件 <br /></h3><p>express-session 安裝是在 Terminal 下輸入以下指令:<br /></p><blockquote><p>npm install express-session <br /></p></blockquote><p><br /> </p><h3 style="text-align: left;">建立 Session 中介軟體<br /></h3><p>建立 Session 中介軟體讓每個 request 進來時都要先經過它來處理及管理 session。將以下的程式碼複製到 server.js 裡。</p><br /><br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-weight: bold;">const</span> session <span style="color: #333333;">=</span> require(<span style="background-color: #fff0f0;">'express-session'</span>);
<span style="color: #888888;">// 設定 express-session 中介軟體</span>
app.use(session({
secret<span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">'your-secret-key'</span>,
resave<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">false</span>,
saveUninitialized<span style="color: #333333;">:</span> <span style="color: #008800; font-weight: bold;">true</span>,
}));
</pre></div>
<p><br /></p><p>以下是對這段程式碼的解釋:</p><ol><li><p><code>express-session</code> 是一個 Express 中的中介軟體,它用於管理用戶的會話,並將會話資訊存儲在伺服器端。這是一種在無狀態的 HTTP 協議上實現有狀態的解決方案。</p></li><li><p><code>app.use(session(...))</code>:這行程式碼使用 <code>app.use</code> 方法將 <code>express-session</code> 中介軟體套用到 Express 應用程式中。這確保在每個請求進入伺服器之前,<code>express-session</code> 中介軟體都會處理和管理會話。</p></li><li><p>中介軟體的設定選項:</p><ul><li><code>secret</code>:這是一個字串,用於簽署(sign)用戶會話,以防止被竄改。應該是一個安全的隨機字串,這是確保會話安全性的一部分。</li><li><code>resave</code>:如果為 <code>true</code>,則每次請求進來時都會重新保存會話,即使是未修改的。這通常設置為 <code>false</code>,以避免不必要的會話存儲操作。</li><li><code>saveUninitialized</code>:如果為 <code>true</code>,則未初始化的會話也會被保存。未初始化的會話是指新會話但未被修改的會話。通常設置為 <code>true</code>。</li></ul></li></ol><p>這段程式碼確立了一個基本的 <code>express-session</code> 配置,以啟用用戶會話的管理功能。這樣,當用戶進行登入等操作時,你就可以使用 <code>req.session</code> 物件來存儲和訪問相關的會話資訊。底下可以看到使用 session 前和使用 session 後的 response 內容。<br /><br /><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifVlaiPdHp2VfFt9YrDROusCzvtBEYhy9ZRdqu0ygWMHOLF6Pa0w7SpB-InK-d3JADutDEv6WnaAhgs970oV1brr-coMjTqs5Bh6pYg6B3X5VxLUoraF_igkmMah5R15VnR5ago-Ff0wc27pOIn_AP8ZkkANDpTGegOPFahFW_IHohbM2p9L8_XyewM2E3/s1044/Snipaste_2023-12-08_14-48-10.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="605" data-original-width="1044" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifVlaiPdHp2VfFt9YrDROusCzvtBEYhy9ZRdqu0ygWMHOLF6Pa0w7SpB-InK-d3JADutDEv6WnaAhgs970oV1brr-coMjTqs5Bh6pYg6B3X5VxLUoraF_igkmMah5R15VnR5ago-Ff0wc27pOIn_AP8ZkkANDpTGegOPFahFW_IHohbM2p9L8_XyewM2E3/s320/Snipaste_2023-12-08_14-48-10.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">使用 session 前<br /></td></tr></tbody></table><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis40krN16q7CqgQVdngTy40w0GgCz24T4GzQCEv5to0muHqRECKPSF0eYhS0oAk5sRi8-ce5k038KGJVPzGvAeyVLQEYbnMmTEfC_4mt3UBfkfKF8G_P_sWWCU8BpD6LDSOeOJp9Q2LOJKDQgMBrL0fVfPezCIXC-B07DdTTwiBmg1gKhZ2ERFQ2_YR6tO/s967/Snipaste_2023-12-08_14-48-37.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="686" data-original-width="967" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis40krN16q7CqgQVdngTy40w0GgCz24T4GzQCEv5to0muHqRECKPSF0eYhS0oAk5sRi8-ce5k038KGJVPzGvAeyVLQEYbnMmTEfC_4mt3UBfkfKF8G_P_sWWCU8BpD6LDSOeOJp9Q2LOJKDQgMBrL0fVfPezCIXC-B07DdTTwiBmg1gKhZ2ERFQ2_YR6tO/s320/Snipaste_2023-12-08_14-48-37.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">使用 session 後<br /></td></tr></tbody></table><br /><p><br /></p><h3 style="text-align: left;">總結<br /></h3><p>使用 session 中介軟體可以使 Express RESTful 服務提供會話機制,在日後如果要管理使用者狀態是一個不可或缺的套件,而透過實作可以知道,要在 Express 上建立中介軟體也是一件非常簡單的事。我們之後在深入開發時還會再用到它。</p><p><br /></p><p>和你分享。<br /></p><p><br /></p><p>See also <br /></p><p>文首圖片來源: 攝影師:SHVETS production: https://www.pexels.com/zh-tw/photo/7176317/<br /></p>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-36382679088427689992023-12-11T07:39:00.000+08:002023-12-11T07:39:43.749+08:00Express 建立 echoString 和 reverseString 方法<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p>
<br /><br />
<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgukVXjArenh1ylDdU39VOJE61J_pcgFh4yTjKnU5hE_Dhyphenhyphenmb-XJFwR1mIAwspsA_H-1Df9JFIXwo7XbZUEWHbUriZpzBOrH9WUvyXXtEwpuBIO12SCwu7IsR9LMciJpqDkg_rw3BVjKtNERTAXrVQvsX7kaFusU6onF-49iCzTHiviJ3WJ1Z2NJhKSuXDd/s1920/laptop-6962810_1920.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1152" data-original-width="1920" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgukVXjArenh1ylDdU39VOJE61J_pcgFh4yTjKnU5hE_Dhyphenhyphenmb-XJFwR1mIAwspsA_H-1Df9JFIXwo7XbZUEWHbUriZpzBOrH9WUvyXXtEwpuBIO12SCwu7IsR9LMciJpqDkg_rw3BVjKtNERTAXrVQvsX7kaFusU6onF-49iCzTHiviJ3WJ1Z2NJhKSuXDd/w640-h384/laptop-6962810_1920.jpg" width="640" /></a></div><br /><p></p>
<br /><br />
<p>
<a href="https://grandruru.blogspot.com/2023/12/nodejs-http-delphi-webbroker-datasnap.html">上一節</a>提到 Node.js 搭配 Express 就能很快速的製作做 RESTful API
服務,這次要來新增服務模組。<br />
</p>
<h3 style="text-align: left;">建立 servermethods.js 模組<br /></h3>
<p>
打開<a href="https://grandruru.blogspot.com/2023/12/nodejs-http-delphi-webbroker-datasnap.html">上一節</a>的專案,在 app 目錄中建立 servermethods.js,將以下程式碼貼上去:<br />
</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #888888;">// servermethods.js</span>
<span style="color: #008800; font-weight: bold;">function</span> echoString(aValue){
<span style="color: #008800; font-weight: bold;">return</span> aValue;
}
<span style="color: #008800; font-weight: bold;">function</span> reverseString(aValue){
<span style="color: #008800; font-weight: bold;">return</span> aValue.split(<span style="background-color: #fff0f0;">""</span>).reverse().join(<span style="background-color: #fff0f0;">""</span>);
}
module.exports <span style="color: #333333;">=</span> {
echoString,
reverseString
}
</pre></div>
<div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div class="flex flex-grow flex-col max-w-full"><div class="min-h-[20px] text-message flex flex-col items-start gap-3 whitespace-pre-wrap break-words [.text-message+&]:mt-5 overflow-x-auto" data-message-author-role="assistant" data-message-id="d30b8842-bab3-4ad2-8d07-e605fc1575a1"><div class="markdown prose w-full break-words dark:prose-invert dark"><p>這是一個簡單的 Node.js 模組,檔名為 <code>servermethods.js</code>。以下是程式解說:</p><ol><li><p><b>模組導出:</b><br /><code>module.exports</code> 這一行將兩個函式 <code>echoString</code> 和 <code>reverseString</code> 導出,讓其他檔案可以引入這個模組並使用這兩個函式。</p></li><li><p><b><code>echoString</code> 函式:</b><br />這個函式接收一個參數 <code>aValue</code>,然後直接將它回傳。換句話說,這個函式的作用是傳回接收到的值,不作任何處理。</p></li><li><p><b><code>reverseString</code> 函式:</b><br />這個函式也接收一個參數 <code>aValue</code>,但是它做了一些處理。首先,它使用 <code>split("")</code> 方法將接收到的字串轉換為一個字元陣列。接著,使用 <code>reverse()</code> 方法將這個字元陣列反轉。最後,使用 <code>join("")</code> 方法將反轉後的字元陣列重新組合成字串。簡單來說,這個函式的目的是將傳入的字串進行反轉操作,並將結果回傳。</p></li></ol><p>這個模組提供了兩個簡單的函數,一個是直接回傳傳入值的 <code>echoString</code> 函數,另一個是將傳入字串進行反轉的 <code>reverseString</code> 函數。這樣的模組可以在其他地方引入,並使用這兩個函式進行相應的操作。</p></div></div></div>
<div style="text-align: left;"> </div><div style="text-align: left;"> </div>
<h3 style="text-align: left;">建立使用 serverMethods 的路由</h3>
<p>打開 server.js 檔案,將以下程式貼到裡面。</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #888888;">// 引入 servermethods 模組</span>
<span style="color: #008800; font-weight: bold;">const</span> serverMethods <span style="color: #333333;">=</span> require(<span style="background-color: #fff0f0;">'./app/servermethods'</span>);
<span style="color: #888888;">//...</span>
app.get(<span style="background-color: #fff0f0;">'/echo_string/:value'</span>, (req, res) <span style="color: #333333;">=></span> {
res.json(serverMethods.echoString(req.params.value));
});
app.get(<span style="background-color: #fff0f0;">'/reverse_string/:value'</span>, (req, res) <span style="color: #333333;">=></span> {
res.json(serverMethods.reverseString(req.params.value));
});
</pre></div>
<div style="text-align: left;"> </div><div style="text-align: left;"> </div><div class="flex flex-grow flex-col max-w-full"><div class="min-h-[20px] text-message flex flex-col items-start gap-3 whitespace-pre-wrap break-words [.text-message+&]:mt-5 overflow-x-auto" data-message-author-role="assistant" data-message-id="f9a65f3c-c3c8-409e-bff7-d79f8fa3460b"><div class="markdown prose w-full break-words dark:prose-invert dark"><p>這段程式碼繼承上一節 server.js,透過 Express 框架實現了兩個 API 端點。以下是程式解說:</p><ol><li><p><b>引入模組:</b><br />使用 <code>require('./app/servermethods')</code> 引入了名為 <code>servermethods</code> 的模組。該模組包含了兩個函式,分別為 <code>echoString</code> 和 <code>reverseString</code>。</p></li><li><p><b>路由設定:</b><br />使用 Express 框架的 <code>app.get</code> 方法設定了二個不同的路由:</p><ul><li><p><code>/echo_string/:value</code> 路由:當收到這個路由的 HTTP GET 請求時,會呼叫 <code>serverMethods.echoString</code> 函式,將請求參數中的值傳入函式,然後將函式的結果以 JSON 格式回傳給客戶端。</p></li><li><p><code>/reverse_string/:value</code> 路由:當這個路由收到 HTTP GET 請求時,會呼叫 <code>serverMethods.reverseString</code> 函式,將請求參數中的值傳入函式,然後以 JSON 格式回傳函式的結果。</p></li></ul></li><li><p><b>回應結果:</b><br />路由處理都使用 <code>res.json</code> 方法回傳 JSON 格式的結果給客戶端,<code>serverMethods.echoString</code> 和 <code>serverMethods.reverseString</code> 這兩個函式的結果會被包裝在一個具有 <code>result</code> 屬性的 JSON 物件中。</p></li></ol><p>簡單來說,我們做了兩個簡單的 API 端點,一個是回傳接收到的字串,另一個是回傳反轉後的字串。這些 API 可以在應用程式中被其他端點或前端應用程式所使用。</p><p>最後在 Terminal 輸入 "node server.js" 啟動 RESTful 服務,使用</p><ul style="text-align: left;"><li>http://localhost:3000/echo_string/A B C</li><li>http://localhost:3000/reverse_string/A B C</li></ul><p>就可以看到類似下圖的結果。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5uqKWMqVqyy7NqkVzDQa1k9jIDplzYvG-jWEsgeH0lxbPqRAlrp4XUbkSsxprFZTKxXjDIVfMxFjRz4OEitXvmhPBBLiTg4B0sgDT5KjAaDUFjoHJ8vXT0iNP8wawP-mMdrFqTiYqocV1V3wLDs9ZOMx_faU7QWBy96VwX_wGNtKm-6idDFzodVYkWs-Q/s448/Snipaste_2023-12-08_09-26-55.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="381" data-original-width="448" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5uqKWMqVqyy7NqkVzDQa1k9jIDplzYvG-jWEsgeH0lxbPqRAlrp4XUbkSsxprFZTKxXjDIVfMxFjRz4OEitXvmhPBBLiTg4B0sgDT5KjAaDUFjoHJ8vXT0iNP8wawP-mMdrFqTiYqocV1V3wLDs9ZOMx_faU7QWBy96VwX_wGNtKm-6idDFzodVYkWs-Q/s320/Snipaste_2023-12-08_09-26-55.png" width="320" /></a></div><br /><p></p><p> </p></div></div></div><div style="text-align: left;"> </div><h3 style="text-align: left;">總結</h3>
<p>這個範例主要是將之前常看到的啟動範例復刻到 Express 上,實作上也相當簡單,servermethods.js 提供 echoString、reverseString 兩個文字處理函式;server.js 增加兩個路由來呼叫 servermethods.js 的函式並回傳結果。此範本很適合未來新專案的起手式。</p><p>和你分享。 <br /><br /><br /></p><p></p><p>See also</p>
首圖由<a href="https://pixabay.com/zh/users/geralt-9301/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=6962810">Gerd Altmann</a>在<a href="https://pixabay.com/zh//?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=6962810">Pixabay</a>上發布Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-85733583000721129172023-12-08T09:00:00.005+08:002023-12-08T09:40:06.178+08:00Node.js 製作 RESTful API 服務 (含 Express 套件介紹)<p>
作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a>
</p>
<p> </p>
<p></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh995be4r6u0geRMcF9wKR43LZocuFSTZslVTa2m1FFiOFM6OmKfYdjfMy3upZ_vO9UQhDOYhEKOQKYXMF5vIhmt4RK2nSizeO8_SIYHNOrPYmUpJApVIEr82qy4xavY7soclQCFqm_uGXneWxkg8q2aIMIjb2DqvSosC0ILSKOaTxe1E3s7unN3w6SwfRF/s1920/pexels-klaus-nielsen-6287465.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1920" data-original-width="1280" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh995be4r6u0geRMcF9wKR43LZocuFSTZslVTa2m1FFiOFM6OmKfYdjfMy3upZ_vO9UQhDOYhEKOQKYXMF5vIhmt4RK2nSizeO8_SIYHNOrPYmUpJApVIEr82qy4xavY7soclQCFqm_uGXneWxkg8q2aIMIjb2DqvSosC0ILSKOaTxe1E3s7unN3w6SwfRF/w426-h640/pexels-klaus-nielsen-6287465.jpg" width="426" /></a>
</div>
<br />
<p></p>
<p>
這期要來開始製作第一個 Http 服務程式。首先,先建立一個名為 "HelloHttp"
資料夾。<br /><br /><br />
</p>
<h3 style="text-align: left;">在資料夾新建專案 - 初始化專案<br /></h3>
<p>
Node.js 新建專案的方式叫「初始化專案」,使用 Terminal 在前面建立的 HelloHttp
資料夾輸入:
</p>
<blockquote>
<p>npm init<br /></p>
</blockquote>
<p><br /></p>
<p>
輸入完成後 npm 會啟動互動式介面詢問我們這個專案的基本資料,原則上可以一直按
ENTER
來輸入預設值,這裡由於我的進入點想和一般網頁區隔,以便於識別服務的入口,所以命名為
"server.js"。完成後會在專案目錄下建立 package.json。<br /><br /><br />
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8l2kmXXLNDaDPrkj7HffHnOIGQJMlbSHxuko5aXPjmwAqvV2CWpKlJy7YGIM7DdbcgINvOUrmFVYDyj1Ej4BeGriW7uNpZq7fOdz9s5UEsw_8lD6WENENt86FMm4UfCjaYeZUNEDY-6JPmWaAIEjVl1zjyLS1EyPBjL-JPs1-IO2kg_LUG-PkW-gr1R-I/s654/Snipaste_2023-12-07_15-31-41.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="654" data-original-width="560" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8l2kmXXLNDaDPrkj7HffHnOIGQJMlbSHxuko5aXPjmwAqvV2CWpKlJy7YGIM7DdbcgINvOUrmFVYDyj1Ej4BeGriW7uNpZq7fOdz9s5UEsw_8lD6WENENt86FMm4UfCjaYeZUNEDY-6JPmWaAIEjVl1zjyLS1EyPBjL-JPs1-IO2kg_LUG-PkW-gr1R-I/w343-h400/Snipaste_2023-12-07_15-31-41.png" width="343" /></a>
</div>
<p><br /></p>
<h3 style="text-align: left;">建立並編輯 server.js</h3>
<p>
接著使用編譯器新增 "server.js",並將底下的程式碼複製到該檔案中並存檔。<br />
</p>
<!--HTML generated using hilite.me-->
<div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #888888;">// 引入 http 模組</span>
<span style="color: #008800; font-weight: bold;">const</span> http <span style="color: #333333;">=</span> require(<span style="background-color: #fff0f0;">'http'</span>);
<span style="color: #888888;">// 建立一個 HTTP 伺服器</span>
<span style="color: #008800; font-weight: bold;">const</span> server <span style="color: #333333;">=</span> http.createServer((req, res) <span style="color: #333333;">=></span> {
<span style="color: #888888;">// 處理請求</span>
res.writeHead(<span style="color: #0000dd; font-weight: bold;">200</span>, {<span style="background-color: #fff0f0;">'Content-Type'</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">'text/plain'</span>});
res.end(<span style="background-color: #fff0f0;">'Hello, World!\n'</span>);
});
<span style="color: #888888;">// 監聽 3000 port</span>
<span style="color: #008800; font-weight: bold;">const</span> PORT <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">3000</span>;
server.listen(PORT, () <span style="color: #333333;">=></span> {
console.log(<span style="background-color: #ffaaaa; color: red;">`</span>Server running at http<span style="color: #333333;">:</span><span style="color: #888888;">//localhost:${PORT}/`);</span>
});
</pre>
</div>
<p> </p>
<h3 style="text-align: left;">啟動第一支 Http 服務<br /></h3>
<p>
使用以下指令來啟動服務。啟動服務後再開啟瀏覽器,在網址列輸入:http://localhost:3000,就可以看到如下圖的結果。
</p>
<blockquote>
<p>node server.js<br /></p>
</blockquote>
<p> </p>
<p></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAfNt7BeCapnL-a5syWRTxZP8Oac4HteVud1XqcDsZv6w3De6edWCqJs5cAlwuDDG9gH2CX_EZWO__nblizUnjonGJvUvSQtFsfU4LdO3dZQFA3WMMt8jvYE1O6401MqsNBbtxgm4s1uJJ-8dZY4LRyMShtdZlOHcTX-bLZPjczuC1K4nsVk-Bf97n2GVq/s1299/Snipaste_2023-12-07_15-45-22.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="867" data-original-width="1299" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAfNt7BeCapnL-a5syWRTxZP8Oac4HteVud1XqcDsZv6w3De6edWCqJs5cAlwuDDG9gH2CX_EZWO__nblizUnjonGJvUvSQtFsfU4LdO3dZQFA3WMMt8jvYE1O6401MqsNBbtxgm4s1uJJ-8dZY4LRyMShtdZlOHcTX-bLZPjczuC1K4nsVk-Bf97n2GVq/s320/Snipaste_2023-12-07_15-45-22.png" width="320" /></a>
</div>
<br />
<p></p>
<h4 style="text-align: left;">建立計算機模組<br /></h4>
<p>
在專案資料夾建立 "app" 目錄,並建立 "calc.js"
檔案,將底下的程式碼貼上後存檔。<br />
</p>
<!--HTML generated using hilite.me-->
<div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #888888;">// app/calc.js</span>
<span style="color: #008800; font-weight: bold;">function</span> add(a, b) {
<span style="color: #008800; font-weight: bold;">return</span> a <span style="color: #333333;">+</span> b;
}
module.exports <span style="color: #333333;">=</span> {
add,
};
</pre>
</div>
<p> </p>
<h4 style="text-align: left;">增加 sum 路由<br /></h4>
<p>
修改 http.createServer 內的程式,加入 /sum 路由,並且讀取 request 裡的參數 a
和 參數 b,接著呼叫 add 函式將 a 和 b 加總,加總結果寫入 json
物件並回傳給客戶端。修改的程式碼可能長成下面的模樣。
</p>
<!--HTML generated using hilite.me-->
<div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0px;"><span style="color: #888888;">// 引入 http 模組</span>
<span style="color: #008800; font-weight: bold;">const</span> http <span style="color: #333333;">=</span> require(<span style="background-color: #fff0f0;">'http'</span>);
<span style="color: #008800; font-weight: bold;">const</span> url <span style="color: #333333;">=</span> require(<span style="background-color: #fff0f0;">'url'</span>);
<span style="color: #888888;">// 引入 calc 模組</span>
<span style="color: #008800; font-weight: bold;">const</span> calc <span style="color: #333333;">=</span> require(<span style="background-color: #fff0f0;">'./app/calc'</span>);
<span style="color: #888888;">// 建立一個 HTTP 伺服器</span>
<span style="color: #008800; font-weight: bold;">const</span> server <span style="color: #333333;">=</span> http.createServer((req, res) <span style="color: #333333;">=></span> {
<span style="color: #888888;">// 解析 URL</span>
<span style="color: #008800; font-weight: bold;">const</span> parsedUrl <span style="color: #333333;">=</span> url.parse(req.url, <span style="color: #008800; font-weight: bold;">true</span>);
<span style="color: #888888;">// 處理路由</span>
<span style="color: #008800; font-weight: bold;">if</span> (parsedUrl.pathname <span style="color: #333333;">===</span> <span style="background-color: #fff0f0;">'/sum'</span> <span style="color: #333333;">&&</span> req.method <span style="color: #333333;">===</span> <span style="background-color: #fff0f0;">'GET'</span>) {
<span style="color: #888888;">// 取得 URL 參數</span>
<span style="color: #008800; font-weight: bold;">const</span> { a, b } <span style="color: #333333;">=</span> parsedUrl.query;
<span style="color: #888888;">// 將字串轉為數字</span>
<span style="color: #008800; font-weight: bold;">const</span> numA <span style="color: #333333;">=</span> <span style="color: #007020;">parseInt</span>(a, <span style="color: #0000dd; font-weight: bold;">10</span>);
<span style="color: #008800; font-weight: bold;">const</span> numB <span style="color: #333333;">=</span> <span style="color: #007020;">parseInt</span>(b, <span style="color: #0000dd; font-weight: bold;">10</span>);
<span style="color: #888888;">// 使用 calc 模組計算結果</span>
<span style="color: #008800; font-weight: bold;">const</span> result <span style="color: #333333;">=</span> calc.add(numA, numB);
<span style="color: #888888;">// 回傳結果</span>
res.writeHead(<span style="color: #0000dd; font-weight: bold;">200</span>, { <span style="background-color: #fff0f0;">'Content-Type'</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">'application/json'</span> });
res.end(JSON.stringify({ result }));
} <span style="color: #008800; font-weight: bold;">else</span> {
<span style="color: #888888;">// 其它路由都回傳 Hello World</span>
res.writeHead(<span style="color: #0000dd; font-weight: bold;">200</span>, {<span style="background-color: #fff0f0;">'Content-Type'</span><span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">'text/plain'</span>});
res.end(<span style="background-color: #fff0f0;">'Hello, World!\n'</span>);
}
});
<span style="color: #888888;">// 監聽 3000 port</span>
<span style="color: #008800; font-weight: bold;">const</span> PORT <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">3000</span>;
server.listen(PORT, () <span style="color: #333333;">=></span> {
console.log(<span style="background-color: #ffaaaa; color: red;">`</span>Server running at http<span style="color: #333333;">:</span><span style="color: #888888;">//localhost:${PORT}/`);</span>
});
</pre>
</div>
<p></p>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<td style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMGQpriL4lZKLvTiMs9PAls-bDumQG9qwrHelJbMVk1fLDcInnYslMlWlMzwnV-y9EBVdhccx6c2S0COb84HtdQS1kyU76_8nJw4SW5CnY0EHZrATu8KFGoHFt1f_5-cNLF9yRYxn7Nb68gbUBJue3yu5Eaz06y880b_Z-E5LuTK4gi4XTwdsuCndttK0o/s671/Snipaste_2023-12-07_16-10-17.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="425" data-original-width="671" height="203" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMGQpriL4lZKLvTiMs9PAls-bDumQG9qwrHelJbMVk1fLDcInnYslMlWlMzwnV-y9EBVdhccx6c2S0COb84HtdQS1kyU76_8nJw4SW5CnY0EHZrATu8KFGoHFt1f_5-cNLF9yRYxn7Nb68gbUBJue3yu5Eaz06y880b_Z-E5LuTK4gi4XTwdsuCndttK0o/s320/Snipaste_2023-12-07_16-10-17.png" width="320" /></a>
</td>
</tr>
<tr>
<td class="tr-caption" style="text-align: center;">程式運行結果</td>
</tr>
</tbody>
</table>
<br />
<p></p>
<p> <br /></p>
<h3 style="text-align: left;">建立第一個 Http 服務總結 <br /></h3>
<p>
Node.js 透過幾個步驟就可以完成 Http Server 專案,和 Delphi WebBroker
專案相同,能夠在彈指之間建立專案,並且建立了 "/sum" 路由 (在 Delphi 中被稱為
action)。實際建構後你會發現程式碼全集中在 http.createServer
函式中,當專案需求功能越來越多,此函式會越來越難以維護。
</p>
<p>下一篇文章會介紹 Express 套件如何來幫助我們完成原來的工作。</p>
<p><br /></p>
<h3 style="text-align: left;">使用 Express 套件來升級 Http 服務為 RESTful API 專案</h3>
<p>
在建立 Node.js HTTP 伺服器的過程中,我們通常會面臨隨著專案成長,程式碼集中在
http.createServer 函式中,難以維護的情況。為了更有效地處理路由和中介軟體
(Middleware),我們可以引入 Express 框架。<br /><br />Express
是一個快速、靈活且精簡的 Node.js Web
應用程式框架,它提供了一組強大的功能,讓你可以更輕鬆地組織和延伸你的應用程式。以下是如何使用
Express 來改進你的程式碼:<br /><br />首先,你需要安裝 Express 套件。在
Terminal 中執行以下指令: <br />
</p>
<blockquote>
<p>npm install express <br /></p>
</blockquote>
<p>接著 npm 就會安裝 express 套件,並把它安裝在 node_modules 中。<br /></p>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<td style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG8FqNh_neVlvJIBnkaPqWwTTTeib7YLG97NPdbP3WAMAQ_Kc2fJ70gON_R7a_5okZ2CJWUuj95tQUuAra7ktdla2_Ue5k6JwUv9kjAeO1umD3qFOEkoeb09M7qVL8-W8DxuACJQVlyOG05eSVSo7MUsQlhguFk8kxtm0Sudykf67MPFKKBDE5PMzzRH_K/s958/rpR4yVl.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="576" data-original-width="958" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG8FqNh_neVlvJIBnkaPqWwTTTeib7YLG97NPdbP3WAMAQ_Kc2fJ70gON_R7a_5okZ2CJWUuj95tQUuAra7ktdla2_Ue5k6JwUv9kjAeO1umD3qFOEkoeb09M7qVL8-W8DxuACJQVlyOG05eSVSo7MUsQlhguFk8kxtm0Sudykf67MPFKKBDE5PMzzRH_K/s320/rpR4yVl.jpg" width="320" /></a>
</td>
</tr>
<tr>
<td class="tr-caption" style="text-align: center;">
網路上很著名的 node_modules 迷因圖<br />
</td>
</tr>
</tbody>
</table>
<br /><br />
<p>此時專案資料夾結構應如下圖所示。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHpDXH01t4_yHs80Bo2qXmZ3j6oYCs7NfMvf-W3_w92ydxjQz0vfBB7H35gAQ5UFt4tB9FcBv94VWHYle4bKGmWL8SPrE3Eo0_5JkBY-ilA08s-K78lfJYAeQEFSs0aZufvkMfpM24xBLE79F0T5GxzoN4JAmut9O6k_YNgN0OQEhSC9D60yq0P6Z2xCb_/s180/Snipaste_2023-12-07_17-45-53.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="168" data-original-width="180" height="373" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHpDXH01t4_yHs80Bo2qXmZ3j6oYCs7NfMvf-W3_w92ydxjQz0vfBB7H35gAQ5UFt4tB9FcBv94VWHYle4bKGmWL8SPrE3Eo0_5JkBY-ilA08s-K78lfJYAeQEFSs0aZufvkMfpM24xBLE79F0T5GxzoN4JAmut9O6k_YNgN0OQEhSC9D60yq0P6Z2xCb_/w400-h373/Snipaste_2023-12-07_17-45-53.png" width="400" /></a></div><br /><p><br /><br /> </p><p>接著把 server.js 裡的程式碼以下面的程式碼替代。</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-weight: bold;">const</span> express <span style="color: #333333;">=</span> require(<span style="background-color: #fff0f0;">'express'</span>);
<span style="color: #008800; font-weight: bold;">const</span> app <span style="color: #333333;">=</span> express();
<span style="color: #888888;">// 引入 calc 模組</span>
<span style="color: #008800; font-weight: bold;">const</span> calc <span style="color: #333333;">=</span> require(<span style="background-color: #fff0f0;">'./app/calc'</span>);
<span style="color: #888888;">// 設定 "/sum" 路由</span>
app.get(<span style="background-color: #fff0f0;">'/sum'</span>, (req, res) <span style="color: #333333;">=></span> {
<span style="color: #888888;">// 取得 URL 參數</span>
<span style="color: #008800; font-weight: bold;">const</span> { a, b } <span style="color: #333333;">=</span> req.query;
<span style="color: #888888;">// 將字串轉為數字</span>
<span style="color: #008800; font-weight: bold;">const</span> numA <span style="color: #333333;">=</span> <span style="color: #007020;">parseInt</span>(a, <span style="color: #0000dd; font-weight: bold;">10</span>);
<span style="color: #008800; font-weight: bold;">const</span> numB <span style="color: #333333;">=</span> <span style="color: #007020;">parseInt</span>(b, <span style="color: #0000dd; font-weight: bold;">10</span>);
<span style="color: #888888;">// 使用 calc 模組計算結果</span>
<span style="color: #008800; font-weight: bold;">const</span> result <span style="color: #333333;">=</span> calc.add(numA, numB);
<span style="color: #888888;">// 回傳結果</span>
res.json({ result });
});
<span style="color: #888888;">// 加上 root 路由</span>
app.get(<span style="background-color: #fff0f0;">'/'</span>, (req, res) <span style="color: #333333;">=></span> {
res.end(<span style="background-color: #fff0f0;">'Hello, World!\n'</span>);
});
<span style="color: #888888;">// 啟動伺服器</span>
<span style="color: #008800; font-weight: bold;">const</span> PORT <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">3000</span>;
app.listen(PORT, () <span style="color: #333333;">=></span> {
console.log(<span style="background-color: #ffaaaa; color: red;">`</span>Server running at http<span style="color: #333333;">:</span><span style="color: #888888;">//localhost:${PORT}/`);</span>
});
</pre></div>
<p><br />這段程式碼使用 Express 框架建立一個簡單的 HTTP 伺服器。以下是程式碼的主要部分的解釋:<br /><br /></p><h4 style="text-align: left;">1. 引入 Express 框架:</h4><p style="text-align: left;">這裡引入了 Express 框架並創建一個應用程式實例。 <br /></p>
<p></p><blockquote>const express = require('express');<br />const app = express();</blockquote><br /><h4 style="text-align: left;"><br />2. 引入 calc 模組: </h4><p></p>
<p> 引入了 calc 模組,該模組包含一個 add 函數,用於執行兩數相加的操作。</p><blockquote><p> const calc = require('./app/calc');</p></blockquote><h4 style="text-align: left;"><br />3. 設定 "/sum" 路由:</h4><p>這個路由處理函數處理 GET 請求,接收 /sum 路由中的 URL 參數 a 和 b,然後使用 calc 模組的 add 函數計算結果,最後以 JSON 格式回傳結果。</p><p></p><blockquote>app.get('/sum', (req, res) => {<br /> // 處理 "/sum" 路由的 GET 請求<br /> const { a, b } = req.query; // 從 URL 參數中取得 a 和 b<br /><br /> // 將字串轉為數字<br /> const numA = parseInt(a, 10);<br /> const numB = parseInt(b, 10);<br /><br /> // 使用 calc 模組計算結果<br /> const result = calc.add(numA, numB);<br /><br /> // 回傳結果<br /> res.json({ result });<br />});</blockquote><br /><br /><p></p><h4 style="text-align: left;">4. 設定 "/" 路由:</h4><p>這個路由就是還原根路徑的 GET 請求,回傳 Hello World 文字訊息。<br /></p><p></p><blockquote>app.get('/', (req, res) => {<br /> res.end('Hello, World!\n');<br />});</blockquote><br /><br /><h4 style="text-align: left;">5. 啟動伺服器:</h4><p>啟動伺服器,使其監聽在本地端口 3000 上,並在伺服器啟動時輸出一條訊息到 Terminal 中。</p><p></p><blockquote>const PORT = 3000;<br />app.listen(PORT, () => {<br /> console.log(`Server running at http://localhost:${PORT}/`);<br />});</blockquote><br /><br /><br /><p></p><h3 style="text-align: left;">使用 Express 套件來升級 Http 服務為 RESTful API 專案總結</h3><p>使用 Express 框架的優點在於它提供了一個強大而靈活的 RESTful API 開發環境,我們可以在短時間內完成 Delphi WebBroker 和 DataSnap REST 框架所整合的效果。以下是我個人的總結:<br /><br /> <b>中介軟體的優勢</b>: Express 提供了一個稱為中介軟體(Middleware)的概念,這是一個處理 HTTP 請求和回應的功能強大機制。這使我們能夠在請求到達路由處理之前或之後,執行額外的操作。例如,身份驗證、日誌記錄和錯誤處理等功能都可以方便地透過中介軟體實現。<br /><br /> <b>簡化的路由系統</b>: Express 的路由系統相當簡單而直觀,對於建立 RESTful API 和處理複雜的路由配置都提供了極大的方便。這使得整合各種端點和資源變得輕鬆,並且易於擴展。<br /><br /> <b>簡潔的程式碼風格</b>: Express 的 API 設計簡潔,使得開發者能夠以一種清晰且易讀的方式組織和編寫程式碼。這種風格的程式碼結構使得專案的維護和擴充更加輕鬆。<br /><br /> <b>豐富的社群技術支援</b>: Express 是一個廣泛應用的框架,除了擁有龐大的社群和豐富的官方文件外,Stack Overflow 更有許多大神和無數追隨者的經驗傳承。這保證了開發者可以輕鬆找到解決問題的方法,並能夠分享最佳實戰之路。<br /><br /> <b>快速整合的效果</b>: 使用 Express 能夠讓開發者迅速構建出符合需求的後端服務。這種快速整合的效果特別迎合 Delphi WebBroker 和 DataSnap REST 框架轉換的要求,讓原 Delphi 開發者在業務需求變動時更容易應對。<br /><br />Express 提供了一個優雅的開發環境,對於中介軟體、簡潔的路由系統和整合效果的需求都提供了令人滿意的解決方案。在未來的後端開發中,這種風格的開發方式將有助於保持程式碼的清晰度,提升延伸的可能性,並帶來更高效的開發流程。這種轉變同時也能夠讓開發者更容易維護並有效地應對專案的需求變化。<br /></p><p><br /></p>
<p>和你分享。 <br /></p>
<p><br /></p><h3 style="text-align: left;">See also</h3><p>文首圖片來源:攝影師:Klaus Nielsen: https://www.pexels.com/zh-tw/photo/6287465/<br /></p>
<p> </p>
<p> </p>
<p> <br /></p>
Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-62622043695549380022023-12-07T09:20:00.006+08:002023-12-07T09:20:50.066+08:00Visual Studio Code 延伸模組推薦<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p>
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaVEahPkeCrkObJTxI_dTDccpFHs_RXtnfwC9X-XuWdPi2lVa5Sr1FMuIrc2frgLzb0OGQ8-FQK056DL6C7hZvHSlMi2ZrJhgTzBsvad-dwhYKHOCOkcRVHnFcOIhFjH2LkMe6_4nLyolms90hL28oYHP8oeQh0F-wrJqlFqN5VPZa2zVuIIza9sESjFxy/s1280/pexels-karolina-grabowska-5882581.jpg"
style="margin-left: 1em; margin-right: 1em;"
><img
border="0"
data-original-height="853"
data-original-width="1280"
height="426"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaVEahPkeCrkObJTxI_dTDccpFHs_RXtnfwC9X-XuWdPi2lVa5Sr1FMuIrc2frgLzb0OGQ8-FQK056DL6C7hZvHSlMi2ZrJhgTzBsvad-dwhYKHOCOkcRVHnFcOIhFjH2LkMe6_4nLyolms90hL28oYHP8oeQh0F-wrJqlFqN5VPZa2zVuIIza9sESjFxy/w640-h426/pexels-karolina-grabowska-5882581.jpg"
width="640"
/></a>
</div><br /><br />
<p>Visual Studio Code 是開發 Web 前後端很好用的文字編輯器,搭配上許多好用的延伸模組,可以節省很多輸入程式碼的時間。以下是我目前整理後還在使用的延伸模組:</p>
<br /><br />
<h3 style="text-align: left;">1. Prettier</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode"
target="_new"
>Prettier</a
>
是一個程式碼格式化工具,支援多種語言,確保你的程式碼風格一致,提升可讀性。
</p>
<div class="separator" style="clear: both; text-align: center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFZs3U-7ScgbK6i_yENSrzZRRXUHTE4YQWNhRDdorTUc37F99NrIMQnZyRV-C5dKLqMvisaNzbDHw9yA8TJfi7WtCL1cdZFTmizWIQd9-Zy0kpqy-ujKmN4c3vcpUq2yfvxm0kDv7388qIx_Xbta1ay7RAqh5qE-f-hVANgHVS9y1GZldFKvv3HoZKEZff/s807/Snipaste_2023-12-07_09-07-26.png"
imageanchor="1"
style="margin-left: 1em; margin-right: 1em;"
><img
border="0"
data-original-height="807"
data-original-width="798"
height="320"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFZs3U-7ScgbK6i_yENSrzZRRXUHTE4YQWNhRDdorTUc37F99NrIMQnZyRV-C5dKLqMvisaNzbDHw9yA8TJfi7WtCL1cdZFTmizWIQd9-Zy0kpqy-ujKmN4c3vcpUq2yfvxm0kDv7388qIx_Xbta1ay7RAqh5qE-f-hVANgHVS9y1GZldFKvv3HoZKEZff/s320/Snipaste_2023-12-07_09-07-26.png"
width="316"
/></a>
</div>
<br />
<p></p>
<h3 style="text-align: left;">2. Todo Highlight</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight"
target="_new"
>Todo Highlight</a
>
用於在程式碼中突顯顯示 TODO、FIXME 等註解,幫助你快速定位和處理待辦事項。
</p>
<div class="separator" style="clear: both; text-align: center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYmDuC9i9RoMDG-sJsFAcV0cOYrFhLRF3FLYttQX0TswZ4cN3P3po69XiZ5GEgJ4ZhkSoZQ6YUlsXgvFadwm55lJriJu7R15p51fMM76MrEpnSShuPNi7_4r5E0gieA3v7CCAyXoWQagADUYQXyJxbo3-sYe4Dr13__5THOvgI99KfAW4VwcGnpkkXPlyl/s2784/material-night-eighties.png"
imageanchor="1"
style="margin-left: 1em; margin-right: 1em;"
><img
border="0"
data-original-height="1768"
data-original-width="2784"
height="203"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYmDuC9i9RoMDG-sJsFAcV0cOYrFhLRF3FLYttQX0TswZ4cN3P3po69XiZ5GEgJ4ZhkSoZQ6YUlsXgvFadwm55lJriJu7R15p51fMM76MrEpnSShuPNi7_4r5E0gieA3v7CCAyXoWQagADUYQXyJxbo3-sYe4Dr13__5THOvgI99KfAW4VwcGnpkkXPlyl/s320/material-night-eighties.png"
width="320"
/></a>
</div>
<br />
<p></p>
<h3 style="text-align: left;">
3. Chinese (Traditional) Language Pack for Visual Studio Code
</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-zh-hant"
target="_new"
>Chinese (Traditional) Language Pack</a
>
將 Visual Studio Code 介面繁體中文化,提供更友善的使用體驗。
</p>
<h3 style="text-align: left;">4. Auto Close Tag</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag"
target="_new"
>Auto Close Tag</a
>
在輸入 HTML/XML 標籤時自動閉合標籤,提高撰寫效率,減少錯誤。
</p>
<div class="separator" style="clear: both; text-align: center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAMxrdtD7vQbV4eOYfMGsY2Wr6G_OjZNnsPuSs0IF5bAYVwUvajg9zjC3C723epbFIlRb0uEXEqNe1KCFyB6m3oUta0T7sYEbDowzuuDQYT8faRoGL7jw0ZTbso1wmgA04lpuGWCC__siuT0st9yLHJotfFV7B6FHUguvYXmw8mZSgNpQfw5nQnsU6b68V/s1440/usage.gif"
imageanchor="1"
style="margin-left: 1em; margin-right: 1em;"
><img
border="0"
data-original-height="938"
data-original-width="1440"
height="208"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAMxrdtD7vQbV4eOYfMGsY2Wr6G_OjZNnsPuSs0IF5bAYVwUvajg9zjC3C723epbFIlRb0uEXEqNe1KCFyB6m3oUta0T7sYEbDowzuuDQYT8faRoGL7jw0ZTbso1wmgA04lpuGWCC__siuT0st9yLHJotfFV7B6FHUguvYXmw8mZSgNpQfw5nQnsU6b68V/s320/usage.gif"
width="320"
/></a>
</div>
<br />
<p></p>
<h3 style="text-align: left;">5. Auto Import</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=steoates.autoimport"
target="_new"
>Auto Import</a
>
自動導入所需的模組或類別,減少手動引入的繁瑣步驟。
</p>
<h3 style="text-align: left;">6. Auto Rename Tag</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag"
target="_new"
>Auto Rename Tag</a
>
在修改 HTML/XML 標籤名稱時,自動修改對應的閉合標籤,保持標籤一致性。
</p>
<div class="separator" style="clear: both; text-align: center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg68YRttjXwi5UWWT8mTHFky4mID0Xo15dG6OpGljch1rAwcuU1rlzNwrDe6Wp2S26uzCCIE8IVu4TAhphdX2WjAdu4mvkhl2Jg9qRmqxQdscdoF7hZH3Z2zMoOJkVMyulAxmXBwcZCvItIIbOlmoQ1_35e0Nmv9DemrQxQwzjDyLO3JxL_RuScuvCAqGHR/s1440/usage.gif"
imageanchor="1"
style="margin-left: 1em; margin-right: 1em;"
><img
border="0"
data-original-height="938"
data-original-width="1440"
height="208"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg68YRttjXwi5UWWT8mTHFky4mID0Xo15dG6OpGljch1rAwcuU1rlzNwrDe6Wp2S26uzCCIE8IVu4TAhphdX2WjAdu4mvkhl2Jg9qRmqxQdscdoF7hZH3Z2zMoOJkVMyulAxmXBwcZCvItIIbOlmoQ1_35e0Nmv9DemrQxQwzjDyLO3JxL_RuScuvCAqGHR/s320/usage.gif"
width="320"
/></a>
</div>
<br />
<p></p>
<h3 style="text-align: left;">7. ErrorLens</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens"
target="_new"
>ErrorLens</a
>
透過直白的方式展示程式碼中的錯誤和警告,提高程式碼品質和可讀性。
</p>
<div class="separator" style="clear: both; text-align: center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb8gD-LdQUSdxSWUM54NJUAunfgz7m1UcNNSQhqFkRHWV_Fp2xYlA9nNFLifOX3iiyedoLij9vZPMf_PKyAS69EA149XxSspzSPTTwJ71ZmEAVCQy5shdkZHs1Bcu0vlSFmiOSgF5MAurkKnfs7ZpZpEhqRTPCp8nr-oaNKs4HjURsoTe_qGJxX6mHskBR/s910/demo.png"
imageanchor="1"
style="margin-left: 1em; margin-right: 1em;"
><img
border="0"
data-original-height="105"
data-original-width="910"
height="74"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb8gD-LdQUSdxSWUM54NJUAunfgz7m1UcNNSQhqFkRHWV_Fp2xYlA9nNFLifOX3iiyedoLij9vZPMf_PKyAS69EA149XxSspzSPTTwJ71ZmEAVCQy5shdkZHs1Bcu0vlSFmiOSgF5MAurkKnfs7ZpZpEhqRTPCp8nr-oaNKs4HjURsoTe_qGJxX6mHskBR/w640-h74/demo.png"
width="640"
/></a>
</div>
<br />
<p></p>
<h3 style="text-align: left;">8. ES6 String HTML</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=Tobermory.es6-string-html"
target="_new"
>ES6 String HTML</a
>
提供對 ES6 模板字串中 HTML 的高亮和語法支援。
</p>
<div class="separator" style="clear: both; text-align: center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY2B4J5M4MiwuxN3hzMn9axckp_20slzjOoURtBtCGQk02vpeDVSTxUDeRwkDdWG4J0tANc6bhyphenhyphenyltVflWqRkYq8au2zmnu3XAJ6Yo7OxMMef06k3uNU4odI8iZARD_-0rf2_C9JIqD0uTSaZT8x2jM8Awtuq47RZTqR-k9WFlZ9d47HhxSroeoxdsj1X4/s739/demo.png"
imageanchor="1"
style="margin-left: 1em; margin-right: 1em;"
><img
border="0"
data-original-height="739"
data-original-width="584"
height="320"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY2B4J5M4MiwuxN3hzMn9axckp_20slzjOoURtBtCGQk02vpeDVSTxUDeRwkDdWG4J0tANc6bhyphenhyphenyltVflWqRkYq8au2zmnu3XAJ6Yo7OxMMef06k3uNU4odI8iZARD_-0rf2_C9JIqD0uTSaZT8x2jM8Awtuq47RZTqR-k9WFlZ9d47HhxSroeoxdsj1X4/s320/demo.png"
width="253"
/></a>
</div>
<br />
<p></p>
<h3 style="text-align: left;">9. ES6 String JSX</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=Tobermory.es6-string-jsx"
target="_new"
>ES6 String JSX</a
>
類似於 ES6 String HTML,但專注於 JSX 語法的高亮和支援。
</p>
<div class="separator" style="clear: both; text-align: center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5sGlQAF-PjoSOmbNx7xTjbvsEbkUm3P-Izfdhw5-TmdnByyfTRyRwuGosXYEltwiqvcOEusXb-2z5Okv6vDFaVzn2mVEOYb5ptNtk0vvlJKCfFMK4b32O2BmAKT6NrfIOzo7VWgfjZn8CD9HG0siwAi1IcRnr7rRxei4jwJ6LVVkEO8QEv94aJJ5wwK33/s456/demo.png"
imageanchor="1"
style="margin-left: 1em; margin-right: 1em;"
><img
border="0"
data-original-height="426"
data-original-width="456"
height="299"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5sGlQAF-PjoSOmbNx7xTjbvsEbkUm3P-Izfdhw5-TmdnByyfTRyRwuGosXYEltwiqvcOEusXb-2z5Okv6vDFaVzn2mVEOYb5ptNtk0vvlJKCfFMK4b32O2BmAKT6NrfIOzo7VWgfjZn8CD9HG0siwAi1IcRnr7rRxei4jwJ6LVVkEO8QEv94aJJ5wwK33/s320/demo.png"
width="320"
/></a>
</div>
<br />
<p></p>
<h3 style="text-align: left;">10. Path Intellisense</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense"
target="_new"
>Path Intellisense</a
>
自動提示檔案路徑,減少手動輸入和查找檔案的時間。
</p>
<div class="separator" style="clear: both; text-align: center;">
<a
href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje8LCYAgMdaOuEYJJ5G7GtojfmS3xPfEQDUr46RhdycKSgYrdCAsLxpuJnHv81H3dp6Nsa7CEvZzrv3OeIVEh1kZSOaYiOWfxIoaJPRFvRmWyoz2ZdvEC8e7H4lpjHwQdWjutkPUllei1tRJNDOlhduMOTnX1yxrNoQ318T5TeQKJaw8xFsPn55PzwK3jq/s480/iaHeUiDeTUZuo.gif"
imageanchor="1"
style="margin-left: 1em; margin-right: 1em;"
><img
border="0"
data-original-height="270"
data-original-width="480"
height="180"
src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEje8LCYAgMdaOuEYJJ5G7GtojfmS3xPfEQDUr46RhdycKSgYrdCAsLxpuJnHv81H3dp6Nsa7CEvZzrv3OeIVEh1kZSOaYiOWfxIoaJPRFvRmWyoz2ZdvEC8e7H4lpjHwQdWjutkPUllei1tRJNDOlhduMOTnX1yxrNoQ318T5TeQKJaw8xFsPn55PzwK3jq/s320/iaHeUiDeTUZuo.gif"
width="320"
/></a>
</div>
<br />
<p></p>
<h3 style="text-align: left;">11. Debugger for Firefox</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=firefox-devtools.vscode-firefox-debug"
target="_new"
>Debugger for Firefox</a
>
用於在 Visual Studio Code 中偵錯 Firefox 瀏覽器中的 JavaScript 程式碼。
</p>
<h3 style="text-align: left;">12. ESLint</h3>
<p>
<a
href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint"
target="_new"
>ESLint</a
>
整合 ESLint,用於靜態程式碼分析和檢測 JavaScript/TypeScript
程式碼中的潛在問題。
</p>
<p>希望這些延伸模組能夠提升你在 Visual Studio Code 中的開發體驗!和你分享。</p>
<br /><br />
<h3 style="text-align: left;">See also</h3>
<p>
文首圖片來源:攝影師:Karolina Grabowska:
https://www.pexels.com/zh-tw/photo/usb-5882581/
</p>
Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-56578825501595040602023-12-06T17:28:00.004+08:002023-12-06T20:29:42.935+08:00Node.js 入門<p>
作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓<br /><br /><br /></a>
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibpvHTl6df0YW25Iy8xvsSBdg0yaJCT7Ubz_SVCxGgxlAwJVxuUYlJgE007S7WRiJS1dCnU0fYAmbOiO95nQZDo4uqAhmPseQuOrLeCO4jj6APldUW1eJ1O8yGAgYTIzoLEA5IMtf4VlFgdVogNWiisr3VAqJCalE72c5-4Y7dv__uoIQFXt_CtguE29kp/s1280/pexels-surene-palvie-2062061.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1068" data-original-width="1280" height="534" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibpvHTl6df0YW25Iy8xvsSBdg0yaJCT7Ubz_SVCxGgxlAwJVxuUYlJgE007S7WRiJS1dCnU0fYAmbOiO95nQZDo4uqAhmPseQuOrLeCO4jj6APldUW1eJ1O8yGAgYTIzoLEA5IMtf4VlFgdVogNWiisr3VAqJCalE72c5-4Y7dv__uoIQFXt_CtguE29kp/w640-h534/pexels-surene-palvie-2062061.jpg" width="640" /></a>
</div>
<br />
<p><br /> </p>
<p>
我們的目標是使用 Node.js 建立專屬於自己的 Web 應用程式 (Web
Application)。在這第一個 Node.js 教學中,您將了解 Node
是什麼、如何在電腦上安裝它以及如何開始使用它。因此在接下來的教學中我們可以進行實際開發。讓我們開始吧!
</p>
<h3 style="text-align: left;">Node.js 是什麼 <br /></h3>
<ul style="text-align: left;">
<li>Node.js 是開源、跨平台的 JavaScript 執行環境</li>
<li>
Node.js 的授權方式為 MIT 授權,用於開發伺服器端 (後端) 和網路應用程式 (前端)
</li>
<li>Node.js 是基於 Chrome V8 JavaScript 引擎來執行 JavaScript 程式碼</li>
<li>Node.js 使用事件驅動的非阻塞 I/O 模型,使其輕量且有效率</li>
<li>
Node.js 使用 libuv 函式庫,這是一個專注於非同步 I/O 的多平台支援函式庫
</li>
</ul>
<p><br /></p>
<p>
Node.js 可執行 JavaScript 程式碼,JavaScript 屬於單執行緒程式語言,然而透過
libuv 函式庫讓它具備多執行緒的處理能力。在絕大多數的情況下我們並不會接觸到
libuv 這類底層。<br />
</p>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<td style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1AMdVT_L29zXAMqPkYbl8DMVqxBJnSxshFbPnFsTTfC3iOMLukOyUUONKeXwwI05YWZ0D6SZkcrzCmjVBNAhhO1aq_-sWib6PgYQdLKCyODpPrE0LXfG4r-uX09tiBLYtdvpfTRhHdUHMxS2GqFwUnF1IgcLFqrafLAm6yX2bwfYe5xPxQa_BS2J1BIX3/s1024/banner.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="384" data-original-width="1024" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1AMdVT_L29zXAMqPkYbl8DMVqxBJnSxshFbPnFsTTfC3iOMLukOyUUONKeXwwI05YWZ0D6SZkcrzCmjVBNAhhO1aq_-sWib6PgYQdLKCyODpPrE0LXfG4r-uX09tiBLYtdvpfTRhHdUHMxS2GqFwUnF1IgcLFqrafLAm6yX2bwfYe5xPxQa_BS2J1BIX3/w400-h150/banner.png" width="400" /></a>
</td>
</tr>
<tr>
<td class="tr-caption" style="text-align: center;">libuv 官方 LOGO</td>
</tr>
</tbody>
</table>
<br />
<p><br /><br /><br /></p>
<h4 style="text-align: left;">為什麼要使用 Node.js<br /></h4>
<ul style="text-align: left;">
<li>
Node.js 讓開發人員能夠在前端和後端都使用
JavaScript。每個開發人員都可以了解專案裡的程式碼,並在必要時進行更改
</li>
<li>
Node.js 開發高吞吐量伺服器端應用程式經過許多大公司驗證使用它不會出太多怪手
</li>
<li>
Node.js 採取 MIT
授權,並可以完美運作在各大平台上,因此它可以幫助您節省基礎設施成本
</li>
<li>Node.js 在 StackOverflow 上較容易取得各大高手的解決方案</li>
</ul>
<p><br /></p>
<h3 style="text-align: left;">安裝 Node.js<br /></h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGmHZbFm52AokIdZVgDoDOctJiq7_2cliJcOgscm_5OBk3DylFJ_K9jSqNa2TD0nL_O75KhLq9qYK6c1JaQ4g-IPzFyz1zzdwmNegNINn2Kco3CiuOHtXhLLdry8kYfm0Zi7dH-6eUskh0Ti_KszC0__nOO5tvW8cLbyrTDpc5RNc5lu4Gua2dO6pEBnG0/s987/Snipaste_2023-12-06_16-25-34.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="756" data-original-width="987" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGmHZbFm52AokIdZVgDoDOctJiq7_2cliJcOgscm_5OBk3DylFJ_K9jSqNa2TD0nL_O75KhLq9qYK6c1JaQ4g-IPzFyz1zzdwmNegNINn2Kco3CiuOHtXhLLdry8kYfm0Zi7dH-6eUskh0Ti_KszC0__nOO5tvW8cLbyrTDpc5RNc5lu4Gua2dO6pEBnG0/s320/Snipaste_2023-12-06_16-25-34.png" width="320" /></a>
</div>
<p>Windows: Node.js 官網下載 LTS (Long-term support 長期支援) 版本安裝即可</p>
<p>Linux (本文使用 Lubuntu 環境) 使用下列指令安裝:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"># 安裝 Node.js
sudo apt-get install nodejs
# 安裝 NPM (Node Package Manager,是 Node.js 的套件(package)管理工具)
sudo apt-get install npm
</pre></div>
<br /><br />
<p>安裝後先確認 Node.js 版本:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"># 確認版本
node -v
npm -v
</pre></div><br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3BqBObQq-AYN5Tob4FVholatcppJB9yqLjTGvJnLeoyUyzybmvcGOPzXT6j1DOQPsDf9DD38VkClA4RPAFqzeXiJXurHzXNyBON_sNIDUVZKowUOKvZL7qywLAkComKDaPlSXBv1YBB3P0R-HU86NBIeHMIgdai6wW61paB7sHgqZviTOtulo5QgnfSQf/s212/Snipaste_2023-12-06_16-37-53.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="212" data-original-width="160" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3BqBObQq-AYN5Tob4FVholatcppJB9yqLjTGvJnLeoyUyzybmvcGOPzXT6j1DOQPsDf9DD38VkClA4RPAFqzeXiJXurHzXNyBON_sNIDUVZKowUOKvZL7qywLAkComKDaPlSXBv1YBB3P0R-HU86NBIeHMIgdai6wW61paB7sHgqZviTOtulo5QgnfSQf/w151-h200/Snipaste_2023-12-06_16-37-53.png" width="151" /></a></div><br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg0OWp4BlIRq-YR9hVF_MHG9Qis3r_f3MgiK4q51yQeW_D9DM-slv6e0d6Q_2kZSZnIivjq92PGWOwKHL_Z0XFuxkvEKLeGbbs2jliVg4GbfI-vmEY3XFZq_w5rhfTw_pizMAwi64ftFrsHplf0wT6oZQf2EKFEWo0SsH295bfftaPVcOMmUZu_uhYFd58/s529/Snipaste_2023-12-06_17-14-11.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="228" data-original-width="529" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg0OWp4BlIRq-YR9hVF_MHG9Qis3r_f3MgiK4q51yQeW_D9DM-slv6e0d6Q_2kZSZnIivjq92PGWOwKHL_Z0XFuxkvEKLeGbbs2jliVg4GbfI-vmEY3XFZq_w5rhfTw_pizMAwi64ftFrsHplf0wT6oZQf2EKFEWo0SsH295bfftaPVcOMmUZu_uhYFd58/s320/Snipaste_2023-12-06_17-14-11.png" width="320" /></a></div><br /><br />
<h3 style="text-align: left;">使用 Node.js 建立第一個 Hello World 程式<br /></h3>
<p>在建立專案前,我們可以在命令提示字元 (Terminal) 下體驗 JavaScript 開發,就像在 Browser 下測試 JavaScript 一樣。使用以下命令啟動 Node.js:</p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;">$ node
Welcome to Node.js v<span style="color: #6600ee; font-weight: bold;">12</span>.<span style="color: #6600ee; font-weight: bold;">22</span>.<span style="color: #6600ee; font-weight: bold;">9</span>.
Type <span style="background-color: #fff0f0;">".help"</span> <span style="color: #008800; font-weight: bold;">for</span> more information.
>
</pre></div>
<p>在 > 後面輸入 "console.log('Hello World')",就可以看到我們第一支 Hello World 程式執行的結果了!<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEP49z3tMmQhJfm5rUv5WENk2M-oK58h4ulT1CYRWWV4yekh0LPmtiC8vdGWa6oVn03wM8jwrKFvVDedgq9lSUMxhW-vgHWdEB7sCFGCSk2H5NEh-ODuZWmistyKTMTRo4UdBMq11Ii8kYfT2WpfO8nQQImfgh2LhttxiZBXCuLGp6eoBOpP8-VNd33AUw/s430/Snipaste_2023-12-06_17-22-33.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="136" data-original-width="430" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEP49z3tMmQhJfm5rUv5WENk2M-oK58h4ulT1CYRWWV4yekh0LPmtiC8vdGWa6oVn03wM8jwrKFvVDedgq9lSUMxhW-vgHWdEB7sCFGCSk2H5NEh-ODuZWmistyKTMTRo4UdBMq11Ii8kYfT2WpfO8nQQImfgh2LhttxiZBXCuLGp6eoBOpP8-VNd33AUw/w400-h126/Snipaste_2023-12-06_17-22-33.png" width="400" /></a></div><br /><p>這裡作為 Node.js 執行程式展示,還不會寫入任何檔案。<br /><br /><br /></p><h4 style="text-align: left;">建立 index.js</h4><p>在系統建立一個目錄,並使用任何一款的編輯軟體在該目錄建立 index.js,並把上一步驟的程式碼貼上去,如下圖:</p><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu_G-dzQDKJtQmT_NYpdEiDr7ERch8gDZVovoWI0J3L_KozbZHgCycsdl8JztLvXPypK5_-O-IY0yXBS8mNmNRrxd7B63TcQ2Ek9V0cNcWyTGnuEjRW4VxKfJzleTTdv9R6oEycNySq7foemBQeB9XJ6zn9WY7yoB5R27d3CXkBk3RFklPN6Nt-acmZYih/s1366/screen.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="736" data-original-width="1366" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu_G-dzQDKJtQmT_NYpdEiDr7ERch8gDZVovoWI0J3L_KozbZHgCycsdl8JztLvXPypK5_-O-IY0yXBS8mNmNRrxd7B63TcQ2Ek9V0cNcWyTGnuEjRW4VxKfJzleTTdv9R6oEycNySq7foemBQeB9XJ6zn9WY7yoB5R27d3CXkBk3RFklPN6Nt-acmZYih/s320/screen.jpg" width="320" /></a></div><br /><p>接下來在 Terminal 裡輸入 "node index.js",即可看到執行結果。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ5fLEH5Ac6uP7Up0F4mcLwTMGMQKuTYrvjY8dzv8VIOVSfMj5sNbEIb0S1ruv1IcgxOzL6owD-xiUIJCHLyY8m-PlGM3FH_sKqkTObLmQOiAaQmhCLSd0fJoSjBiGgihIVuuWYdncJD94zdzXTQd9H47Xut30LOR6O5ll2kQPE4QqpZlvv6NgpbIbwsza/s1366/screen.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="736" data-original-width="1366" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ5fLEH5Ac6uP7Up0F4mcLwTMGMQKuTYrvjY8dzv8VIOVSfMj5sNbEIb0S1ruv1IcgxOzL6owD-xiUIJCHLyY8m-PlGM3FH_sKqkTObLmQOiAaQmhCLSd0fJoSjBiGgihIVuuWYdncJD94zdzXTQd9H47Xut30LOR6O5ll2kQPE4QqpZlvv6NgpbIbwsza/s320/screen.jpg" width="320" /></a></div><br /><p><br /></p><p><br /></p><p></p><h3 style="text-align: left;">接下來呢?</h3><p>接下來我們會開始建立我們第一支 Web API 應用程式。敬請期待!</p><p> </p><p>和你分享。 <br /></p><p> </p>
<p> </p>
<h3 style="text-align: left;">See also</h3>
<ul style="text-align: left;">
<li>
<a href="https://blog.risingstack.com/node-hero-tutorial-getting-started-with-node-js/" target="_blank">Node Hero – Getting Started With Node.js Tutorial</a>
</li>
<li>
<a href="https://zh.wikipedia.org/zh-tw/Node.js" target="_blank">Node.js - wiki</a>
</li>
<li>
文章頁首圖片來源:攝影師:Surene Palvie:
https://www.pexels.com/zh-tw/photo/2062061/
</li>
</ul>
<br />Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-16315821448609643882023-12-02T21:20:00.004+08:002023-12-03T10:32:21.391+08:00Ubuntu install Traditional Chinese input Chewing and Cangjie 作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh67BELQ9EPCwAY7yJvCQWwoKPcB_i_WOwYZ4CMRq4GCghyphenhyphen2TxilstGRyIGBkAEXKZ2xiuZrWIrjHcQoKe5fGRYG0iZe9S7Ulpr61MOMreo0RMSPWhOQ-ksw_6CwqiLWodqseaIFbzwwW1wW7WdoB1YsWc9oRYv2jkq0yFnlIq9_a82s-oZn3yeY4fOm40C/s1160/Snipaste_2023-12-02_20-13-43.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="612" data-original-width="1160" height="338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh67BELQ9EPCwAY7yJvCQWwoKPcB_i_WOwYZ4CMRq4GCghyphenhyphen2TxilstGRyIGBkAEXKZ2xiuZrWIrjHcQoKe5fGRYG0iZe9S7Ulpr61MOMreo0RMSPWhOQ-ksw_6CwqiLWodqseaIFbzwwW1wW7WdoB1YsWc9oRYv2jkq0yFnlIq9_a82s-oZn3yeY4fOm40C/w640-h338/Snipaste_2023-12-02_20-13-43.png" width="640" /></a></div><br /><br /> <p></p><p>Ubuntu 安裝 Taiwan 新酷音和倉頡。</p><p>因為網路上安裝步驟很零碎,所以記錄在這裡。<br /><br /><br /><br /></p><p></p><h3 style="text-align: left;">安裝 Fcitx5 新酷音 (注音 chewing)<br /></h3><p>有注音才能夠在 Terminal 進入"下載"資料夾<br /></p><p></p><blockquote># 安裝新酷音注音輸入法<br />sudo apt install fcitx5 fcitx5-chewing fcitx5-chinese-addons</blockquote>重新開機後即會看到鍵盤圖示在桌面右下角出現,右鍵選單會有新酷音。在設定畫面裡可以看到 Fcitx5 也安裝其它的輸入法。如下圖所示。<br /><p></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7J0QOv1qT63dfj1Oe6ZEBN5y_JnEMUa_lWIV6SWW5GoHt4ErCDeGBkDIqajH34xeQ_14levZZcDE_0R9qLMp1E33Njvok0O1krjZ1GN0PLbO3JLqBdcigkocs4rjYCLG4e0-P6dsQsGf-e_sZj7Dz4RDKLBznyclcySSlg-obAYEgSIED3D0isfKTVIQ8/s1160/Snipaste_2023-12-02_20-17-32.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="612" data-original-width="1160" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7J0QOv1qT63dfj1Oe6ZEBN5y_JnEMUa_lWIV6SWW5GoHt4ErCDeGBkDIqajH34xeQ_14levZZcDE_0R9qLMp1E33Njvok0O1krjZ1GN0PLbO3JLqBdcigkocs4rjYCLG4e0-P6dsQsGf-e_sZj7Dz4RDKLBznyclcySSlg-obAYEgSIED3D0isfKTVIQ8/s320/Snipaste_2023-12-02_20-17-32.png" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitYUv35dhj7QsckERPucB9Mc8SQdtgOhRh14GTsqAz3WIjzF4gaDpYH3j4jMJIoAZxmZfpK-hhQ0L1s6GOdtKjawQwM5Ml92sdiYXXDpQT-hQwp-UcCEY33PL0SuBQ_St8VIkVqIn7KvuMpThb7IJTvHJJuEzKr9-qQpcaDk_4xBFJdEziIH1m_7yXsGoo/s1160/Snipaste_2023-12-02_20-22-11.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="612" data-original-width="1160" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitYUv35dhj7QsckERPucB9Mc8SQdtgOhRh14GTsqAz3WIjzF4gaDpYH3j4jMJIoAZxmZfpK-hhQ0L1s6GOdtKjawQwM5Ml92sdiYXXDpQT-hQwp-UcCEY33PL0SuBQ_St8VIkVqIn7KvuMpThb7IJTvHJJuEzKr9-qQpcaDk_4xBFJdEziIH1m_7yXsGoo/s320/Snipaste_2023-12-02_20-22-11.png" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo6CxhqdAE9anrB-InIJb6g870aByZzd8R4mj3au7uOtubs3yoEeTO-mPrcOdKK2GJK11toYfX8_LVvSZikqPB5b0aieEG3AdNgahR17vf7RwPvXXANLdTMpXClgPejXjHXPpEJ5II3qAOUsBhD8AoZ2IdY-50YOeUQx8ZDrCJ1re8ATzfvWxJvzmuxPPh/s1160/Snipaste_2023-12-02_20-23-55.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="612" data-original-width="1160" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo6CxhqdAE9anrB-InIJb6g870aByZzd8R4mj3au7uOtubs3yoEeTO-mPrcOdKK2GJK11toYfX8_LVvSZikqPB5b0aieEG3AdNgahR17vf7RwPvXXANLdTMpXClgPejXjHXPpEJ5II3qAOUsBhD8AoZ2IdY-50YOeUQx8ZDrCJ1re8ATzfvWxJvzmuxPPh/s320/Snipaste_2023-12-02_20-23-55.png" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSKCvN21E-0Ipnxrm9KGNsgEImLqpHrfIZI38HspKWj5AGDL02F7K5b1PSqLlBsVfT6o5WUaqPOedH8LE6L0v1ar95y1hGggbkFVIRTx0pfBgwPo3OWnM_iXRy-evSZpG0FZNA12nQmWdv_zCgybT34gDqj1VrDJ2MM4mbbObDoj_0Nde1xrwCs8Jq_W4U/s801/Snipaste_2023-12-02_20-24-19.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="579" data-original-width="801" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSKCvN21E-0Ipnxrm9KGNsgEImLqpHrfIZI38HspKWj5AGDL02F7K5b1PSqLlBsVfT6o5WUaqPOedH8LE6L0v1ar95y1hGggbkFVIRTx0pfBgwPo3OWnM_iXRy-evSZpG0FZNA12nQmWdv_zCgybT34gDqj1VrDJ2MM4mbbObDoj_0Nde1xrwCs8Jq_W4U/s320/Snipaste_2023-12-02_20-24-19.png" width="320" /></a></div><br /> <p></p><p> </p><h3 style="text-align: left;">安裝 Fcitx5 倉頡、嘸蝦米等 (fcitx5-table-extra)<br /></h3><p>前一步驟安裝好 Fcitx5 後可以在簡體中文(中國)裡看到倉頡,它可以使用沒有問題。若你想使用繁體中文(台灣),我們繼續看下去。</p><p>繁體中文的 Fcitx5 倉頡確實存在,但它是透過 fcitx5-table-extra 套件提供的。但這個套件還在 Debian FTP Masters 審核。這裡就改使用 <a href="https://pkgs.org/download/fcitx5-table-extra">pkgs.org</a> 提供編譯好的檔案。<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifD40wVK7dkfQnONZgCitmPdcmtr29us5L6h2q18I3yoGrqKfhusqYplbVPDb8ag9MtWfRFQL246MSYBxRnbh8JkEsyx-ot7UQnaQf9M7_Q9S8Pbrii8TCx1i0khMx02Na-vcbmP6gQdTUbLuCSW4nWnmyObjpjcftgCYUeUk5pR3TZF2Uf_D4hIp8nUVQ/s1366/Snipaste_2023-12-02_20-59-19.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="643" data-original-width="1366" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifD40wVK7dkfQnONZgCitmPdcmtr29us5L6h2q18I3yoGrqKfhusqYplbVPDb8ag9MtWfRFQL246MSYBxRnbh8JkEsyx-ot7UQnaQf9M7_Q9S8Pbrii8TCx1i0khMx02Na-vcbmP6gQdTUbLuCSW4nWnmyObjpjcftgCYUeUk5pR3TZF2Uf_D4hIp8nUVQ/s320/Snipaste_2023-12-02_20-59-19.png" width="320" /></a></div><p>這裡下載 Arch Linux Extra aarch64 (結稿時的版本為:fcitx5-table-extra-5.1.0-1-any.pkg.tar.xz)。下載後解壓縮,如下圖所示。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDX-hfJwPl5L9M8r8kyk0wWfov3w5DrNmg6rPs9Wb-bduBwz2_zFQEBo6NL5cRa5vP-5zsjfs4ZHcdwNrDrSw5xhpLFJNY4hzaoboU8_oDJ9b8g1btiSDChVJkH1KnmkM6QKfYvkdCx-0Mud0Yj2V5F_5Z6Izyqzn83zyJfRviXDdYW4Y6Tf0vw4WASDhq/s1160/Snipaste_2023-12-02_20-30-43.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="612" data-original-width="1160" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDX-hfJwPl5L9M8r8kyk0wWfov3w5DrNmg6rPs9Wb-bduBwz2_zFQEBo6NL5cRa5vP-5zsjfs4ZHcdwNrDrSw5xhpLFJNY4hzaoboU8_oDJ9b8g1btiSDChVJkH1KnmkM6QKfYvkdCx-0Mud0Yj2V5F_5Z6Izyqzn83zyJfRviXDdYW4Y6Tf0vw4WASDhq/s320/Snipaste_2023-12-02_20-30-43.png" width="320" /></a></div><br /><p>解壓縮後使用 Terminal 將目錄裡的資料複製到 /usr/share 目錄裡。可以使用以下指令:</p><p></p><blockquote><p>sudo cp -r usr/share /usr/<br /># or<br />sudo cp -r usr/share/* /usr/share/</p></blockquote><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF5_OwWD30CPEAk90b3_986QAGbHX220PD-_KPAZFqZxysG0yTubvdgr1LqipQANRB4rki-JW_v_b-B-TBb8kPFsCol8Qg4hwe9mhC8MSCFAv4qH3bjkETbboPzH6Mg7MsH9YL59oKO4rgwc2uI-vF0JibhSPX0FkDTU-RuBPYfXFzh1bUnK4We4Gz2Wus/s799/Snipaste_2023-12-02_20-33-04.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="573" data-original-width="799" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF5_OwWD30CPEAk90b3_986QAGbHX220PD-_KPAZFqZxysG0yTubvdgr1LqipQANRB4rki-JW_v_b-B-TBb8kPFsCol8Qg4hwe9mhC8MSCFAv4qH3bjkETbboPzH6Mg7MsH9YL59oKO4rgwc2uI-vF0JibhSPX0FkDTU-RuBPYfXFzh1bUnK4We4Gz2Wus/s320/Snipaste_2023-12-02_20-33-04.png" width="320" /></a></div>複製完成後,重新開機,接著就可以在 fcitx5 控制台裡看到繁體中文(台灣)區塊中看到增加的輸入法,如倉頡第五代、嘸蝦米等。如下圖所示。<br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_CiInDQqisUvFV5xA1SZn1WbS2zasoScUSszAU49mwJVE1MMGgPRGA68XyddZVjqY5v3yjeRpQ_kjj7LJ7Pn0GJC3MD_5WoGMId8vqEbIrwmq3u7x2wgzlIOAUNCHJD3o0fsD5QAWQBXf_28wDzPCaoDV9ebfRps6bhTPufZzeNFKdg4J0b0X5JqI6CrI/s798/Snipaste_2023-12-02_20-35-49.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="580" data-original-width="798" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_CiInDQqisUvFV5xA1SZn1WbS2zasoScUSszAU49mwJVE1MMGgPRGA68XyddZVjqY5v3yjeRpQ_kjj7LJ7Pn0GJC3MD_5WoGMId8vqEbIrwmq3u7x2wgzlIOAUNCHJD3o0fsD5QAWQBXf_28wDzPCaoDV9ebfRps6bhTPufZzeNFKdg4J0b0X5JqI6CrI/s320/Snipaste_2023-12-02_20-35-49.png" width="320" /></a></div><br /><p><br /></p><p>現在可以享受新增的輸入法囉!<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJWreFJ6EcgC8hNKCqb7zIIJGS2JkK0AmQa6I11uAnXGHIixI-5mFhrbriG9a6x93_7J81AeFt3suX0Ihu18m7rqe1POOA2-W2wgjjtqIwMJdTYJXaEokECwxDI6EqZrPupdpvP6-AAjq5lCq56sNI2oTrXkN48u7T76TSTnbF0EcjnpWLBXxfbq3cb0ji/s698/Snipaste_2023-12-02_21-17-26.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="527" data-original-width="698" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJWreFJ6EcgC8hNKCqb7zIIJGS2JkK0AmQa6I11uAnXGHIixI-5mFhrbriG9a6x93_7J81AeFt3suX0Ihu18m7rqe1POOA2-W2wgjjtqIwMJdTYJXaEokECwxDI6EqZrPupdpvP6-AAjq5lCq56sNI2oTrXkN48u7T76TSTnbF0EcjnpWLBXxfbq3cb0ji/s320/Snipaste_2023-12-02_21-17-26.png" width="320" /></a></div><br /><p><br /></p><p>和你分享。<br /></p><p><br /></p><h3 style="text-align: left;">VMWare Tools install</h3><p></p><blockquote>sudo apt-get update<br />sudo apt-get install open-vm-tools open-vm-tools-desktop</blockquote><p></p><h3 style="text-align: left;">How to share folder between host and VM</h3><p>建立分享目錄,如下圖所示:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihGZMPjUXuWhdMchAZ1mXWGSigm0TY7jXBoGWUA042xhKwe4ofX9ZSOvj3CISGJAFDw_2sIO8qncJEXeRSch9ecsxGqV6PKWIV5bQNzQ4A5FMxxxkX26L7nqMvB8xs0PrUMobhmx6ux964LwsLLSclsLW-zZ_MzgRPzwEgY6QeUiXq4Q5DRfyU8EY2_REm/s759/Snipaste_2023-12-03_09-14-44.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="721" data-original-width="759" height="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihGZMPjUXuWhdMchAZ1mXWGSigm0TY7jXBoGWUA042xhKwe4ofX9ZSOvj3CISGJAFDw_2sIO8qncJEXeRSch9ecsxGqV6PKWIV5bQNzQ4A5FMxxxkX26L7nqMvB8xs0PrUMobhmx6ux964LwsLLSclsLW-zZ_MzgRPzwEgY6QeUiXq4Q5DRfyU8EY2_REm/s320/Snipaste_2023-12-03_09-14-44.png" width="320" /></a></div><p>使用 "vmware-hgfsclient" 指令確認分享目錄是否出現。</p><p>將所有分享目錄掛載指令:</p><p></p><blockquote>sudo vmhgfs-fuse -o allow_other .host:/ /mnt/hgfs </blockquote><p></p><p>只是每次開機都要做這個動作,還在想這個問題要怎麼解決,目前就先建立捷徑在桌面上使用。<br /><br /><br /></p><h3 style="text-align: left;">Ubuntu-sharing Mounting and Auto Mounting<br /></h3><p>網友 @darrenpmeyer <a href="https://gist.github.com/darrenpmeyer/b69242a45197901f17bfe06e78f4dee3" target="_blank">https://gist.github.com/darrenpmeyer/b69242a45197901f17bfe06e78f4dee3</a> 這篇文章寫得太完美,照著他的步驟做就可以完成一切,這裡把關鍵的 Mounting 和 Auto-Mounting 的內容照原文貼上,以免原文搬走後找不到的情況。<br /></p><h4 style="text-align: left;">Mounting</h4><p>To mount the filesystem, run:<br /><br /></p><blockquote>sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other</blockquote><br />The shared folders will now be in subdirectories of /mnt/hgfs<br />Setting up auto-mounting<br /><br /><br /><p></p><h4 style="text-align: left;">Add the following line to /etc/fstab:</h4><blockquote><p>.host:/ /mnt/hgfs fuse.vmhgfs-fuse auto,allow_other 0 0<br /><br /></p></blockquote><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihn1VrnU8Cr3lT7JC22ELvyXMa5kVguv6CIlrGLUrjVU5Pannup212gNO-DvqNUIbbvbloS0948cEtKPQ8rVTzVXIQyrvVambZV6EcJrASJOPXyCYGQ638d2Hw5tQqSfvyMQksOUQ7nGiPsb5jZU4prvyshawFvS5IkM-fyElGI7AQK43YRw-kZbbLJtq7/s1160/Snipaste_2023-12-03_10-26-27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="612" data-original-width="1160" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihn1VrnU8Cr3lT7JC22ELvyXMa5kVguv6CIlrGLUrjVU5Pannup212gNO-DvqNUIbbvbloS0948cEtKPQ8rVTzVXIQyrvVambZV6EcJrASJOPXyCYGQ638d2Hw5tQqSfvyMQksOUQ7nGiPsb5jZU4prvyshawFvS5IkM-fyElGI7AQK43YRw-kZbbLJtq7/w400-h211/Snipaste_2023-12-03_10-26-27.png" width="400" /></a></div><br /><p><br /></p><p><br /></p><h3 style="text-align: left;">See also</h3><ul><li><a href="https://ivonblog.com/posts/ubuntu-fcitx5/" target="_blank">Ubuntu繁體中文輸入法?改用Fcitx5來輸入中文吧!</a></li><li><a href="https://www.reddit.com/r/debian/comments/ucz2qd/fcitx5_any_traditional_chinese_input_users_know/" target="_blank">Fcitx5: Any Traditional Chinese input users know why Cangjie is simplified-only now?</a> </li><li><a href="https://mtmatt.one/boshiamy/using-fcitx-5-with-boshiamy-on-debian-11/" target="_blank">在 Debian 11 上直接用 Fcitx 5 與嘸蝦米 (2023 年 9 月 17 日更新)</a></li><li><a href="https://pkgs.org/download/fcitx5-table-extra" target="_blank">Fcitx5-table-extra Download for Linux (rpm, tgz, txz, xbps, xz, zst)</a> </li><li><a href="https://alexandrerosseto.medium.com/vmware-linux-how-to-share-folder-between-host-and-vm-62e63419ecbb" target="_blank">VMWARE + LINUX: How to share folder between host and VM</a> </li></ul><p> <br /></p>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-35184934793158405482023-12-01T10:23:00.006+08:002023-12-01T10:25:01.286+08:00Lazarus ZeosLib 7.2 轉換 Delphi 專案初體驗<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p>
<p></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYvIXz3H0hKu4TNjeGMan4NWQbqMgW6mkUl3saEu8wJcG1IiF_KFMqS33WBZRFZldjaY14_EJlyCMem_IvzACXugxJP5vKh4aegpfFoHG3uirc8thiXcvPEmew3aceaDhltHnn8R5es9dYgGUSN4n9lrytz4m7KMW_bVD9T-P7umCGo1km9Na_CC7VhGcd/s3638/pexels-harrison-haines-2869565.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2421" data-original-width="3638" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYvIXz3H0hKu4TNjeGMan4NWQbqMgW6mkUl3saEu8wJcG1IiF_KFMqS33WBZRFZldjaY14_EJlyCMem_IvzACXugxJP5vKh4aegpfFoHG3uirc8thiXcvPEmew3aceaDhltHnn8R5es9dYgGUSN4n9lrytz4m7KMW_bVD9T-P7umCGo1km9Na_CC7VhGcd/w640-h426/pexels-harrison-haines-2869565.jpg" width="640" /></a></div><br /><p><br /></p><p>Lazarus 發展到現在也很長的一段時間,雖然進度很慢,但 Lazarus 確實是存活著。作為 Delphi 7 替代品,也許它 -- Lazarus Free Pascal IDE 已經具備足夠的實力。<br /></p><p>很奇怪的是,Lazarus 連結 MSSQL (SQL SERVER) 的資料是又少又零碎,和現在持續使用 Lazarus 的朋友請教後得到其連結法是:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhphumOoeHbTqSTcz19EgK4lVHYGY-Q-A5Bzgyf44dA1vQu4PXxSHoU2MAx-uSYbJqrytzsTsj4T3oGHhOeAXAopuojukSbhD9dNqdcJZFUqdRc3Uj6pzVZtq3frFbNTI3ctnogSCpEXMg4Ilp_gERWeKtlASfj58Jm2d1PuVAOE8FW4UO9q2iarSaDquC5/s721/Snipaste_2023-12-01_09-36-08.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="423" data-original-width="721" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhphumOoeHbTqSTcz19EgK4lVHYGY-Q-A5Bzgyf44dA1vQu4PXxSHoU2MAx-uSYbJqrytzsTsj4T3oGHhOeAXAopuojukSbhD9dNqdcJZFUqdRc3Uj6pzVZtq3frFbNTI3ctnogSCpEXMg4Ilp_gERWeKtlASfj58Jm2d1PuVAOE8FW4UO9q2iarSaDquC5/w400-h235/Snipaste_2023-12-01_09-36-08.png" width="400" /></a></div><ol style="text-align: left;"><li>使用 TMSSQLConnection 和 TSQLConnector 可以連結 MSSQL</li><li>必須搭配 TSQLTransaction 才能將異動資料寫回資料庫</li><li>需要有 DBLib 驅動程式 (32bit, 64bit) 才能連結資料庫</li></ol><p>dbExpress 佈署到客戶端的即視感又回來了,這熟悉的感覺有點不妙。</p><p>記得 KTOP 蕭沖大俠曾經提過與其使用 Delphi 官方資料庫元件,不如直接採用 ZeosLib 這種開源專案會來得高效穩定。有想法,就來實際驗證看看。<br /><br /><br /></p><h3 style="text-align: left;">什麼是 ZeosLib<br /></h3><p></p><blockquote>ZeosLib 是一組資料庫元件,適用於MySQL、MariaDB、PostgreSQL、Interbase、Firebird、MS SQL Server、SAP Adaptive Server Enterprise 和Adaptive Server Anywhere(以前稱為Sybase)、Oracle 和SQLite for Delphi、FreePascal/Lazarus 和C++ Builder 。<br />--翻譯自 <a href="https://sourceforge.net/projects/zeoslib/" target="_blank">ZeosLib 官網</a></blockquote>ZeosLib 也被稱為 ZeosDBO,現在穩定版本為 zeosdbo-7.2.14 版。ZeosLib 7.3 已改名版本為 8.x 版,8 多了 Transcation 元件,而且支援 OleDB 連線方式 (Windows 平台限定),只是目前仍在內部實驗中,建議使用 7.2.14 版本。元件如下表所示。<br /><p></p><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3kNPC66Ncgm35B-Ndv4zJGtkqHL8Yl-tw1rANyoI8QU0gnhP_U2YGcObBUab_vImDZ0uMeMYcxz3taBuW_8oPE8GJf2OCj0Au9seYh9X28fNBNkd_nje1mjBk6Pp89TEBYmSnDwVJ8b8xQAAAnzWInzP4dkhwi0A71JlyJEC_AAqPL7bxerf9RlLsM9Bc/s502/Snipaste_2023-12-01_09-50-25.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="264" data-original-width="502" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3kNPC66Ncgm35B-Ndv4zJGtkqHL8Yl-tw1rANyoI8QU0gnhP_U2YGcObBUab_vImDZ0uMeMYcxz3taBuW_8oPE8GJf2OCj0Au9seYh9X28fNBNkd_nje1mjBk6Pp89TEBYmSnDwVJ8b8xQAAAnzWInzP4dkhwi0A71JlyJEC_AAqPL7bxerf9RlLsM9Bc/w400-h210/Snipaste_2023-12-01_09-50-25.png" width="400" /></a></div><br /><br /><br /><p></p><h3 style="text-align: left;">ZeosLib 連結 MSSQL 方式<br /></h3><p>首先,TZConnection.Protocol 設為 "ado",接著設定 TZConnection.Database 屬性,但設計模式下不會開啟 ConnectionString Builder Dialog (ZeosLib 8 開始加入),所以必須自己研究 ConnectionString 組合方式,<a href="https://www.connectionstrings.com/sql-server/" target="_blank">這個網站</a>有詳細的說明。如下圖所示。<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDvIvqtSwGNqcJjAia0xgWnBxqJkhLoJDC5Yg8MCZLmXu7JHVBWEkwpzh6ob3_Qau1MwfT0DYuXNKiKMt6t0B2yb59SsC222eEGkWKw7yCE4h18Qf2ffMjnZ9srZ8wugHbcKr1Oq9VQpMpMhr1sHlBbQpAwnYmdP8TwhaY68Z1JriVqaRQdW0z6OqmSSeo/s593/Snipaste_2023-12-01_10-00-27.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="593" data-original-width="356" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDvIvqtSwGNqcJjAia0xgWnBxqJkhLoJDC5Yg8MCZLmXu7JHVBWEkwpzh6ob3_Qau1MwfT0DYuXNKiKMt6t0B2yb59SsC222eEGkWKw7yCE4h18Qf2ffMjnZ9srZ8wugHbcKr1Oq9VQpMpMhr1sHlBbQpAwnYmdP8TwhaY68Z1JriVqaRQdW0z6OqmSSeo/w240-h400/Snipaste_2023-12-01_10-00-27.png" width="240" /></a></div><br /><p>其它的操作方式就和 Delphi 7 ADO 元件完全相同,使用 Lazarus 內建的 "Delphi Conversion",並將 ADO Type 指定以 ZeosLib Type 替換,之後就自動完成。<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXu6rZlgtOYr_RpS5Osqts2OTn8csl5ccBvGHwdnLZOV-012LveZ-NN66CEahZ9uwnOJ8hejPRtZXWJAKiWHeJiFDvkQXBxrDhNkOdjhfVWwk3NPJrR0l1TeN6dVm3wVm9c0QAE139_gVwDW31C_TegDg34T9wJ4Zd7HGo_NzNLIjmVddTRyp8QwXpUrUM/s817/Snipaste_2023-12-01_10-07-31.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="447" data-original-width="817" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXu6rZlgtOYr_RpS5Osqts2OTn8csl5ccBvGHwdnLZOV-012LveZ-NN66CEahZ9uwnOJ8hejPRtZXWJAKiWHeJiFDvkQXBxrDhNkOdjhfVWwk3NPJrR0l1TeN6dVm3wVm9c0QAE139_gVwDW31C_TegDg34T9wJ4Zd7HGo_NzNLIjmVddTRyp8QwXpUrUM/w400-h219/Snipaste_2023-12-01_10-07-31.png" width="400" /></a></div><p>拿個小專案來轉換,使用者也沒感覺到太大的問題。<br /><br /><br /></p><h3 style="text-align: left;">總結</h3><p>雖然 Lazarus 的進展緩慢,但它確實存活並發展著。作為 Delphi 7 的替代品,Lazarus 在持續努力中展現出了足夠的實力。<br /><br />在連結 MSSQL 資料庫方面,我理解到使用 TMSSQLConnection 和 TSQLConnector 可以成功連結 MSSQL,同時需要 TSQLTransaction 來確保異動資料能夠順利寫回資料庫。此外,安裝 32bit 和 64bit 的 DBLib 驅動程式是不可或缺的一步。<br /><br />相較於 dbExpress 帶來的客戶端即視感,KTOP 蕭沖大俠的建議是采用 ZeosLib,這也讓我感到好奇。ZeosLib,或稱 ZeosDBO,是一組跨平台、跨開發工具的資料庫元件,支援多種資料庫,包括 MySQL、PostgreSQL、MS SQL Server 等。穩定版本 zeosdbo-7.2.14 已經在開發者中廣泛使用,而 ZeosLib 8.x 版本則帶來了更多新特性,例如 Transcation 元件和支援 OleDB 連線方式(僅限於 Windows 平台)。<br /><br />在實際驗證中,我發現將 TZConnection 的 Protocol 設為 "ado",然後手動設定 TZConnection 的 Database 屬性,可以成功連結 MSSQL。儘管在設計模式下無法使用 ConnectionString Builder Dialog(ZeosLib 8 加入的新功能),但通過研究 ConnectionString 的組合方式,我能夠順利設定連線。<br /><br />最後,透過 Lazarus 內建的 "Delphi Conversion" 工具,將 ADO 元件轉換為 ZeosLib Type,轉換小專案的過程相對順利,使用者幾乎感受不到太大的問題。<br /><br />綜合而言,我見證了 Lazarus 的堅持與發展,還深入研究了 ZeosLib 作為一個強大的資料庫元件的表現。這樣的探索與實作,讓我更深刻地了解了 Lazarus 的價值與潛力。<br /></p><p>和你分享<br /><br /><br /></p><h3 style="text-align: left;">See also</h3><ul style="text-align: left;"><li><a href="https://sourceforge.net/projects/zeoslib/" target="_blank">ZeosLib 官網</a> </li><li><a href="https://www.connectionstrings.com/sql-server/" target="_blank">SQL Server connection strings</a></li><li>文首圖片來源:攝影師:Harrison Haines: https://www.pexels.com/zh-tw/photo/2869565/ </li></ul><p> <br /></p><p><br /></p>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-77258905123821759652023-11-25T07:46:00.007+08:002023-11-25T07:50:55.068+08:00Node.js 學習筆記<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Weum3h1iF4nvLnrWV6ryE6hMw6W0bw4kKAsoSWwSC8LgnOQr1zAjSHEas7hiI-ZfhgrTszx4YwXl96JX3kGuLBW3CdRokhc1E_FNryXPpheGw8ADQRbTESBZdhOaNhJc1FCnfzd0QscAFHb0oUkQwtWWzQGeY8GNJ-FMynROZIHo8dSqv2wU39ltxm5S/s1280/pexels-realtoughcandycom-11035380.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="853" data-original-width="1280" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Weum3h1iF4nvLnrWV6ryE6hMw6W0bw4kKAsoSWwSC8LgnOQr1zAjSHEas7hiI-ZfhgrTszx4YwXl96JX3kGuLBW3CdRokhc1E_FNryXPpheGw8ADQRbTESBZdhOaNhJc1FCnfzd0QscAFHb0oUkQwtWWzQGeY8GNJ-FMynROZIHo8dSqv2wU39ltxm5S/w640-h426/pexels-realtoughcandycom-11035380.jpg" width="640" /></a></div><br /><p></p><h3 style="text-align: left;">Node.js NPM(Node Package Manager Node 套件管理器) 安裝</h3><p>官方網站下載最新版本:<a href="https://nodejs.org" target="_blank">Node.js 官方網站</a> <br /><br /><br /></p><h3 style="text-align: left;">NPM 專案目錄初始化</h3><blockquote><p>npm init</p></blockquote><p>之後會跳出互動式指令設定專案,可按預設值以 ENTER 鍵下一步到結束即可。<br /><br /><br /></p><h3 style="text-align: left;">NPM 套件安裝指令</h3><p></p><blockquote>npm install <package name><br />npm i <pacakge name></blockquote><p></p><p>install 和 i 等效。以安裝 Express 為例,可以執行:</p><p></p><blockquote>npm install express<br />npm i express</blockquote><p></p><p>可以附加 -g 參數將套件全域化,這通常用於指令型套件,如 yarn 套件,這是封裝 npm 指令的套件。<br /><br /><br /></p><p></p><h3 style="text-align: left;">NPM 套件移除指令<br /></h3><blockquote><p>npm uninstall <package name><br /></p></blockquote><p>和 uninstall 等效的指令有:remove, r, un, unlink。以移除 Express 為例,可以執行:<br /></p><p></p><blockquote><p>npm uninstall express</p><p>npm r express</p></blockquote><p><br /><br /></p><h3 style="text-align: left;">NPM 套件更新到最新版指令</h3><blockquote><p>npm update <package name>@latest</p></blockquote><p>update 和 up 等效。以更新 Express 為例,可以執行:</p><blockquote><p>npm update express@latest<br /></p></blockquote><p><br /><br /></p><p>未完,持續更新中<br /></p><p><br /></p><h3 style="text-align: left;">See also</h3><ul style="text-align: left;"><li><a href="https://www.cnblogs.com/WD-NewDemo/p/11141384.html" target="_blank">使用npm init初始化项目</a></li><li><a href="https://ianakaberlin.medium.com/npm-node-%E9%80%8F%E9%81%8E-npm-%E5%AE%89%E8%A3%9D%E5%92%8C%E6%8C%87%E5%AE%9A%E7%89%88%E6%9C%AC-%E6%9B%B4%E6%96%B0%E5%92%8C%E6%8C%87%E5%AE%9A%E7%89%88%E6%9C%AC-%E7%A7%BB%E9%99%A4%E5%A5%97%E4%BB%B6-node-package-manager-node%E5%A5%97%E4%BB%B6%E7%AE%A1%E7%90%86-npm-node-modules-package-json-e99a80387ec7" target="_blank">透過 npm 安裝和指定版本、更新和指定版本、移除套件</a></li><li><a href="https://stackoverflow.com/questions/16525430/npm-check-and-update-package-if-needed" target="_blank">npm check and update package if needed</a></li><li><a href="https://progressbar.tw/posts/291" target="_blank">Node.js 是什麼?NPM又是什麼?為什麼前端與後端都需要用它們呢?</a></li><li><a href="https://docs.npmjs.com/downloading-and-installing-packages-globally" target="_blank">Downloading and installing packages globally</a> </li><li>圖片來源:攝影師:RealToughCandy.com: https://www.pexels.com/zh-tw/photo/11035380/ </li></ul>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-16995274820972635972023-10-06T10:35:00.015+08:002023-10-09T09:24:49.332+08:00[CB][Delphi]解決跨國小數點符號不同的程式處理<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p><br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRxKF545JUWRBsDutPS87aYpYr4CmVrB2pWH3lQZbCVlbQLVoJKiqcJ827GrdwMRFOtgEa9bsEwBW8Xmrju8IUQtRg-kVYRJXS4Z7JCih8zNmPg5ITlNjNi7-xIzJ0_rTp2vTcf3k-pinwLse4ZIUslyGBdGUYoL2PPNOIBrdQFjtR3F4TPDTuwZ-T9_xi/s1920/api-6492491_1920.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1920" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRxKF545JUWRBsDutPS87aYpYr4CmVrB2pWH3lQZbCVlbQLVoJKiqcJ827GrdwMRFOtgEa9bsEwBW8Xmrju8IUQtRg-kVYRJXS4Z7JCih8zNmPg5ITlNjNi7-xIzJ0_rTp2vTcf3k-pinwLse4ZIUslyGBdGUYoL2PPNOIBrdQFjtR3F4TPDTuwZ-T9_xi/w640-h320/api-6492491_1920.jpg" width="640" /></a></div><br /><br /><p>多數歐洲國家的數字浮點數,會使用逗號「,」作為小數點基點。</p><p>這陣子接獲客戶反應他們開發的軟體遇上 "Invalid floating point operation" 的錯誤</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPuFJm9VaSjH3hqp0xZRHx3tx61e0ndAS8lh8tItyW4BYCHzNLWZEb0kWXCT-pfHSUhjnQ_z8s8ckfKnBpZoUgj8CBoFAi4I6nKvlpp3yi7o8l-huHhv7njVEkZXxcPIietGSnWNhrPsG8BmO0fW5KkCtUSaSWA-y-yDys1J7g8DQ280fFREBmulX4eMfg/s807/Snipaste_2023-10-06_09-21-33.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="361" data-original-width="807" height="286" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPuFJm9VaSjH3hqp0xZRHx3tx61e0ndAS8lh8tItyW4BYCHzNLWZEb0kWXCT-pfHSUhjnQ_z8s8ckfKnBpZoUgj8CBoFAi4I6nKvlpp3yi7o8l-huHhv7njVEkZXxcPIietGSnWNhrPsG8BmO0fW5KkCtUSaSWA-y-yDys1J7g8DQ280fFREBmulX4eMfg/w640-h286/Snipaste_2023-10-06_09-21-33.png" width="640" /></a></div><p> 雖然最後並沒有採用程式解法來撫平此問題,只是這解決過程太有趣,一定要和你分享!</p><br /><br /><a name='more'></a><h3 style="text-align: left;">現象和解法</h3><p>現象很簡單,重現很困難,因為在客戶說在他的環境下無法重現此錯誤。</p><p>經過一段時間的了解,才知道應用程式是在越南使用。所以製作越南版 Windows 後就成功重現此問題。而作為曾經的法國殖民地,法國也是以逗號作為基點。</p><p>在這裡我們就進行基點的轉換來處理,以 GetLocaleInfo Win32 API 來查出基點浮號進行轉換,程式碼如下:</p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><table><tbody><tr><td><pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10</pre></td><td><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-style: italic;">// Delphi</span>
<span style="color: navy; font-weight: bold;">function</span> GetLocaleDecimalMark: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">var</span>
pcLCA: <span style="color: navy; font-weight: bold;">array</span>[<span style="color: blue;">0</span>..<span style="color: blue;">18</span>] <span style="color: navy; font-weight: bold;">of</span> <span style="color: navy; font-weight: bold;">Char</span>;
<span style="color: navy; font-weight: bold;">begin</span>
<span style="color: navy; font-weight: bold;">if</span> GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL, pcLCA, <span style="color: blue;">19</span>) <= <span style="color: blue;">0</span> <span style="color: navy; font-weight: bold;">then</span>
pcLCA[<span style="color: blue;">0</span>] := <span style="color: purple;">#0</span>;
Result := <span style="color: navy; font-weight: bold;">string</span>(pcLCA);
<span style="color: navy; font-weight: bold;">end</span>;
</pre></td></tr></tbody></table></div><br /><br /><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><table><tbody><tr><td><pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19</pre></td><td><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-style: italic;">// C++ Builder</span>
<span style="color: #008800; font-style: italic;">// 取得本地端系統的小數點符號</span>
<span style="color: #008800; font-style: italic;">// Function: GetLocaleDecimalMark</span>
<span style="color: #008800; font-style: italic;">// Return: 小數點符號</span>
String <span style="color: navy; font-weight: bold;">__fastcall</span> GetLocaleDecimalMark()
{
<span style="color: navy; font-weight: bold;">char</span> pcLCA[<span style="color: blue;">19</span>]; <span style="color: #008800; font-style: italic;">// 建立一個容納小數點符號的字元陣列</span>
<span style="color: #008800; font-style: italic;">// 呼叫 GetLocaleInfo 函式取得系統預設的小數點符號</span>
<span style="color: #008800; font-style: italic;">// LOCALE_SYSTEM_DEFAULT 表示使用本地端系統的設定</span>
<span style="color: #008800; font-style: italic;">// LOCALE_SDECIMAL 是代表小數點符號的常數</span>
<span style="color: #008800; font-style: italic;">// pcLCA 用來儲存取得的小數點符號</span>
<span style="color: navy; font-weight: bold;">if</span> (GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SDECIMAL, pcLCA, <span style="color: blue;">19</span>) <= <span style="color: blue;">0</span>)
{
pcLCA[<span style="color: blue;">0</span>] = <span style="color: purple;">'\0'</span>; <span style="color: #008800; font-style: italic;">// 若取得失敗,將陣列第一個元素設為空字元</span>
}
<span style="color: navy; font-weight: bold;">return</span> String(pcLCA); <span style="color: #008800; font-style: italic;">// 將字元陣列轉換為 String 並返回</span>
}
</pre></td></tr></tbody></table></div>
<br /><br /><h3 style="text-align: left;">GetLocaleInfo 可以做得更多</h3><p>Win32 API GetLocaleInfo 可以取得多樣化的系統資訊,經過包裝後可以使用以下程式:</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><table><tbody><tr><td><pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12</pre></td><td><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-style: italic;">// Delphi</span>
<span style="color: #008800; font-style: italic;">// ShowMessage(GetLocaleInformation(LOCALE_SDECIMAL));</span>
<span style="color: navy; font-weight: bold;">function</span> GetLocaleInformation(iFlag: <span style="color: navy; font-weight: bold;">Integer</span>): <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">var</span>
pcLCA: <span style="color: navy; font-weight: bold;">array</span>[<span style="color: blue;">0</span>..<span style="color: blue;">18</span>] <span style="color: navy; font-weight: bold;">of</span> <span style="color: navy; font-weight: bold;">Char</span>;
<span style="color: navy; font-weight: bold;">begin</span>
<span style="color: navy; font-weight: bold;">if</span> GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, iFlag, pcLCA, <span style="color: blue;">19</span>) <= <span style="color: blue;">0</span> <span style="color: navy; font-weight: bold;">then</span>
pcLCA[<span style="color: blue;">0</span>] := <span style="color: purple;">#0</span>;
Result := <span style="color: navy; font-weight: bold;">string</span>(pcLCA);
<span style="color: navy; font-weight: bold;">end</span>;
</pre></td></tr></tbody></table></div>
<br /><br />
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><table><tbody><tr><td><pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15</pre></td><td><pre style="line-height: 125%; margin: 0px;"><span style="color: #008800; font-style: italic;">// C++ Builder</span>
<span style="color: teal;">#include <System.SysUtils.hpp></span>
<span style="color: #008800; font-style: italic;">// ShowMessage(GetLocaleInformation(LOCALE_SDECIMAL));</span>
String <span style="color: navy; font-weight: bold;">__fastcall</span> GetLocaleInformation(<span style="color: navy; font-weight: bold;">int</span> iFlag)
{
<span style="color: navy; font-weight: bold;">char</span> pcLCA[<span style="color: blue;">19</span>]; <span style="color: #008800; font-style: italic;">// 建立一個容納結果的字元陣列</span>
<span style="color: navy; font-weight: bold;">if</span> (GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, iFlag, pcLCA, <span style="color: blue;">19</span>) <= <span style="color: blue;">0</span>)
{
pcLCA[<span style="color: blue;">0</span>] = <span style="color: purple;">'\0'</span>; <span style="color: #008800; font-style: italic;">// 若取得失敗,將陣列第一個元素設為空字元</span>
}
<span style="color: navy; font-weight: bold;">return</span> String(pcLCA); <span style="color: #008800; font-style: italic;">// 將字元陣列轉換為 AnsiString 並返回</span>
}
</pre></td></tr></tbody></table></div>
<p>iFlag 在 windows 單元有定義常數,可以依照自己的需求設定。常數列表如下:<br /></p><pre>LOCALE_NOUSEROVERRIDE { 不使用使用者自訂設定 }
LOCALE_USE_CP_ACP { 使用系統ACP }
LOCALE_ILANGUAGE { 語言代碼 }
LOCALE_SLANGUAGE { 本地語言名稱 }
LOCALE_SENGLANGUAGE { 語言的英文名 }
LOCALE_SABBREVLANGNAME { 語言名稱縮寫 }
LOCALE_SNATIVELANGNAME { 本地語言名稱 }
LOCALE_ICOUNTRY { 國家代碼 }
LOCALE_SCOUNTRY { 國家名 }
LOCALE_SENGCOUNTRY { 國家的英文名稱 }
LOCALE_SABBREVCTRYNAME { 國家名縮寫 }
LOCALE_SNATIVECTRYNAME { 國家名 }
LOCALE_IDEFAULTLANGUAGE { 預設語言代碼 }
LOCALE_IDEFAULTCOUNTRY { 預設國家代碼 }
LOCALE_IDEFAULTCODEPAGE { 預設OEM內碼表 }
LOCALE_IDEFAULTANSICODEPAGE { 預設ANSI內碼表 }
LOCALE_IDEFAULTMACCODEPAGE { 預設MAC頁 }
LOCALE_SLIST { 列表項分隔符 }
LOCALE_IMEASURE { 測量單位 0 = 公制, 1 = 英制 }
LOCALE_SDECIMAL { 小數點符號 }
LOCALE_STHOUSAND { 千位分隔符 }
LOCALE_SGROUPING { 數字分組 }
LOCALE_IDIGITS { 小數位數 }
LOCALE_ILZERO { 小數前導零 }
LOCALE_INEGNUMBER { 負數模式 }
LOCALE_SNATIVEDIGITS { 本地ASCII數字 0-9 }
LOCALE_SCURRENCY { 本地貨幣符號 }
LOCALE_SINTLSYMBOL { 國際貨幣符號 }
LOCALE_SMONDECIMALSEP { 貨幣小數點分隔符 }
LOCALE_SMONTHOUSANDSEP { 貨幣千位分隔符 }
LOCALE_SMONGROUPING { 貨幣分組 }
LOCALE_ICURRDIGITS { 本地貨幣位數 }
LOCALE_IINTLCURRDIGITS { 國際貨幣位數 }
LOCALE_ICURRENCY { 正貨幣模式 }
LOCALE_INEGCURR { 負貨幣模式 }
LOCALE_SDATE { 日期分隔符 }
LOCALE_STIME { 時間分隔符 }
LOCALE_SSHORTDATE { 短日期字串 }
LOCALE_SLONGDATE { 長日期字串 }
LOCALE_STIMEFORMAT { 時間格式字串 }
LOCALE_IDATE { 短日期格式順序 }
LOCALE_ILDATE { 長日期格式順序 }
LOCALE_ITIME { 時間格式指示符 }
LOCALE_ITIMEMARKPOSN { 時間標記位置 }
LOCALE_ICENTURY { 世紀格式指示符 (短日期) }
LOCALE_ITLZERO { 時間欄位前導零 }
LOCALE_IDAYLZERO { 日欄位前導零 (短日期) }
LOCALE_IMONLZERO { 月欄位前導零 (短日期) }
LOCALE_S1159 { 上午標誌 }
LOCALE_S2359 { 下午標誌 }
LOCALE_ICALENDARTYPE { 日曆類型指示符 }
LOCALE_IOPTIONALCALENDAR { 附加日曆類型指示符 }
LOCALE_IFIRSTDAYOFWEEK { 一星期的第一天指示符 }
LOCALE_IFIRSTWEEKOFYEAR { 一年的第一周指示符 }
LOCALE_SDAYNAME1 { 星期一的完整名稱 }
LOCALE_SDAYNAME2 { 星期二的完整名稱 }
LOCALE_SDAYNAME3 { 星期三的完整名稱 }
LOCALE_SDAYNAME4 { 星期四的完整名稱 }
LOCALE_SDAYNAME5 { 星期五的完整名稱 }
LOCALE_SDAYNAME6 { 星期六的完整名稱 }
LOCALE_SDAYNAME7 { 星期天的完整名稱 }
LOCALE_SABBREVDAYNAME1 { 星期一的簡稱 }
LOCALE_SABBREVDAYNAME2 { 星期二的簡稱 }
LOCALE_SABBREVDAYNAME3 { 星期三的簡稱 }
LOCALE_SABBREVDAYNAME4 { 星期四的簡稱 }
LOCALE_SABBREVDAYNAME5 { 星期五的簡稱 }
LOCALE_SABBREVDAYNAME6 { 星期六的簡稱 }
LOCALE_SABBREVDAYNAME7 { 星期天的簡稱 }
LOCALE_SMONTHNAME1 { 一月的完整名稱 }
LOCALE_SMONTHNAME2 { 二月的完整名稱 }
LOCALE_SMONTHNAME3 { 三月的完整名稱 }
LOCALE_SMONTHNAME4 { 四月的完整名稱 }
LOCALE_SMONTHNAME5 { 五月的完整名稱 }
LOCALE_SMONTHNAME6 { 六月的完整名稱 }
LOCALE_SMONTHNAME7 { 七月的完整名稱 }
LOCALE_SMONTHNAME8 { 八月的完整名稱 }
LOCALE_SMONTHNAME9 { 九月的完整名稱 }
LOCALE_SMONTHNAME10 { 十月的完整名稱 }
LOCALE_SMONTHNAME11 { 十一月的完整名稱 }
LOCALE_SMONTHNAME12 { 十二月的完整名稱 }
LOCALE_SMONTHNAME13 { 第十三個月的完整名稱 (若存在) }
LOCALE_SABBREVMONTHNAME1 { 一月的簡稱 }
LOCALE_SABBREVMONTHNAME2 { 二月的簡稱 }
LOCALE_SABBREVMONTHNAME3 { 三月的簡稱 }
LOCALE_SABBREVMONTHNAME4 { 四月的簡稱 }
LOCALE_SABBREVMONTHNAME5 { 五月的簡稱 }
LOCALE_SABBREVMONTHNAME6 { 六月的簡稱 }
LOCALE_SABBREVMONTHNAME7 { 七月的簡稱 }
LOCALE_SABBREVMONTHNAME8 { 八月的簡稱 }
LOCALE_SABBREVMONTHNAME9 { 九月的簡稱 }
LOCALE_SABBREVMONTHNAME10 { 十月的簡稱 }
LOCALE_SABBREVMONTHNAME11 { 十一月的簡稱 }
LOCALE_SABBREVMONTHNAME12 { 十二月的簡稱 }
LOCALE_SABBREVMONTHNAME13 { 第十三個月的簡稱 (若存在) }
LOCALE_SPOSITIVESIGN { 正數符號 }
LOCALE_SNEGATIVESIGN { 負數符號 }
LOCALE_IPOSSIGNPOSN { 正數符號位置 }
LOCALE_INEGSIGNPOSN { 負數符號位置 }
LOCALE_IPOSSYMPRECEDES { 貨幣符號在正數前面 }
LOCALE_IPOSSEPBYSPACE { 貨幣符號和正數之間用空格分隔 }
LOCALE_INEGSYMPRECEDES { 貨幣符號在負數前面 }
LOCALE_INEGSEPBYSPACE { 貨幣符號和負數之間用空格分隔 }
LOCALE_FONTSIGNATURE { 字型簽名 }
LOCALE_SISO639LANGNAME { ISO 語言簡稱 }
LOCALE_SISO3166CTRYNAME { ISO 國家簡稱 } </pre><br /><br /><h3 style="text-align: left;">最後客戶採用解法</h3><p>客戶最終採用強制指定符號顯示方式,結束這一回合。</p><br /><br /><h3 style="text-align: left;">結論</h3><p>本案中透過程式技術上確實可以解決問題,只是解決過程曠日費時,而且專案修改上有一定程度上的困難,光是每次的運算處理就必須經過一道檢查,檢查點一多就難保有未改到或是有其它 Bug 產生的可能性。</p><p>在經過人的斡旋後,發現對方能接受調整基點的顯示方式,如此就能輕易解決程式難以處理的場合。誰說技術只限定在程式上?人和人之間的互動也是一門技術上的延伸。經過這次的經歷讓我了解到程式人員除了專研自身程式技術外,和人的互動也是一門必修的程式延伸課程。您說是吧?</p><p>和您分享。 <br /></p><p><br /></p><h3 style="text-align: center;"><a href="https://grandruru.blogspot.com/2020/07/delphi-in-depth-datasnap.html" target="_blank">作者新書在這裡</a></h3>
<br /><br />
<h3>See also</h3><ul style="text-align: left;"><li><a href="https://zh.wikipedia.org/zh-tw/%E5%B0%8F%E6%95%B8%E9%BB%9E" target="_blank">維基百科 - 小數點</a></li></ul><p><br /></p><p><br /></p><span><!--more--></span><span><!--more--></span>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-34566728812200047402023-06-30T11:55:00.006+08:002023-06-30T15:42:41.934+08:00PHP Slim 4 framework 初體驗<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p>
<p></p>
<p></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3qfeW8IJLcx1_kEQdhpFXred7O7H6J2zB5DAqUkhQnTnaVbgd593q-lGvEuMtzBT2RWTj_Nfo88wPYXY6UtDTFPBIJIV_y6baebeVn7CJh1nbBWo4kmKzFej8GbBrdvxAV9u7Qjqj9tWtSjwF23ngTUyekan6h5rsfIZmSBQTUDagCdRpVDB2qQs49N21/s1280/mountain-gffd9fbc93_1280.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3qfeW8IJLcx1_kEQdhpFXred7O7H6J2zB5DAqUkhQnTnaVbgd593q-lGvEuMtzBT2RWTj_Nfo88wPYXY6UtDTFPBIJIV_y6baebeVn7CJh1nbBWo4kmKzFej8GbBrdvxAV9u7Qjqj9tWtSjwF23ngTUyekan6h5rsfIZmSBQTUDagCdRpVDB2qQs49N21/w640-h480/mountain-gffd9fbc93_1280.jpg" width="640" /></a>
</div>
<br />
<p></p>
<p>
Delphi WebBroker 屬於 Web 微服務的一種,自 D7 到現在的 Delphi
社群版都有此框架,挾帶著性能優異的 TDataSet
物件,將微服務提升到商業應用的等級也是分分鐘鐘的事情。
</p>
<p>
還記得那很久以前被遺忘的 RadPHP?讓我聯想到 PHP 是不是也有類似的框架,能夠將
WebBroker 的概念也套用在上頭,同時 PHP 也擁有和 ADO 概念近似的
PDO,或許可以將某些 WebBroker 專案轉到 PHP 上也說不定。
</p>
<p>
截至 2023/06,Slim 已發展到 4 版,看了一下手冊的 Hello
World,感覺相當容易,結果手冊和實際設計還是有點落差,既然都為 HelloWorld Debug
過一輪了,就順手把 Slim 4 Hello World 設定過程寫下來和各位分享。
</p>
<h3 style="text-align: left;">安裝</h3>
<p>XAMPP 安裝和設定就不提了,PHP 版本資訊:</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS0aq1gLGtyH4RpHLXyR1fzDKRvMzE4XfKJtqpXNxoBucmiTs5FiluiPmp93PKh74vB0ix8shilya5agsRzaHbZpIdUrcCWbxbvxJbvUOOlExHqJdzzFzgae-AAe_yBngOLOUH2TlTRR-Rmr7fws64xYa-DRaWFKSEKxbEWflsmMugJ4uScWxjQDFs-BOA/s943/Snipaste_2023-06-30_10-34-52.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="879" data-original-width="943" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS0aq1gLGtyH4RpHLXyR1fzDKRvMzE4XfKJtqpXNxoBucmiTs5FiluiPmp93PKh74vB0ix8shilya5agsRzaHbZpIdUrcCWbxbvxJbvUOOlExHqJdzzFzgae-AAe_yBngOLOUH2TlTRR-Rmr7fws64xYa-DRaWFKSEKxbEWflsmMugJ4uScWxjQDFs-BOA/s320/Snipaste_2023-06-30_10-34-52.png" width="320" /></a>
</div>
<br /><br />
<h4 style="text-align: left;">第一步:安裝 Composer</h4>
<p>
部署 Slim 4 Web Application 需要使用 Composer 進行安裝,所以要先安裝 Composer
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjonLZLm8TxB26HxB-oewmW_28GhXTNA0eRs-WdcELvnF4BxrL-uCbro2RcVnm12BJsnUl6rwdTup0nFS2DFHJb-4KAGjnO3VRSt-Afy6XR7DxoSk_2i40VL-vZQoYewQ9Zb4Eoo1YWj7i9F1KkMoTtTSxNEf5P2IAc3ahQ2xs4LX74D6C_gINU1EJ4ST6u/s640/Snipaste_2023-06-30_11-17-56.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="475" data-original-width="640" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjonLZLm8TxB26HxB-oewmW_28GhXTNA0eRs-WdcELvnF4BxrL-uCbro2RcVnm12BJsnUl6rwdTup0nFS2DFHJb-4KAGjnO3VRSt-Afy6XR7DxoSk_2i40VL-vZQoYewQ9Zb4Eoo1YWj7i9F1KkMoTtTSxNEf5P2IAc3ahQ2xs4LX74D6C_gINU1EJ4ST6u/s320/Snipaste_2023-06-30_11-17-56.png" width="320" /></a>
</div>
<br /><br />
<h4 style="text-align: left;">
第二步:建立網站目錄,並使用 Composer 安裝 Slim 4
</h4>
<p>
建立 Slim Web Application 目錄,如 myapp,並在該目錄路徑下執行指令:
</p>
<!--HTML generated using hilite.me-->
<div style="background: rgb(255, 255, 255); border-color: gray; border-image: none 100% / 1 / 0 stretch; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: medium solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table>
<tbody>
<tr>
<td><pre style="line-height: 125%; margin: 0px;">1</pre></td>
<td>
<pre style="line-height: 125%; margin: 0px;">composer require slim/slim:"4.*"
</pre>
</td>
</tr>
</tbody>
</table>
</div><br /><br />
<h4 style="text-align: left;">
第三步:安裝 PSR-7 Implementation and ServerRequest Creator
</h4>
<p>
PSR-7 套件用來處理 ServerRequest,省下我們處理它的時間,PSR-7 套件有四款:
</p>
<ul style="text-align: left;">
<li>Slim PSR-7</li>
<li>Nyholm PSR-7 and Nyholm PSR-7 Server</li>
<li>Guzzle PSR-7 (Version 1 or 2)<br /></li>
<li>Laminas Diactoros</li>
</ul>
<p>這四款只要挑選一款來安裝即可,這裡我選擇 Slim PSR-7:</p>
<!--HTML generated using hilite.me-->
<div style="background: rgb(255, 255, 255); border-color: gray; border-image: none 100% / 1 / 0 stretch; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: medium solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table>
<tbody>
<tr>
<td><pre style="line-height: 125%; margin: 0px;">1</pre></td>
<td>
<pre style="line-height: 125%; margin: 0px;">composer require slim/psr7
</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p><br /></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhlZOCeg93d4S-qJTGU8yd526wUVKaFVMGOhTIZl5Vv_altmfT13uKmPl4p_U9S40n7fPn5eWZtgB-v9Q8tBQsOxBi0HFiquvhTT6PuRGmsjsaGMDjqMAsgh5bRhYGbkMfIAuBVStBFDyTvW_TDN9xRZbTAtFVrfGElIM9axBLsgQVfnydvjUvwRjgH1at/s835/Snipaste_2023-06-30_11-12-45.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="592" data-original-width="835" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhlZOCeg93d4S-qJTGU8yd526wUVKaFVMGOhTIZl5Vv_altmfT13uKmPl4p_U9S40n7fPn5eWZtgB-v9Q8tBQsOxBi0HFiquvhTT6PuRGmsjsaGMDjqMAsgh5bRhYGbkMfIAuBVStBFDyTvW_TDN9xRZbTAtFVrfGElIM9axBLsgQVfnydvjUvwRjgH1at/s320/Snipaste_2023-06-30_11-12-45.png" width="320" /></a>
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHXt0ePQiOdLpgX09Pa3nLrcJ05-w6LiqYcaaItRqFFgQ_IOzugONWhXpaoX5h_NzwqYd8DuBRkoe6koMOaD4eQ2LompiNArA0Yu5qkNiHT3l4pYvEGIyShVO4KS82fqBwue2UX88kHA1w9mU5I1ObNWVDHcSIEDlQ6mjbC_5RLzkvzuvi2VdQ1Bh341Se/s623/Snipaste_2023-06-30_11-13-12.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="427" data-original-width="623" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHXt0ePQiOdLpgX09Pa3nLrcJ05-w6LiqYcaaItRqFFgQ_IOzugONWhXpaoX5h_NzwqYd8DuBRkoe6koMOaD4eQ2LompiNArA0Yu5qkNiHT3l4pYvEGIyShVO4KS82fqBwue2UX88kHA1w9mU5I1ObNWVDHcSIEDlQ6mjbC_5RLzkvzuvi2VdQ1Bh341Se/s320/Snipaste_2023-06-30_11-13-12.png" width="320" /></a>
</div>
<br /><br />
<h3 style="text-align: left;">Hello World<br /></h3>
<p>按照官方手冊的作法建立 public/index.php 檔案,程式碼:</p>
<!--HTML generated using hilite.me-->
<div style="background: rgb(255, 255, 255); border-color: gray; border-image: none 100% / 1 / 0 stretch; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: medium solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table>
<tbody>
<tr>
<td>
<pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15</pre>
</td>
<td>
<pre style="line-height: 125%; margin: 0px;"><span style="color: teal;"><?php</span>
<span style="color: navy; font-weight: bold;">use</span> Psr\Http\Message\ResponseInterface <span style="color: navy; font-weight: bold;">as</span> Response;
<span style="color: navy; font-weight: bold;">use</span> Psr\Http\Message\ServerRequestInterface <span style="color: navy; font-weight: bold;">as</span> Request;
<span style="color: navy; font-weight: bold;">use</span> Slim\Factory\AppFactory;
<span style="color: navy; font-weight: bold;">require</span> __DIR__ . <span style="color: blue;">'/../vendor/autoload.php'</span>;
$app = AppFactory::<span style="color: red;">create</span>();
$app-><span style="color: red;">get</span>(<span style="color: blue;">'/'</span>, <span style="color: navy; font-weight: bold;">function</span> (Request $request, Response $response, $args) {
$response-><span style="color: red;">getBody</span>()-><span style="color: red;">write</span>(<span style="color: blue;">"Hello world!"</span>);
<span style="color: navy; font-weight: bold;">return</span> $response;
});
$app-><span style="color: red;">run</span>();
</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>然後就出錯了:<br /></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCOTZE_18seOUgrgl2aquLlCQknSJfVrb3aGFWfh8-ReObyp5Hq85XTvGm9QV489QaWRkNz3WBxvKit9k4aWTqE-FpQjfXWNM7ERuJQuSiZFmNl_z4lh6T8WSFiGPTDglzElvOxjonMVHckImsL-D_4mNVvkUTzlLg1iUDbDly16rqnxiqvwV-nkgKMSEJ/s1050/Snipaste_2023-06-30_11-24-29.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="196" data-original-width="1050" height="60" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCOTZE_18seOUgrgl2aquLlCQknSJfVrb3aGFWfh8-ReObyp5Hq85XTvGm9QV489QaWRkNz3WBxvKit9k4aWTqE-FpQjfXWNM7ERuJQuSiZFmNl_z4lh6T8WSFiGPTDglzElvOxjonMVHckImsL-D_4mNVvkUTzlLg1iUDbDly16rqnxiqvwV-nkgKMSEJ/s320/Snipaste_2023-06-30_11-24-29.png" width="320" /></a>
</div>
<p>官方手冊上就到這邊,也不知道為何會錯。詢問 ChatGPT 後,它是這樣解釋的:</p>
<p></p>
<blockquote>
這個錯誤信息表明你的Slim應用程序在處理一個HTTP請求時未能找到匹配的路由,因此拋出了一個HttpNotFoundException。這通常意味著URL路徑不匹配你在應用程序中定義的任何路由
</blockquote>
<p></p>
<p>
stackoverflow
則有高手指出使用「<a href="https://stackoverflow.com/questions/67743604/slim-4-throws-slim-exception-httpnotfoundexception" target="_blank"><b>setBasePath</b></a>」就能夠排除此問題,調整之後程式如下:
</p>
<!--HTML generated using hilite.me-->
<div style="background: rgb(255, 255, 255); border-color: gray; border-image: none 100% / 1 / 0 stretch; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: medium solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table>
<tbody>
<tr>
<td>
<pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17</pre>
</td>
<td>
<pre style="line-height: 125%; margin: 0px;"><span style="color: teal;"><?php</span>
<span style="color: navy; font-weight: bold;">use</span> Psr\Http\Message\ResponseInterface <span style="color: navy; font-weight: bold;">as</span> Response;
<span style="color: navy; font-weight: bold;">use</span> Psr\Http\Message\ServerRequestInterface <span style="color: navy; font-weight: bold;">as</span> Request;
<span style="color: navy; font-weight: bold;">use</span> Slim\Factory\AppFactory;
<span style="color: navy; font-weight: bold;">require</span> __DIR__ . <span style="color: blue;">'/../vendor/autoload.php'</span>;
$app = AppFactory::<span style="color: red;">create</span>();
<b>$app-><span style="color: red;">setBasePath</span>(<span style="color: blue;">"/myapp/public"</span>);</b>
$app-><span style="color: red;">get</span>(<span style="color: blue;">'/'</span>, <span style="color: navy; font-weight: bold;">function</span> (Request $request, Response $response, $args) {
$response-><span style="color: red;">getBody</span>()-><span style="color: red;">write</span>(<span style="color: blue;">"Hello, World!"</span>);
<span style="color: navy; font-weight: bold;">return</span> $response;
});
$app-><span style="color: red;">run</span>();
</pre>
</td>
</tr>
</tbody>
</table>
</div>
<p><br /></p>
<p>
透過 BasePath 和路由設定,這裡要注意不要將 index.php 寫上,如此我們就可以使用
URL:<b>http://127.0.0.1/myapp/public/</b> 進行連結:<br />
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLm1vr_EU376ND91hABONGMFIs0TuBEy-_9a_3qWeYJjJgQTYcMBmG4gje2tV5v7N2ruUdHaGY3fpD2jGTxOhAvwEHg3SVE1zZvcffbmjtcBoaUt3ITnB2IwzXQGeTeG23MtwomzuygH5kWFJtQVZw7BCjKCIYz8OyDk3QiloPP4N8ARwLHbVMajidxvxZ/s377/Snipaste_2023-06-30_11-41-14.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="93" data-original-width="377" height="79" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLm1vr_EU376ND91hABONGMFIs0TuBEy-_9a_3qWeYJjJgQTYcMBmG4gje2tV5v7N2ruUdHaGY3fpD2jGTxOhAvwEHg3SVE1zZvcffbmjtcBoaUt3ITnB2IwzXQGeTeG23MtwomzuygH5kWFJtQVZw7BCjKCIYz8OyDk3QiloPP4N8ARwLHbVMajidxvxZ/s320/Snipaste_2023-06-30_11-41-14.png" width="320" /></a>
</div><br /><br />
<h3 style="text-align: left;">總結</h3>
<p>
Slim 官方推薦的樣板 (Slim skeleton) 在 Slim 4 下已經無法使用,要使用 Slim 4
還是從官方手冊著手會比較容易。
</p>
<p>
而且 Slim 4 的起手式已經比 Slim 3 以前還要來得簡單,作為 Web 微服務非常合適。
</p>
<p>和你分享。<br /></p>
<p><br /></p><p><br /></p><p></p><h3 style="text-align: center;"><a href="https://grandruru.blogspot.com/2020/07/delphi-in-depth-datasnap.html" target="_blank">作者新書在這裡</a><br /></h3><p><br /></p>
<p></p>
Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-55844201824171720712023-06-01T15:39:00.002+08:002023-06-01T15:39:09.597+08:00官方 DataSnap 教案集錦<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p><p></p><p><img alt="" src="data:image/png;base64,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" /></p><p> </p><p>Paweł Głowacki 錄製一系列關於 DataSnap 的教授課程,有興趣的朋友可以自以下連結進行閱讀:</p><p>Unleash the power of Delphi: DataSnap<br /><a href="https://www.embarcadero.com/rad-in-action/delphi-labs">https://www.embarcadero.com/rad-in-action/delphi-labs</a></p><p><br /></p><p><br /></p>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-25022423305745800742023-05-25T11:20:00.010+08:002023-05-26T11:22:32.757+08:00讓 Delphi 11 產出的執行檔相容 Windows XP<p>作者:<a href="https://grandruru.blogspot.com" target="_blank">吳祐賓</a></p><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl5fpPrjA1Z-KcpX4Qkyuu51HVA5i7nbEy9UTFTfLpu19UqUYfgs6iJ7F15Te9K4hFwa5igYGp-oYHIZRw4Mj-v2ot3YB0l_T0u6No3DNW-P3Fm7jUcSFFwTTg3v4ZI8hMw3QlyqLMaN6gtoWl4h76pzd7nJVlvZR4rPX6qIZYxPU_cj-_xc693JyozA/s960/photo-1648737966661-22e0c69d5aa5.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="640" data-original-width="960" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl5fpPrjA1Z-KcpX4Qkyuu51HVA5i7nbEy9UTFTfLpu19UqUYfgs6iJ7F15Te9K4hFwa5igYGp-oYHIZRw4Mj-v2ot3YB0l_T0u6No3DNW-P3Fm7jUcSFFwTTg3v4ZI8hMw3QlyqLMaN6gtoWl4h76pzd7nJVlvZR4rPX6qIZYxPU_cj-_xc693JyozA/w640-h426/photo-1648737966661-22e0c69d5aa5.jpg" width="640" /></a></div><br /><p></p><p> <br /></p><p>Delphi XE 下熬了很久,就在 2023 年正式升級 Delphi 11 後,才由原本「修理 IDE 的快樂」轉變為「升級後的快樂」,然而這快樂沒有多久,很快的使用者就傳來災情:</p><p></p><p style="text-align: center;"><span style="font-size: large;">無法執行</span></p><p>依稀記得幾年前的 Delphi 研討會有提到新版 Delphi 產出的執行檔無法在 Windows XP 下執行,想不到在 2023 年的今天,仍然會遇到必須要使用 Windows XP 的場合,2001年10月的產物。</p><p>難怪每次購買新版 Delphi 時都能下載過往舊版本,是時候再把 Delphi XE 拿出來把玩了! </p><p>你也是這樣想嗎?太天真了。Delphi 11 已經貼心的在編譯器設定裡加入了【PE Header】選項!<span></span></p><a name='more'></a><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcAY0OyVEr4iaJ-ZJQgzlExhf2lXYBXTVV0p5QLncoeD-dC3MRPomoXqoUoj26oIs6InKiBEL9MO951J5iUrRRFA9BGvl7YvUo8AoIIoqUCSEH7J2NzgH17fg-jg0HWzrlp7xQH5QVLRUsS9zAKeB2ZW4zEjmjbyWAAfqaRlVo9WWffJ--_wZTnQF_Lw/s769/Snipaste_2023-05-25_09-39-09.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="565" data-original-width="769" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcAY0OyVEr4iaJ-ZJQgzlExhf2lXYBXTVV0p5QLncoeD-dC3MRPomoXqoUoj26oIs6InKiBEL9MO951J5iUrRRFA9BGvl7YvUo8AoIIoqUCSEH7J2NzgH17fg-jg0HWzrlp7xQH5QVLRUsS9zAKeB2ZW4zEjmjbyWAAfqaRlVo9WWffJ--_wZTnQF_Lw/s320/Snipaste_2023-05-25_09-39-09.png" width="320" /></a></div><p></p><p><br /></p><h3 style="text-align: left;">PE Header 是什麼,為什麼要設定?<br /></h3><p>PE 為 Portable Executable 可攜式執行檔的縮寫,目的是告訴 Windows 此執行檔最小可執行的系統版本,讓系統在運行你的程式前,檢查作業系統版本是否符合要求。</p><p>設定 PE Header 的目的是在每個系統版本都有自己的 API,若使用到新系統才有的 API,那在舊系統下就會出現無法預期的錯誤,避免發生無法預期的異常,限定最小可執行系統是有需要的。</p><p><br /></p><h3 style="text-align: left;">OS Version 的對應是?</h3><p>將維基百科的資料整理後得到如下表格:</p><table style="border: 1px solid black; width: 50%;">
<tbody><tr>
<th style="border: 1px solid black;">名稱</th>
<th style="border: 1px solid black;">發行版本</th>
</tr>
<tr>
<td style="border: 1px solid black;">Windows 11</td>
<td style="border: 1px solid black;">NT 10.0</td>
</tr>
<tr>
<td style="border: 1px solid black;">Windows 10</td>
<td style="border: 1px solid black;">NT 10.0</td>
</tr>
<tr>
<td style="border: 1px solid black;">Windows 8.1</td>
<td style="border: 1px solid black;">NT 6.3</td>
</tr>
<tr>
<td style="border: 1px solid black;">Windows 8</td>
<td style="border: 1px solid black;">NT 6.2</td>
</tr>
<tr>
<td style="border: 1px solid black;">Windows 7</td>
<td style="border: 1px solid black;">NT 6.1</td>
</tr>
<tr>
<td style="border: 1px solid black;">Windows Vista</td>
<td style="border: 1px solid black;">NT 6.0</td>
</tr>
<tr>
<td style="border: 1px solid black;">Windows XP 專業版 x64</td>
<td style="border: 1px solid black;">NT 5.2</td>
</tr>
<tr>
<td style="border: 1px solid black;">Windows XP</td>
<td style="border: 1px solid black;">NT 5.1</td>
</tr>
<tr>
<td style="border: 1px solid black;">Windows ME</td>
<td style="border: 1px solid black;">NT 4.9</td>
</tr>
<tr>
<td style="border: 1px solid black;">Windows 2000</td>
<td style="border: 1px solid black;">NT 5.0</td>
</tr>
</tbody></table>
<p>由上表可知,Delphi 11 編譯器預設相容最小系統是 Windows Vista。<br /></p><p><br /></p><h3 style="text-align: left;">如何設定相容 Windows XP<br /></h3><p><b>Project > Options > Building > Linking</b> 底下兩個項目:</p><ul><li>Set OS version fields in PE header as <major>.<minor></li><li>Set subsystem version fields in PE header as <major>.<minor></li></ul><p>設定為發行版本的系統,以 Windows XP 為例就是 5.1。</p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5gtBSXNn0S_AHPRz0IwhNGwrkbt4CRvvOTHrtdG25F6zZvcMmheIkewy0GunlsXlTw5TM8eEnX46mczfTNGApN53wKKPyfQY5CW3c0Fm468MB1SqosleJDUZWgVm0fpya5dvYbJ1ziZWqb5zGW-ceupEOZIZ-tiZSJbQIetAmykx7TOb1FXHAMbKt1w/s814/Snipaste_2023-05-25_10-44-05.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="568" data-original-width="814" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5gtBSXNn0S_AHPRz0IwhNGwrkbt4CRvvOTHrtdG25F6zZvcMmheIkewy0GunlsXlTw5TM8eEnX46mczfTNGApN53wKKPyfQY5CW3c0Fm468MB1SqosleJDUZWgVm0fpya5dvYbJ1ziZWqb5zGW-ceupEOZIZ-tiZSJbQIetAmykx7TOb1FXHAMbKt1w/s320/Snipaste_2023-05-25_10-44-05.png" width="320" /></a></div></div><p>當然,你也可以使用編譯指令「{$SETPEOSVERSION 5.1}」,並且放在 .dpr 檔案的開頭,就在 program 關鍵字之後,但在 uses 區段之前。例如:</p><!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none 100% / 1 / 0 stretch; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: medium solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><table><tbody><tr><td><pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16</pre></td><td><pre style="line-height: 125%; margin: 0px;"><span style="color: navy; font-weight: bold;">program</span> Project1;
<span style="color: #008800; font-style: italic;">{$SETPEOSVERSION 5.1}</span>
<span style="color: navy; font-weight: bold;">uses</span>
Vcl.Forms,
Unit1 <span style="color: navy; font-weight: bold;">in</span> <span style="color: blue;">'Unit1.pas'</span> <span style="color: #008800; font-style: italic;">{Form1}</span>;
<span style="color: #008800; font-style: italic;">{$R *.res}</span>
<span style="color: navy; font-weight: bold;">begin</span>
Application.Initialize;
Application.MainFormOnTaskbar := <span style="color: navy; font-weight: bold;">True</span>;
Application.CreateForm(TForm1, Form1);
Application.Run;
<span style="color: navy; font-weight: bold;">end</span>.
</pre></td></tr></tbody></table></div>
<p> </p><p> 設定後就可以在 Windows XP 下順利運行。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxdRoqepXpoc0DkIhkHJEk0w_yBiP-SlenOuwyGDnSr5VqrGMT8j6pTFc-nV4laxPYc8gLzCjvrKD47BWMWdZPEHe5ToA065TZTdWSo6g7eu43D3tsvaF9J67QL46p7-_F9DdZPDkKlMr33ISI1T-yuQ4_do15JLnwTG02TmdYvIdh6nt-srucd0xquw/s742/Snipaste_2023-05-25_10-40-42.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="742" data-original-width="635" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxdRoqepXpoc0DkIhkHJEk0w_yBiP-SlenOuwyGDnSr5VqrGMT8j6pTFc-nV4laxPYc8gLzCjvrKD47BWMWdZPEHe5ToA065TZTdWSo6g7eu43D3tsvaF9J67QL46p7-_F9DdZPDkKlMr33ISI1T-yuQ4_do15JLnwTG02TmdYvIdh6nt-srucd0xquw/s320/Snipaste_2023-05-25_10-40-42.png" width="274" /></a></div><br /><h3 style="text-align: left;">結論</h3><p>透過精確的 PE Header 設定,我們成功讓 Delphi 11 的執行檔在 Windows XP 上順利執行。這項解決方案再次證明 Delphi 11 能夠有效提升開發效率。讓我們將重點放在解決問題上,提供確切的步驟和指引,讓讀者能夠迅速實現目標。<br /><br />在開發軟體時,我們經常面臨不同的系統環境和需求。透過了解並應用 PE Header 的概念,我們可以確保我們的程式在特定的操作系統上順利執行。這種實用性的思維和目的導向的方法,使我們能夠有效地解決問題,並為使用者提供優質的使用體驗。<br /><br />謹記,在軟體開發的旅程中,不斷學習和適應新技術是至關重要的。同時,我們也應該牢記舊有系統的需求,並提供相容性解決方案,以確保我們的軟體在廣泛的環境中得以運行。<br /><br />最後,如果你想深入了解更多關於軟體開發的知識和技巧,邀請你關注作者的最新書籍更新。這將是一個超棒的機會,繼續提升你的開發技能,並受益於此書的專業知識和經驗。<br /><br />讓我們繼續以實用性和效率為導向,不斷進步並創造出更好的軟體體驗!</p><p><br /></p><p><br /></p><h3 style="text-align: center;"><a href="https://grandruru.blogspot.com/2023/04/delphi-in-depth-datasnap-2023.html" target="_blank">作者出的書又有更新了,快來看看!</a><br /></h3><p><br /></p><p><br /></p>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-88761222597897051542023-04-20T09:55:00.015+08:002023-04-20T10:15:11.865+08:00 【Delphi in Depth DataSnap 網站應用程式全端開發】 2023 年更新<br /><br />
<p>
作者:<a href="https://grandruru.blogspot.com/2016/02/about-me.html">吳祐賓</a>
</p>
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo4dysvaO_WTA3-lCvqtuVvuLl1NS2YpQsYYruGQZd1Q8lrKKt5GiX3J94KijE4ekXm233bUCp-rAwSHoOl8OenTOpRf1Ta4XfTLGD5nx0VBAcTIaNj0YOQgeczvPhoaOQK-JGdXPy3wTUP4xWwli8TPcDO6Rv5r7Y0kh-FL_QyJpSdawrtUK1WkN0bQ/s2048/cover.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2048" data-original-width="1447" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo4dysvaO_WTA3-lCvqtuVvuLl1NS2YpQsYYruGQZd1Q8lrKKt5GiX3J94KijE4ekXm233bUCp-rAwSHoOl8OenTOpRf1Ta4XfTLGD5nx0VBAcTIaNj0YOQgeczvPhoaOQK-JGdXPy3wTUP4xWwli8TPcDO6Rv5r7Y0kh-FL_QyJpSdawrtUK1WkN0bQ/w452-h640/cover.jpg" width="452" /></a>
</div>
<br />
<h4 style="text-align: left;">
【DELPHI IN DEPTH DATASNAP 網站應用程式全端開發】2023 年更新:給予你一個豐富的
Web 開發武器庫!
</h4>
<p style="text-align: left;">
電子書的魅力在於它可以持續更新和維護。為了回饋支持者們,我在 2023
年進行了最後一次補充內容。未來的新增內容將以 DLC
的方式推出新書。讀完本書後,你將具備進入 Web
開發戰場的能力,其中很多內容都是改編自我的現行專案,期待你的發揮!
</p>
<p style="text-align: left;">
這本書能幫助讀者解決在 Web 開發過程中遇到的各種問題和痛點,包括如何有效地使用
Delphi 和 DataSnap 進行網站應用程式的全端開發,以及如何掌握 Sencha ExtJS
等流行前端框架,讓你的開發技能更上一層樓。</p>
<br />
<h4 style="text-align: left;">
【DELPHI IN DEPTH DATASNAP 網站應用程式全端開發】2023 年更新主要包括以下幾點:
</h4>
<br />
<ol style="text-align: left;">
<li>修正部分 Bug 和優化文句</li>
<li>新增 Sencha ExtJS 實作教學章節</li>
<li>提供 Sencha ExtJS 專案附件檔案</li>
</ol>
<p>感謝早期支持本書的讀者們!為配合後續英文版上線,我做了以下調整:</p>
<ol style="text-align: left;">
<li>
中文版維護期限將持續至 2023/12/31,到期後將不再更新(價格也將保持不變)。
</li>
<li>
Google Play 販售地區將由全球調整為「臺灣」和「香港」(Pubu 則無調整)。
</li>
<li>此次更新後的售價將調整為新台幣 729 元。</li>
</ol>
<p>把握機會,為自己的 Web 開發能力加分!立即擁有【DELPHI IN DEPTH DATASNAP
網站應用程式全端開發】2023 年更新版,讓你的技能更上一層樓!</p>
<br />
<h3 style="text-align: center;"> <a href="https://grandruru.blogspot.com/2020/07/delphi-in-depth-datasnap.html">點這裡看書本詳細介紹</a>
</h3>
<br /><br />Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-28080153617804244652023-03-20T08:00:00.002+08:002023-03-20T09:28:13.237+08:00學習使用轉接器模式 (Adapter Pattern) 處理 API 介面不符的情況 - 使用 Delphi<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNF7Xmh4d7iU1FLzfMWX9WxhiQ2rjsWJ9ZEtilNVY9qC5a9NVq1Cqe4UjKlc5h6FPztZMYyUkhXexqz-_uDUWyyRftVMopx50u2iZaoCIzgcxvkyL3Le7ylQieQzcIP58dxv1-sJUJ5GOvJqlr3LyjdrbNvUrz6K2LEg2utbQZrgoQEYKZIKF7alts7g/s640/hose-515755_640.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="427" data-original-width="640" height="428" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNF7Xmh4d7iU1FLzfMWX9WxhiQ2rjsWJ9ZEtilNVY9qC5a9NVq1Cqe4UjKlc5h6FPztZMYyUkhXexqz-_uDUWyyRftVMopx50u2iZaoCIzgcxvkyL3Le7ylQieQzcIP58dxv1-sJUJ5GOvJqlr3LyjdrbNvUrz6K2LEg2utbQZrgoQEYKZIKF7alts7g/w640-h428/hose-515755_640.jpg" width="640" /></a></div><br /><nav id="toc_in_page"></nav>
<h3 style="text-align: left;">轉接器模式 (Adapter Pattern) 適合的場景<br /></h3><p>近年來,隨著跨平台開發的需求增加,我們必須考慮如何在不同的環境下呈現出一致的介面,而 轉接器模式 (Adapter Pattern) 正是解決這個問題的好方法。</p><p>Adapter 模式是設計模式中常用的一種模式,它能夠讓原本不相容的兩個類別能夠一起工作,是將一個類別的介面轉換成客戶希望的另一個介面的模式。今天我們來看一個 Delphi 中使用 Adapter 模式的範例。 <br /></p><p>假設我們正在開發一個音樂播放器應用程式,需要使用一個第三方音樂函式庫來播放音樂,但這個庫的介面不符合我們的應用程式的需求,我們需要使用 Adapter 模式來解決這個問題。</p><h3 style="text-align: left;">Delphi 轉接器模式 (Adapter Pattern) 的範例:將不相容的介面轉換成符合應用程式需求的介面 <br /></h3><p>首先,我們需要建立一個播放器介面,它必須要符合我們應用程式的需求,比如有播放、暫停、停止等功能:</p><pre><code class="pascal">
type
IPlayer = interface
procedure Play;
procedure Pause;
procedure Stop;
end;
</code></pre>
<p>
然後,我們需要建立一個使用第三方音樂函式庫的播放器,但它的介面不符合我們應用程式的需求:
</p>
<pre><code class="pascal">
type
TThirdPartyPlayer = class
procedure Start;
procedure Halt;
procedure End;
end;
</code></pre>
<p>現在,我們可以建立一個 Adapter 類別,將 TThirdPartyPlayer 的介面轉換成符合我們應用程式需求的 IPlayer 介面:</p>
<pre><code class="pascal">
type
TPlayerAdapter = class(TInterfacedObject, IPlayer)
private
FThirdPartyPlayer: TThirdPartyPlayer;
public
constructor Create;
destructor Destroy; override;
procedure Play;
procedure Pause;
procedure Stop;
end;
constructor TPlayerAdapter.Create;
begin
FThirdPartyPlayer := TThirdPartyPlayer.Create;
end;
destructor TPlayerAdapter.Destroy;
begin
FThirdPartyPlayer.Free;
inherited;
end;
procedure TPlayerAdapter.Play;
begin
FThirdPartyPlayer.Start;
end;
procedure TPlayerAdapter.Pause;
begin
FThirdPartyPlayer.Halt;
end;
procedure TPlayerAdapter.Stop;
begin
FThirdPartyPlayer.End;
end;
</code></pre>
<p>現在,我們可以使用 TPlayerAdapter 類別來播放音樂了:</p>
<pre><code class="pascal">
var
Player: IPlayer;
begin
Player := TPlayerAdapter.Create;
Player.Play;
Player.Pause;
Player.Stop;
end;
</code></pre>
<p>如此一來,我們就成功地使用 Adapter 模式來將原本不相容的介面轉換成了符合我們應用程式需求的介面。
</p>
<h3 style="text-align: left;">總結</h3>
<p>Adapter 模式是一種非常實用的設計模式,能夠讓不相容的類別能夠一起工作,提高程式的彈性和可擴展性。在實際應用中,我們可以使用 Adapter 模式來解決許多問題,例如:</p><ul style="text-align: left;"><li>一些舊的程式碼需要被重用,但是與新的系統不相容。</li><li>需要在現有的系統上加入新的功能,但是無法修改現有的代碼。</li><li>需要整合多個不同的系統,但是它們之間的介面並不相同。 </li></ul><p style="text-align: left;">Adapter 模式的實現方式有很多種,例如類別 Adapter 和物件 Adapter。選擇哪種方式實現取決於具體的應用場景和需求。</p><p>在 Delphi 中,我們可以使用類別 Helper 或者繼承來實現 Adapter 模式。在使用時,我們需要根據具體的需求選擇適合的實現方式。</p><p>綜上所述,Adapter 模式是一種強大的設計模式,能夠幫助我們解決很多問題。如果您希望提高程式的彈性和可擴展性,那麼學習和應用 Adapter 模式是非常有益的。</p>Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0tag:blogger.com,1999:blog-7413724838921420581.post-29275598020993321252023-03-15T21:07:00.002+08:002023-03-16T08:45:47.731+08:00用Delphi體驗簡單工廠模式<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi56P0Y5AbkTVS2s18rJFaf53KgIZqz33SbNDlINrzofqahVYXs-bHV-KcS34HP3ElWI71IZ18VN3Qk_cdgwfv5bzqHdarYxqM28vuHCnAe9NPkNNFMbxgUhNBpqrb4fqui6_x8A3zAqI-G0KjiWLkWO238OGrGbL9-y5JEX9tI0n7wGkVMCevZkjJ8Dw/s640/pexels-klaus-nielsen-6294362.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="427" data-original-width="640" height="428" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi56P0Y5AbkTVS2s18rJFaf53KgIZqz33SbNDlINrzofqahVYXs-bHV-KcS34HP3ElWI71IZ18VN3Qk_cdgwfv5bzqHdarYxqM28vuHCnAe9NPkNNFMbxgUhNBpqrb4fqui6_x8A3zAqI-G0KjiWLkWO238OGrGbL9-y5JEX9tI0n7wGkVMCevZkjJ8Dw/w640-h428/pexels-klaus-nielsen-6294362.jpg" width="640" /></a>
</div>
<br />
<nav id="toc_in_page"></nav>
<p>
簡單工廠模式是一種常用的創建型設計模式,它提供了一個統一的工廠方法,根據傳入的參數來創建不同的產品物件。
</p>
<p>具體來說,簡單工廠模式通常包含以下角色:</p>
<p></p>
<ul style="text-align: left;">
<li>產品(Product):需要創建的具體產品。</li>
<li>
工廠(Factory):負責創建產品的工廠,包含一個靜態的工廠方法,根據客戶端傳入的參數創建對應的產品。
</li>
<li>客戶端(Client):使用工廠創建產品的客戶端。</li>
<li>
簡單工廠模式的核心是工廠方法,它負責根據客戶端傳入的參數創建對應的產品。客戶端不需要知道具體的產品是如何創建的,只需要知道傳入什麼參數就可以得到對應的產品。
</li>
</ul>
<p></p>
<p>
在設計軟體時,我們常常需要創建不同的物件,而這些物件通常有共同的介面或繼承關係。當我們需要創建這些物件時,可以使用簡單工廠模式。<span></span>
</p>
<a name='more'></a>
<p></p>
<p>
簡單工廠模式是一種創建型模式,它提供了一個共同的介面,用於創建不同類型的物件,而不需要直接指定它們的類型。簡單工廠模式可以隱藏物件創建的細節,並提高程式碼的可讀性和可維護性。
</p>
<p>
在 Delphi 中,我們可以使用 TComponent 或介面
(Interface) 來實現簡單工廠模式。下面我們將以製作蛋餅為例來展示如何使用
TComponent 和介面實現簡單工廠模式。
</p>
<h3 style="text-align: left;">使用 TComponent 實現簡單工廠模式</h3>
<p>
首先,我們需要定義一個基礎的蛋餅類別 TChineseOmelette,並繼承自
TComponent。TChineseOmelette 包含兩個虛擬方法 GetName 和
GetPrice,用於取得蛋餅的名稱和價格。
</p>
<!--HTML generated using hilite.me-->
<div style="background: rgb(255, 255, 255); border-color: gray; border-image: none 100% / 1 / 0 stretch; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<table>
<tbody><tr>
<td>
<pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17</pre>
</td>
<td>
<pre style="line-height: 125%; margin: 0px;"><span style="color: navy; font-weight: bold;">unit</span> ChineseOmelette;
<span style="color: navy; font-weight: bold;">interface</span>
<span style="color: navy; font-weight: bold;">uses</span>
System.Classes;
<span style="color: navy; font-weight: bold;">type</span>
TChineseOmelette = <span style="color: navy; font-weight: bold;">class</span>(TComponent)
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>; <span style="color: navy; font-weight: bold;">virtual</span>; <span style="color: navy; font-weight: bold;">abstract</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>; <span style="color: navy; font-weight: bold;">virtual</span>; <span style="color: navy; font-weight: bold;">abstract</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">implementation</span>
<span style="color: navy; font-weight: bold;">end</span>.
</pre>
</td>
</tr>
</tbody></table>
</div>
<p>
接下來,我們需要定義具體的蛋餅類別,包括雞肉蛋餅、牛肉蛋餅、豬肉蛋餅和起司蛋餅。這些具體的蛋餅類別都繼承自
TChineseOmelette,並實現其 GetName 和 GetPrice 方法。
</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none 100% / 1 / 0 stretch; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><table><tbody><tr><td><pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81</pre></td><td><pre style="line-height: 125%; margin: 0px;"><span style="color: navy; font-weight: bold;">unit</span> ChineseOmelettes;
<span style="color: navy; font-weight: bold;">interface</span>
<span style="color: navy; font-weight: bold;">uses</span>
System.Classes;
<span style="color: navy; font-weight: bold;">type</span>
TChineseOmelette = <span style="color: navy; font-weight: bold;">class</span>(TComponent)
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>; <span style="color: navy; font-weight: bold;">virtual</span>; <span style="color: navy; font-weight: bold;">abstract</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>; <span style="color: navy; font-weight: bold;">virtual</span>; <span style="color: navy; font-weight: bold;">abstract</span>;
<span style="color: navy; font-weight: bold;">end</span>;
TChickenOmelette = <span style="color: navy; font-weight: bold;">class</span>(TChineseOmelette)
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>; <span style="color: navy; font-weight: bold;">override</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>; <span style="color: navy; font-weight: bold;">override</span>;
<span style="color: navy; font-weight: bold;">end</span>;
TBeefOmelette = <span style="color: navy; font-weight: bold;">class</span>(TChineseOmelette)
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>; <span style="color: navy; font-weight: bold;">override</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>; <span style="color: navy; font-weight: bold;">override</span>;
<span style="color: navy; font-weight: bold;">end</span>;
TPorkOmelette = <span style="color: navy; font-weight: bold;">class</span>(TChineseOmelette)
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>; <span style="color: navy; font-weight: bold;">override</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>; <span style="color: navy; font-weight: bold;">override</span>;
<span style="color: navy; font-weight: bold;">end</span>;
TCheeseOmelette = <span style="color: navy; font-weight: bold;">class</span>(TChineseOmelette)
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>; <span style="color: navy; font-weight: bold;">override</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>; <span style="color: navy; font-weight: bold;">override</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">implementation</span>
<span style="color: navy; font-weight: bold;">function</span> TChickenOmelette.GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">'雞肉蛋餅'</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TChickenOmelette.GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">30.0</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TBeefOmelette.GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">'牛肉蛋餅'</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TBeefOmelette.GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">35.0</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TPorkOmelette.GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">'豬肉蛋餅'</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TPorkOmelette.GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">25.0</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TCheeseOmelette.GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">'起司蛋餅'</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TCheeseOmelette.GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">40.0</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">end</span>.
</pre></td></tr></tbody></table></div>
<p>
現在我們已經定義了基礎類別 TChineseOmelette 和具體類別
TChickenChineseOmelette、TBeefChineseOmelette、TPorkChineseOmelette 和
TCheeseChineseOmelette。下一步我們需要定義一個工廠類別
TChineseOmeletteFactory,用於創建不同類型的蛋餅物件。
</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none 100% / 1 / 0 stretch; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><table><tbody><tr><td><pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37</pre></td><td><pre style="line-height: 125%; margin: 0px;"><span style="color: navy; font-weight: bold;">unit</span> ChineseOmeletteFactory;
<span style="color: navy; font-weight: bold;">interface</span>
<span style="color: navy; font-weight: bold;">uses</span>
ChineseOmelette;
<span style="color: navy; font-weight: bold;">type</span>
TChineseOmeletteType = (cotChicken, cotBeef, cotPork, cotCheese);
TChineseOmeletteFactory = <span style="color: navy; font-weight: bold;">class</span>
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">class</span> <span style="color: navy; font-weight: bold;">function</span> CreateOmelette(OmeletteType: TChineseOmeletteType): TChineseOmelette;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">implementation</span>
<span style="color: navy; font-weight: bold;">uses</span>
ChineseOmeletteTypes;
<span style="color: navy; font-weight: bold;">class</span> <span style="color: navy; font-weight: bold;">function</span> TChineseOmeletteFactory.CreateOmelette(OmeletteType: TChineseOmeletteType): TChineseOmelette;
<span style="color: navy; font-weight: bold;">begin</span>
<span style="color: navy; font-weight: bold;">case</span> OmeletteType <span style="color: navy; font-weight: bold;">of</span>
cotChicken:
Result := TChickenOmelette.Create(<span style="color: navy; font-weight: bold;">nil</span>);
cotBeef:
Result := TBeefOmelette.Create(<span style="color: navy; font-weight: bold;">nil</span>);
cotPork:
Result := TPorkOmelette.Create(<span style="color: navy; font-weight: bold;">nil</span>);
cotCheese:
Result := TCheeseOmelette.Create(<span style="color: navy; font-weight: bold;">nil</span>);
<span style="color: navy; font-weight: bold;">else</span>
Result := <span style="color: navy; font-weight: bold;">nil</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">end</span>.
</pre></td></tr></tbody></table></div>
<p>
現在我們已經定義了
TChineseOmeletteFactory,我們可以使用它來創建不同類型的蛋餅物件。
</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none 100% / 1 / 0 stretch; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><table><tbody><tr><td><pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24</pre></td><td><pre style="line-height: 125%; margin: 0px;"><span style="color: navy; font-weight: bold;">procedure</span> TForm1.Button1Click(Sender: <span style="color: navy; font-weight: bold;">TObject</span>);
<span style="color: navy; font-weight: bold;">var</span>
ChineseOmelette: TChineseOmelette;
<span style="color: navy; font-weight: bold;">begin</span>
<span style="color: #008800; font-style: italic;">// 創建雞肉蛋餅</span>
ChineseOmelette := TChineseOmeletteFactory.CreateChineseOmelette(btChicken) <span style="color: navy; font-weight: bold;">as</span> TChineseOmelette;
Memo1.Lines.Add(Format(<span style="color: blue;">'%s: %.2f'</span>, [ChineseOmelette.GetName, ChineseOmelette.GetPrice]));
ChineseOmelette.Free;
<span style="color: #008800; font-style: italic;">// 創建牛肉蛋餅</span>
ChineseOmelette := TChineseOmeletteFactory.CreateChineseOmelette(btBeef) <span style="color: navy; font-weight: bold;">as</span> TChineseOmelette;
Memo1.Lines.Add(Format(<span style="color: blue;">'%s: %.2f'</span>, [ChineseOmelette.GetName, ChineseOmelette.GetPrice]));
ChineseOmelette.Free;
<span style="color: #008800; font-style: italic;">// 創建豬肉蛋餅</span>
ChineseOmelette := TChineseOmeletteFactory.CreateChineseOmelette(btPork) <span style="color: navy; font-weight: bold;">as</span> TChineseOmelette;
Memo1.Lines.Add(Format(<span style="color: blue;">'%s: %.2f'</span>, [ChineseOmelette.GetName, ChineseOmelette.GetPrice]));
ChineseOmelette.Free;
<span style="color: #008800; font-style: italic;">// 創建起司蛋餅</span>
ChineseOmelette := TChineseOmeletteFactory.CreateChineseOmelette(btCheese) <span style="color: navy; font-weight: bold;">as</span> TChineseOmelette;
Memo1.Lines.Add(Format(<span style="color: blue;">'%s: %.2f'</span>, [ChineseOmelette.GetName, ChineseOmelette.GetPrice]));
ChineseOmelette.Free;
<span style="color: navy; font-weight: bold;">end</span>;
</pre></td></tr></tbody></table></div>
<p>
至此,我們已經完成了 Delphi
簡單工廠模式的設計與實現。現在我們可以輕鬆地創建不同類型的蛋餅物件,而不必關心其具體實現細節。
</p>
<h3 style="text-align: left;">使用 Interface (介面)實現簡單工廠模式 <br /></h3><p>簡單工廠模式是一個常見的設計模式,在軟體開發中使用廣泛。通過這種設計模式,我們可以確實隱藏物件的具體實現細節,提高程式碼的可維護性和擴充。
</p>
<p>
除了以上的 TComponent
實現方式,我們還可以使用介面來實現簡單工廠模式。以下是介面實現方式的範例:
</p>
<!--HTML generated using hilite.me--><div style="background: rgb(255, 255, 255); border-color: gray; border-image: none 100% / 1 / 0 stretch; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><table><tbody><tr><td><pre style="line-height: 125%; margin: 0px;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114</pre></td><td><pre style="line-height: 125%; margin: 0px;"><span style="color: navy; font-weight: bold;">unit</span> ChineseOmelette;
<span style="color: navy; font-weight: bold;">interface</span>
<span style="color: navy; font-weight: bold;">type</span>
IChineseOmelette = <span style="color: navy; font-weight: bold;">interface</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">end</span>;
TChineseOmeletteType = (cotChicken, cotBeef, cotPork, cotCheese);
TChineseOmeletteFactory = <span style="color: navy; font-weight: bold;">class</span>
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">class</span> <span style="color: navy; font-weight: bold;">function</span> CreateChineseOmelette(ChineseOmeletteType: TChineseOmeletteType): IChineseOmelette;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">implementation</span>
<span style="color: navy; font-weight: bold;">uses</span>
ChineseOmeletteVarieties;
<span style="color: navy; font-weight: bold;">type</span>
TChickenChineseOmelette = <span style="color: navy; font-weight: bold;">class</span>(TInterfacedObject, IChineseOmelette)
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">end</span>;
TBeefChineseOmelette = <span style="color: navy; font-weight: bold;">class</span>(TInterfacedObject, IChineseOmelette)
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">end</span>;
TPorkChineseOmelette = <span style="color: navy; font-weight: bold;">class</span>(TInterfacedObject, IChineseOmelette)
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">end</span>;
TCheeseChineseOmelette = <span style="color: navy; font-weight: bold;">class</span>(TInterfacedObject, IChineseOmelette)
<span style="color: navy; font-weight: bold;">public</span>
<span style="color: navy; font-weight: bold;">function</span> GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">function</span> GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: #008800; font-style: italic;">{ TChickenChineseOmelette }</span>
<span style="color: navy; font-weight: bold;">function</span> TChickenChineseOmelette.GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">'雞肉蛋餅'</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TChickenChineseOmelette.GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">30.0</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: #008800; font-style: italic;">{ TBeefChineseOmelette }</span>
<span style="color: navy; font-weight: bold;">function</span> TBeefChineseOmelette.GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">'牛肉蛋餅'</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TBeefChineseOmelette.GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">35.0</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: #008800; font-style: italic;">{ TPorkChineseOmelette }</span>
<span style="color: navy; font-weight: bold;">function</span> TPorkChineseOmelette.GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">'豬肉蛋餅'</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TPorkChineseOmelette.GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">25.0</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: #008800; font-style: italic;">{ TCheeseChineseOmelette }</span>
<span style="color: navy; font-weight: bold;">function</span> TCheeseChineseOmelette.GetName: <span style="color: navy; font-weight: bold;">string</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">'起司蛋餅'</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">function</span> TCheeseChineseOmelette.GetPrice: <span style="color: navy; font-weight: bold;">Double</span>;
<span style="color: navy; font-weight: bold;">begin</span>
Result := <span style="color: blue;">40.0</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: #008800; font-style: italic;">{ TChineseOmeletteFactory }</span>
<span style="color: navy; font-weight: bold;">class</span> <span style="color: navy; font-weight: bold;">function</span> TChineseOmeletteFactory.CreateChineseOmelette(ChineseOmeletteType: TChineseOmeletteType): IChineseOmelette;
<span style="color: navy; font-weight: bold;">begin</span>
<span style="color: navy; font-weight: bold;">case</span> ChineseOmeletteType <span style="color: navy; font-weight: bold;">of</span>
cotChicken:
Result := TChickenChineseOmelette.Create;
cotBeef:
Result := TBeefChineseOmelette.Create;
cotPork:
Result := TPorkChineseOmelette.Create;
cotCheese:
Result := TCheeseChineseOmelette.Create;
<span style="color: navy; font-weight: bold;">else</span>
<span style="color: navy; font-weight: bold;">raise</span> Exception.Create(<span style="color: blue;">'Invalid Chinese omelette type.'</span>);
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">end</span>;
<span style="color: navy; font-weight: bold;">end</span>.
</pre></td></tr></tbody></table></div>
<p>
使用介面實現簡單工廠模式的核心在於定義一個公用介面,所有的具體產品都實現這個介面。工廠類別則根據不同的產品類型創建對應的具體產品,並返回公用介面類型的實例。
</p>
<p>在使用簡單工廠模式時,我們需要注意以下幾點:</p>
<p></p>
<ol style="text-align: left;">
<li>工廠類別需要負責創建產品實例,並返回公用介面類型的實例。</li>
<li>具體產品需要實現公用介面,以便工廠類別能夠創建對應的產品實例。</li>
<li>工廠類別需要知道所有支援的產品類型,並根據類型創建對應的產品實例。</li>
<li>
簡單工廠模式在增加新的產品時,需要修改工廠類別的代碼。因此,它的擴充性較低,但對於簡單的應用場景來說,它仍是一個簡單而有效的設計模式。
</li>
</ol>
<p></p>
<h3 style="text-align: left;">總結</h3>
<p>
簡單工廠模式是一個常用的設計模式,它可以將物件的創建與使用分離開來,提高程式碼的可維護性和擴充性。在
Delphi 中,我們可以使用 TComponent
或介面來實現簡單工廠模式。透過這個模式,我們可以輕鬆地創建不同類型的物件,而不必關心其具體實現細節。
</p>
<div>和你分享。😉</div>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
Edenhttp://www.blogger.com/profile/10463719837677844391noreply@blogger.com0