Let's Go جاسازی فایل › جاسازی قالب‌های HTML
قبلی · فهرست · بعدی
فصل ۱۲.۲.

جاسازی قالب‌های 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 (که شامل قالب‌های ما است) را نیز جاسازی کند. به این صورت:

File: ui/efs.go
package ui

import (
    "embed"
)

//go:embed "html" "static" 
var Files embed.FS

سپس باید تابع newTemplateCache() در cmd/web/templates.go را به‌روزرسانی کنیم تا قالب‌ها را از ui.Files بخواند. برای انجام این کار، باید از چند ویژگی خاص که Go برای کار با سیستم‌های فایل جاسازی شده دارد، استفاده کنیم:

بیایید این‌ها را در فایل cmd/web/templates.go خود به کار ببریم:

File: 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 در مرورگر خود مراجعه کنید و همه چیز باید به درستی کار کند — با وجود اینکه باینری در مکانی قرار دارد که به فایل‌های اصلی رابط کاربری روی دیسک دسترسی ندارد.

12.02-01.png

واژه‌نامه اصطلاحات فنی

اصطلاح فارسی معادل انگلیسی توضیح
جاسازی قالب‌های HTML Embedding HTML Templates قرار دادن قالب‌های وب در برنامه
فایل‌های قالب Template Files فایل‌های الگوی صفحات
قالب‌های پایه Base Templates الگوهای اصلی صفحات
قالب‌های جزئی Partial Templates الگوهای بخش‌های کوچک
دستور جاسازی Embed Directive دستور برای جاسازی فایل
باینری برنامه Program Binary فایل اجرایی برنامه
پردازش قالب Template Processing تبدیل قالب به HTML
کش قالب Template Cache ذخیره‌سازی موقت قالب
متغیرهای قالب Template Variables داده‌های قابل جایگزینی
توابع قالب Template Functions توابع قابل استفاده در قالب