جاسازی قالبهای HTML (Embedding HTML Templates)
در این بخش، نحوه جاسازی قالبهای HTML (Embedding HTML Templates) را بررسی میکنیم. این شامل فایلهای قالب (Template Files)، قالبهای پایه (Base Templates) و قالبهای جزئی (Partial Templates) میشود.
با استفاده از دستور جاسازی (Embed Directive)، میتوانیم این قالبها را در باینری برنامه (Program Binary) قرار دهیم.
سپس برنامه خود را بهروزرسانی کنیم تا حافظه پنهان قالب از فایلهای قالب HTML جاسازی شده استفاده کند، به جای اینکه آنها را از دیسک سخت شما در زمان اجرا بخواند.
به فایل ui/efs.go برگردید و آن را بهروزرسانی کنید تا ui.Files محتوای دایرکتوری ui/html (که شامل قالبهای ما است) را نیز جاسازی کند. به این صورت:
package ui import ( "embed" ) //go:embed "html" "static" var Files embed.FS
سپس باید تابع newTemplateCache() در cmd/web/templates.go را بهروزرسانی کنیم تا قالبها را از ui.Files بخواند. برای انجام این کار، باید از چند ویژگی خاص که Go برای کار با سیستمهای فایل جاسازی شده دارد، استفاده کنیم:
- تابع
fs.Glob()یک برش از مسیرهای فایل را که با یک الگوی گلوب مطابقت دارند، برمیگرداند. این اساساً همان تابعfilepath.Glob()است که قبلاً در کتاب استفاده کردیم، با این تفاوت که بر روی سیستمهای فایل جاسازی شده کار میکند. - متد
Template.ParseFS()میتواند برای تجزیه قالبهای HTML از یک سیستم فایل جاسازی شده به یک مجموعه قالب استفاده شود. این اساساً جایگزینی برای هر دو متدTemplate.ParseFiles()وTemplate.ParseGlob()است که قبلاً استفاده کردیم.Template.ParseFiles()همچنین یک تابع واریادیک است که به شما امکان میدهد چندین قالب را در یک فراخوانی بهParseFiles()تجزیه کنید.
بیایید اینها را در فایل cmd/web/templates.go خود به کار ببریم:
package main import ( "html/template" "io/fs" // New import "path/filepath" "time" "snippetbox.alexedwards.net/internal/models" "snippetbox.alexedwards.net/ui" // New import ) ... func newTemplateCache() (map[string]*template.Template, error) { cache := map[string]*template.Template{} // Use fs.Glob() to get a slice of all filepaths in the ui.Files embedded // filesystem which match the pattern 'html/pages/*.tmpl'. This essentially // gives us a slice of all the 'page' templates for the application, just // like before. pages, err := fs.Glob(ui.Files, "html/pages/*.tmpl") if err != nil { return nil, err } for _, page := range pages { name := filepath.Base(page) // Create a slice containing the filepath patterns for the templates we // want to parse. patterns := []string{ "html/base.tmpl", "html/partials/*.tmpl", page, } // Use ParseFS() instead of ParseFiles() to parse the template files // from the ui.Files embedded filesystem. ts, err := template.New(name).Funcs(functions).ParseFS(ui.Files, patterns...) if err != nil { return nil, err } cache[name] = ts } return cache, nil }
حالا که این کار انجام شد، هنگامی که برنامه ما به یک باینری کامپایل میشود، همه فایلهای رابط کاربری که برای اجرا نیاز دارد را در خود خواهد داشت.
میتوانید این را به سرعت با ساخت یک باینری اجرایی در دایرکتوری /tmp، کپی کردن گواهینامههای TLS و اجرای باینری امتحان کنید. به این صورت:
$ go build -o /tmp/web ./cmd/web/ $ cp -r ./tls /tmp/ $ cd /tmp/ $ ./web time=2024-03-18T11:29:23.000+00:00 level=INFO msg="starting server" addr=:4000
و دوباره، باید بتوانید به https://localhost:4000 در مرورگر خود مراجعه کنید و همه چیز باید به درستی کار کند — با وجود اینکه باینری در مکانی قرار دارد که به فایلهای اصلی رابط کاربری روی دیسک دسترسی ندارد.
واژهنامه اصطلاحات فنی
| اصطلاح فارسی | معادل انگلیسی | توضیح |
|---|---|---|
| جاسازی قالبهای HTML | Embedding HTML Templates | قرار دادن قالبهای وب در برنامه |
| فایلهای قالب | Template Files | فایلهای الگوی صفحات |
| قالبهای پایه | Base Templates | الگوهای اصلی صفحات |
| قالبهای جزئی | Partial Templates | الگوهای بخشهای کوچک |
| دستور جاسازی | Embed Directive | دستور برای جاسازی فایل |
| باینری برنامه | Program Binary | فایل اجرایی برنامه |
| پردازش قالب | Template Processing | تبدیل قالب به HTML |
| کش قالب | Template Cache | ذخیرهسازی موقت قالب |
| متغیرهای قالب | Template Variables | دادههای قابل جایگزینی |
| توابع قالب | Template Functions | توابع قابل استفاده در قالب |