JavaScript ekosistemində Django üslublu şablonlardan istifadə etməyə çalışmısınızsa, bu ağrını bilirsiniz. Nunjucks əsas seçimdir, lakin yavaşdır və funksiyaları çatışmır. Bun layihəsi üçün daha yaxşı bir şeyə ehtiyacım var idi, ona görə də binja yaratdım.
Problem
Django tətbiqini Bun/Elysia-ya köçürürdüm və divara dirəndim: şablonlarım Nunjucks-un ya dəstəkləmədiyi, ya da zəif işlədiyi Django Template Language xüsusiyyətlərinə çox güvənirdi. Şablon varisliliyi işləyirdi, lakin bir çox filtr çatışmırdı və performans yaxşı deyildi.
binja Nəyi Fərqli Edir
Runtime renderinq bütün benchmarklarda Nunjucks-dan 2-4 dəfə sürətlidir:
| Benchmark | binja | Nunjucks |
|---|---|---|
| Sadə Şablon | 371K ops/s | 96K ops/s |
| HTML Escape | 985K ops/s | 242K ops/s |
| İç-içə Döngülər | 76K ops/s | 26K ops/s |
Lakin əsl qələbə AOT kompilyasiyasıdır. Şablonlarınızı server başlanğıcında əvvəlcədən kompilyasiya edin və renderinq sinxron və inanılmaz dərəcədə sürətli olur:
import { compile } from 'binja'
// Başlanğıcda bir dəfə kompilyasiya edin
const templates = {
home: compile(await Bun.file('./views/home.html').text()),
user: compile(await Bun.file('./views/user.html').text()),
}
// Sinxron renderinq - await lazım deyil
app.get('/', () => templates.home({ title: 'Welcome' }))
AOT-kompilyasiya edilmiş şablonlar sadə şablonlar üçün saniyədə 14+ milyon əməliyyat sürəti ilə işləyir. Bu Nunjucks-dan ~160 dəfə sürətlidir.
Tam Django/Jinja2 Uyğunluğu
Bu mənim əsas məqsədim idi. binja bunları əhatə edir:
- Həm Jinja2, həm də Django-nu əhatə edən 84 daxili filtr
-
28 daxili test (
is even,is definedvə s.) - Bütün Django döngü dəyişənləri (
forloop.counter,forloop.first,forloop.parentloop) - Django-ya xas teqlər:
{% csrf_token %},{% cycle %},{% regroup %},{% lorem %} -
{% extends %}və{% block %}ilə şablon varisliliyi - Defolt olaraq autoescape aktivdir
Django şablonlarını köçürürsünüzsə, əksəriyyəti dəyişiklik olmadan işləməlidir.
Çox Mühərrikli Dəstək
Ehtiyac duyacağımı gözləmədiyim, lakin sevdiyim bir xüsusiyyət: binja həmçinin Handlebars, Liquid və Twig sintaksisini də təhlil edə bilir.
import * as handlebars from 'binja/engines/handlebars'
import * as liquid from 'binja/engines/liquid'
await handlebars.render('{{#each items}}{{this}}{{/each}}', { items: ['a', 'b'] })
await liquid.render('{% for item in items %}{{ item }}{% endfor %}', { items: ['a', 'b'] })
Bütün mühərriklər eyni optimallaşdırılmış runtime-ı paylaşır, beləliklə sintaksisdən asılı olmayaraq ardıcıl performans əldə edirsiniz.
Framework İnteqrasiyası
Hono və Elysia üçün birinci dərəcəli adapterlər:
import { Elysia } from 'elysia'
import { binja } from 'binja/elysia'
const app = new Elysia()
.use(binja({ root: './views', cache: true }))
.get('/', ({ render }) => render('index', { title: 'Home' }))
.listen(3000)
Başlamaq
bun add binja
Əsas istifadə:
import { render } from 'binja'
const html = await render('Hello, {{ name|title }}!', { name: 'world' })
// Çıxış: Hello, World!
Şablon varisliliyi üçün environment ilə:
import { Environment } from 'binja'
const env = new Environment({
templates: './templates',
autoescape: true,
})
const html = await env.render('pages/home.html', { user })
binja-nı Nə Vaxt İstifadə Etməli
- Django/Flask tətbiqlərini Bun-a köçürərkən
- Yüksək performanslı server tərəfi renderinq lazım olanda
- Çoxlu sintaksisləri idarə edən tək şablon mühərriki istəyəndə
- Hono və ya Elysia ilə inkişaf etdirib düzgün şablon dəstəyinə ehtiyac duyanda
Baxın:
- GitHub: github.com/egeominotti/binja
- npm: npmjs.com/package/binja
PR-lar xoş qarşılanır.
Bun ilə hansı şablon mühərrikindən istifadə edirsiniz? Quraşdırmanız haqqında eşitmək maraqlı olardı.