Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
A Swig Service
Search
Logan Bell
June 27, 2014
0
130
A Swig Service
Logan Bell
June 27, 2014
Tweet
Share
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Code Review Best Practice
trishagee
65
17k
Typedesign – Prime Four
hannesfritz
40
2.4k
How to Think Like a Performance Engineer
csswizardry
22
1.2k
Bash Introduction
62gerente
608
210k
Practical Orchestrator
shlominoach
186
10k
A designer walks into a library…
pauljervisheath
204
24k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
RailsConf 2023
tenderlove
29
940
Testing 201, or: Great Expectations
jmmastey
40
7.1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Transcript
Templates (as a service)
Who Am I? Logan Bell twitter: @epochbell IRC: logie https://metacpan.org/author/LOGIE
Work for Shutterstock
Why was the JavaScript developer sad? Because he didn't Node
how to Express himself
Things to cover • What is Swig.js? • Swig in
Perl • Swig as a service • Why? • How to? • Questions
What is Swig • Inspired by Django/Twig style templates •
Written by Paul Armstrong • Written in JavaScript • It’s hip with the kids
Example {% for item in items %} <div class="item">{{ item
}}</div> {% endfor %} ! <div class="price">{{ price }}</div>
What is Swig • Supports tags • Object Oriented template
inheritance • express.js compatible • Also works with node.js
Webstack • Platform team • Need for unified templates across
multiple languages • Dancer and Modern Perl • Moving away from Mason
Perl and JavaScript • Javascript templates and Perl backend? •
But we want to use Dancer • But we want to share Templates • We also want to use Swig
Template::Swig • Perl wrapper that compiled JavaScript • JavaScript::V8 •
Upsides: • Fast • Downsides: • Difficult to upgrade • Difficult to keep custom tags in-line
JavaScript::V8 use JavaScript::V8; my $context = JavaScript::V8::Context->new; $context->bind_function(yo => sub
{ print @_ }); $context->eval(q{ // This is javascript yo(“word up"); });
JavaScript::V8 use JavaScript::V8; my $context = JavaScript::V8::Context->new; $context->bind_function(yo => sub
{ print @_ }); $context->eval(q{ // This is javascript yo(“word up"); });
Rage
Let’s make it a service! • We’ll use node.js •
Build it with express.js • We can use i18n • Perl/Ruby/Php can share templates!
This is what it looks like Dancer/ Starman Nginx Proxy
Dancer/ Starman Swig Service Worker Swig Service Worker Cluster Manager
WebService::SwigClient • Uses WWW::Curl under the hood • Meant to
be fast, caches connection
WebService::SwigClient use WebService::SwigClient; my $client = WebService::SwigClient->new( service_url => http://localhost:8999,
error_handler => sub { my ($error, $curl_object) = @_; warn $error; }, ); $client->render('foo.html', { param => 1, param => 2});
We also need the service git clone
[email protected]
:shutterstock/a-swig-service.git ! npm
install ! bin/run-swig —port=8999 --templates=./templates
Let’s learn to dance
Dancer::Plugin::Swig • Wrapper around WebService::SwigClient • Easy to setup and
get started with
How to use it • Setup a dancer application: perl
-a Dancer MySwig::App • Install the swig module: cpanm Dancer::Plugin::Swig
The Config plugins: Swig: service_url: "http://localhost:8999"
Route File package NewApp; use Dancer ':syntax'; use Dancer::Plugin::Swig; !
our $VERSION = '0.1'; ! get '/' => sub { render 'index.html', { hello_world => 'howdy' }; }; ! true;
Route File package NewApp; use Dancer ':syntax'; use Dancer::Plugin::Swig; !
our $VERSION = '0.1'; ! get '/' => sub { render 'index.html', { hello_world => 'howdy' }; }; ! true;
The Template File <html> <head> <title>Hi</title> </head> <body> <span>{{ hello_world
}}</span> </body> </html>
Run the service ! bin/run-swig —port=8999 --templates=./templates
Try it open http://my.dancer.application.com/ <html> <head> <title>Hi</title> </head> <body> <span>howdy</span>
</body> </html>
Basic i18n support • Built in swig tag {% i18n
%} • Can watch for a translation file and load it appropriately • Uses a npm module yacm (yet another cluster manger)
i18n tag {% i18n TAG_NAME %} Default {% eni18n %}
{% i18n TAG_NAME key:value %} Default key {% end18n %}
The Template File <html> <head> <title>Hi</title> </head> <body> <span> {%
i18n hello_world %}Not found{% endi18n %} </span> </body> </html>
Route File package NewApp; use Dancer ':syntax'; use Dancer::Plugin::Swig; !
our $VERSION = '0.1'; ! get '/' => sub { render 'index.html', { i18n => { language => ‘es’ }, hello_world => ‘HELLO_WORLD' }; }; true;
Translation File { "HELLO_WORLD": { "en": "howdy", "es": "hola mundo",
"fr": "bonjour tout le monde" } }
Run the service ! bin/run-swig —port=[port] \ —templates=./templates \ —translations
=./translations.json
Try it open http://my.dancer.application.com/ <html> <head> <title>Hi</title> </head> <body> <span>hola
mundo</span> </body> </html>
Heavy Load, No Problem ! bin/run-swig —port=[port] \ —templates=./templates \
—translations =./translations.json \ —workers = 2
Workers • Using node clusters, which create network processes that
share the same port. • We use yacm to manage our workers. • Watches for changes in files and reloads into memory
Other Interesting Features • ruby/sinatra client • it’s faster than
Mason 1
Where to learn more • https://github.com/shutterstock/a-swig-service • https://metacpan.org/pod/ WebService::SwigClient •
https://metacpan.org/pod/release/LOGIE/ Dancer-Plugin-Swig-0.02/README.pod
Thank You! • Shutterstock: For both employment and the images
for this talk • Webstack Team: Nikolay, Vishal, Adam, Kevin, and Belden • My wife and two girls: Amy, Chloe and Kassidy! Love all of ya! • The site where I stole my joke: http://www.elijahmanor.com/front-end-web-dev-jokes/
Questions