SlideShare une entreprise Scribd logo
1  sur  56
Télécharger pour lire hors ligne
Boston PHP, August 2015    
Better PHP­Frontend
Integration With
Tungsten.js
Let's get started!
Who Are We
Andrew Rota
@andrewrota  
Matt DeGennaro
@thedeeg
Wayfair
Wayfair.com is an online destination for all things
home
Selection of more than seven million home items from 7,000+
suppliers
eCommerce company since 2002
Several large websites running a shared codebase
PHP backend for customer­facing pages
2,000,000+ lines of code for custom eCommerce platform
2,000+ JavaScript modules
Divisions in Web Applications
Server Client
...But there are overlaps
Server Client
View Layer
What Comprises
the View Layer
Constants
Markup
Some data stored somewhere
Client­Side
Interaction is
Hard
The "jQuery"
Approach
Manual UI Management
JS is manually crafted to match the HTML
Event listeners modify the DOM as needed
Usually uses jQuery to smooth browser differences
Can be the fastest code
Maintenance nightmare for larger sites
Developers need to worry about low­level
performance
+
­
­
Maintenance Nightmare?
<div>
  <div class="clickable"></div>
</div>
$('.clickable').on('click', function() {
  $(this).parent().addClass('highlighted');
});
Maintenance Nightmare?
<div>
  <div class="fancy‐border">
    <div class="clickable"></div>
  </div>
</div>
$('.clickable').on('click', function() {
  $(this).parent().parent().addClass('highlighted');
});
Maintenance Nightmare?
<div class="highlightable">
  <div class="fancy‐border">
    <div class="clickable"></div>
  </div>
</div>
<div class="highlightable">
  <div class="clickable"></div>
</div>
$('.clickable').on('click', function() {
  $(this).closest('.highlightable').addClass('highlighted');
});
Maintenance Nightmare?
<div class="highlightable" data‐highlight‐class="fancy‐highlighted"
  <div class="fancy‐border">
    <div class="clickable"></div>
  </div>
</div>
<div class="highlightable" data‐highlight‐class="highlighted">
  <div class="clickable"></div>
</div>
$('.clickable').on('click', function() {
  var $highlightable = $(this).closest('.highlightable');
  $highlightable.addClass($highlightable.data('highlightClass'));
});
Markup === Data
The "Backbone"
Approach
Re­render constantly
Data is managed in JS
Template renders to String
Data + Template = innerHTML
Really simple to implement
Repaint/relayout on each render
Touching DOM on every render
+
­
­
DOM is Slow
Hundreds of properties
Hidden side effects
The "Virtual
DOM" Approach
Described Markup
   
Simplified Code
Turns imperative code into declarative code
<div class="{{#clicked}}fancy‐highlighted{{/clicked}}">
  <div class="fancy‐border">
    <div class="clickable"></div>
  </div>
</div>
<div class="{{#clicked}}highlighted{{/clicked}}">
  <div class="clickable"></div>
</div>
Declarative Code
State + Template is a consistent outcome
So by managing State rather than the page...
We can render the page from the server at any state
JS failures can fall back to forms so the server can update state
Markup is owned by one location
No more "where did this class come from" discovery adventure time
Bugs can be reproduced by copying state
Anyone can copy model data and send to Devs for bug reports
Isn't this the
same as
Backbone?
Virtual DOM
"Re­render" constantly, but in­memory
Only touch the DOM when necessary in a precise
manner (think scalpel vs sledgehammer)
Dev's don't worry about DOM interaction
How does this
work?
Vanilla DOM node creation Virtual DOM creation
Virtual DOM
document.createElement('div'); new VirtualNode('div');
  counterReset: ""
  cssText: ""
  cursor: ""
  direction: ""
  display: ""
  dominantBaseline: ""
  emptyCells: ""
  enableBackground: ""
  fill: ""
  fillOpacity: ""
  fillRule: ""
tagName: "DIV"
properties: {}
children: []
count: 0
Virtual DOM vs DOM
Lifecycle of a Render ­ Diffing
{
  "tagName": "INPUT",
  "properties": {
    "id": "toggle‐all",
    "className": "js‐toggle‐all",
    "type": "checkbox"
  },
  "children": [],
  "count": 0
}
{
  "tagName": "INPUT",
  "properties": {
    "id": "toggle‐all",
    "className": "js‐toggle‐all",
    "type": "checkbox",
    "checked": true
  },
  "children": [],
  "count": 0
}
Lifecycle of a Render ­ Patching
Diff creates a "Patch" object
Smallest set of operations it could detect to update
the DOM
{
  "0": { // Index of the element to patch
    "type": 4,  // type of patch operation, in this case 'update properti
    "patch": {  // Properties to update, in this case, update 'checked' t
      "checked": true
    }
  }
}
Lifecycle of a Render ­ Applying Changes
Iterate over Virtual Tree and attached DOM node
Vtree avoid iterating on unchanged DOM
When changed node is found, apply changes
DOM­Free View Abstraction
State + Template = View
Can use same abstraction across platforms
Create markup for server­side rendering
Create native UI for app rendering
Wayfair's
Transition
Why were we looking for a new solution?
Our codebase had a hybrid of the jQuery and
Backbone approaches
Debugging was hard
Unnecessary DOM selection / manipulation
Interactive pages could become janky
What we needed
Performance
The driving force
Stack Cohesion
First­class server­side rendering
Our Stack
Mustache Templates
C++ on server, precompiled for client
Server
Custom PHP MVC
Framework
Client
jQuery / AMD
Backbone on Mobile
Looked at Common Frameworks...
   
..But nothing quite fit
Most common stack was:
Server
node.js / io.js
Isomorphic JS
framework
No first­class server­
side rendering
Client
Same isomorphic
JS framework
So...
Required JS on the server
Server­side rendering was either
Much slower than our templates
Fully unsupported
­  , 
Funny story about server rendering: it
wasn't actually designed that way“
Sebastian Markbåge React.js Conf
Why is server­side rendering important?
Perceived time to load
SEO
Browser/User Support
Link previews for social media
Actual time to load
JS is not single point of failure
So What Did We
Do?
We wrote a new framework
Tungsten.js
JS framework with high­performance rendering
Designed to work with a portable template language
Server agnostic
Attaches to server­rendered HTML and adds
functionality
Application Logic
DOM Manipulation
Templates
Server
Integration
Our Server Framework
Custom MVC framework using Mustache templates
for View rendering
Page load triggers Controller action
Controller uses load Models for data
Models call DAOs as necessary
Data is passed to View layer
Tungsten + PHP Integration ­ Server
View prepares template data and renders HTML
Wraps HTML with a specific ID so we can attach client­side
Serializes data to JSON and adds data to
namespaced JS variable
View has reference to the JS View and Model
Bootstraps view, model, and precompiled template into our
JS loader
Tungsten + PHP Integration ­ Output
<div id="AppView1"><!‐‐ Markup from AppTemplate.mustache ‐‐></div>
<script src="AppView‐AppModel‐AppTemplate.js"></script>
var tungstenData = {
  App1: {
    view: "AppView",
    model: "AppModel",
    elem_id: "AppView1",
    template: "AppTemplate",
    data: {...}
  }
};
Tungsten + PHP Integration ­ Client
JS factory function reads variable and constructs JS
Views over the rendered HTML
Since data comes from the server, rendered HTML
will match
DOM Events are bound, adding interaction
Advantages
Zero DOM manipulation on page load
Centralized Data Store
Easier to reason about data­flow
Serializable state for debugging
Server can render at any state
Multi­page applications can use shared routes
DEMO
Coming Soon
Abstracting template from Mustache to allow more
template languages
Componentization to avoid all­in­one templates
Better client­side data management
Fork us at 
Driven by feature requests, so let us know what you'd
like to see
github.com/wayfair/tungstenjs

Contenu connexe

Tendances

Introduction to Vaadin
Introduction to VaadinIntroduction to Vaadin
Introduction to VaadinJeroen Benats
 
Building single page applications
Building single page applicationsBuilding single page applications
Building single page applicationsSC5.io
 
How to build a web application with Polymer
How to build a web application with PolymerHow to build a web application with Polymer
How to build a web application with PolymerSami Suo-Heikki
 
Pros and Cons of developing a Thick Clientside App
Pros and Cons of developing a Thick Clientside AppPros and Cons of developing a Thick Clientside App
Pros and Cons of developing a Thick Clientside AppRavi Teja
 
Maurice de Beijer
Maurice de BeijerMaurice de Beijer
Maurice de BeijerCodeFest
 
Custom Elements with Polymer Web Components #econfpsu16
Custom Elements with Polymer Web Components #econfpsu16Custom Elements with Polymer Web Components #econfpsu16
Custom Elements with Polymer Web Components #econfpsu16John Riviello
 
Easy HTML5 Data Visualization with Kendo UI DataViz
Easy HTML5 Data Visualization with Kendo UI DataVizEasy HTML5 Data Visualization with Kendo UI DataViz
Easy HTML5 Data Visualization with Kendo UI DataVizLohith Goudagere Nagaraj
 
Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web ComponentsFu Cheng
 
Putting the A in JAMstack
Putting the A in JAMstackPutting the A in JAMstack
Putting the A in JAMstackChris on Code
 
Developing JavaScript Widgets
Developing JavaScript WidgetsDeveloping JavaScript Widgets
Developing JavaScript WidgetsBob German
 
«The Grail: React based Isomorph apps framework»​
«The Grail: React based Isomorph apps framework»​«The Grail: React based Isomorph apps framework»​
«The Grail: React based Isomorph apps framework»​FDConf
 
Event sourcing your React-Flux applications
Event sourcing your React-Flux applicationsEvent sourcing your React-Flux applications
Event sourcing your React-Flux applicationsMaurice De Beijer [MVP]
 
Razor into the Razor'verse
Razor into the Razor'verseRazor into the Razor'verse
Razor into the Razor'verseEd Charbeneau
 
«Разрушаем Вавилонскую Башню WWW с помощью веб-компонент»​
«Разрушаем Вавилонскую Башню WWW с помощью веб-компонент»​«Разрушаем Вавилонскую Башню WWW с помощью веб-компонент»​
«Разрушаем Вавилонскую Башню WWW с помощью веб-компонент»​FDConf
 
More object oriented development with Page Type Builder
More object oriented development with Page Type BuilderMore object oriented development with Page Type Builder
More object oriented development with Page Type Builderjoelabrahamsson
 
Web Components
Web ComponentsWeb Components
Web ComponentsFITC
 

Tendances (20)

Introduction to Vaadin
Introduction to VaadinIntroduction to Vaadin
Introduction to Vaadin
 
Building single page applications
Building single page applicationsBuilding single page applications
Building single page applications
 
How to build a web application with Polymer
How to build a web application with PolymerHow to build a web application with Polymer
How to build a web application with Polymer
 
Booting up with polymer
Booting up with polymerBooting up with polymer
Booting up with polymer
 
Getting Started with J2EE, A Roadmap
Getting Started with J2EE, A RoadmapGetting Started with J2EE, A Roadmap
Getting Started with J2EE, A Roadmap
 
Pros and Cons of developing a Thick Clientside App
Pros and Cons of developing a Thick Clientside AppPros and Cons of developing a Thick Clientside App
Pros and Cons of developing a Thick Clientside App
 
Coding a SaaS
Coding a SaaSCoding a SaaS
Coding a SaaS
 
Maurice de Beijer
Maurice de BeijerMaurice de Beijer
Maurice de Beijer
 
Custom Elements with Polymer Web Components #econfpsu16
Custom Elements with Polymer Web Components #econfpsu16Custom Elements with Polymer Web Components #econfpsu16
Custom Elements with Polymer Web Components #econfpsu16
 
Easy HTML5 Data Visualization with Kendo UI DataViz
Easy HTML5 Data Visualization with Kendo UI DataVizEasy HTML5 Data Visualization with Kendo UI DataViz
Easy HTML5 Data Visualization with Kendo UI DataViz
 
Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web Components
 
Putting the A in JAMstack
Putting the A in JAMstackPutting the A in JAMstack
Putting the A in JAMstack
 
Developing JavaScript Widgets
Developing JavaScript WidgetsDeveloping JavaScript Widgets
Developing JavaScript Widgets
 
«The Grail: React based Isomorph apps framework»​
«The Grail: React based Isomorph apps framework»​«The Grail: React based Isomorph apps framework»​
«The Grail: React based Isomorph apps framework»​
 
Event sourcing your React-Flux applications
Event sourcing your React-Flux applicationsEvent sourcing your React-Flux applications
Event sourcing your React-Flux applications
 
Razor into the Razor'verse
Razor into the Razor'verseRazor into the Razor'verse
Razor into the Razor'verse
 
«Разрушаем Вавилонскую Башню WWW с помощью веб-компонент»​
«Разрушаем Вавилонскую Башню WWW с помощью веб-компонент»​«Разрушаем Вавилонскую Башню WWW с помощью веб-компонент»​
«Разрушаем Вавилонскую Башню WWW с помощью веб-компонент»​
 
Google Polymer Framework
Google Polymer FrameworkGoogle Polymer Framework
Google Polymer Framework
 
More object oriented development with Page Type Builder
More object oriented development with Page Type BuilderMore object oriented development with Page Type Builder
More object oriented development with Page Type Builder
 
Web Components
Web ComponentsWeb Components
Web Components
 

En vedette

Integrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationIntegrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationAndrew Rota
 
Μασάι Ελευθέριος
Μασάι   ΕλευθέριοςΜασάι   Ελευθέριος
Μασάι Ελευθέριοςnicolaidoumarina
 
Mεσαιωνικο καστρο λεμεσου
Mεσαιωνικο καστρο λεμεσουMεσαιωνικο καστρο λεμεσου
Mεσαιωνικο καστρο λεμεσουnicolaidoumarina
 
Sample ppt new niche interior by mulavira interior systems
Sample ppt new niche interior   by mulavira interior systemsSample ppt new niche interior   by mulavira interior systems
Sample ppt new niche interior by mulavira interior systemsMulavira Interior Systems
 
Κωνσταντίνος Καβάφης
Κωνσταντίνος Καβάφης Κωνσταντίνος Καβάφης
Κωνσταντίνος Καβάφης nicolaidoumarina
 
Islamic economic system
Islamic economic systemIslamic economic system
Islamic economic systemAbdul wahab
 
ΟΙ ΖΟΥΛΟΥ Παναγιώτα
ΟΙ ΖΟΥΛΟΥ  ΠαναγιώταΟΙ ΖΟΥΛΟΥ  Παναγιώτα
ΟΙ ΖΟΥΛΟΥ Παναγιώταnicolaidoumarina
 
Κωνσταντίνος Καβάφης
Κωνσταντίνος ΚαβάφηςΚωνσταντίνος Καβάφης
Κωνσταντίνος Καβάφηςnicolaidoumarina
 
Conventions of short films
Conventions of short filmsConventions of short films
Conventions of short filmspelboy123
 
οικια μέλπως πηλαβάκη
οικια μέλπως πηλαβάκηοικια μέλπως πηλαβάκη
οικια μέλπως πηλαβάκηnicolaidoumarina
 
Κωνσταντίνος Καβάφης
Κωνσταντίνος  Καβάφης  Κωνσταντίνος  Καβάφης
Κωνσταντίνος Καβάφης nicolaidoumarina
 
3d printing....science....
3d printing....science....3d printing....science....
3d printing....science....ikbal ahmed
 
ΟΔΟΣ ΔΗΜΟΣΘΕΝΗ ΜΙΤΣΗ
ΟΔΟΣ ΔΗΜΟΣΘΕΝΗ ΜΙΤΣΗΟΔΟΣ ΔΗΜΟΣΘΕΝΗ ΜΙΤΣΗ
ΟΔΟΣ ΔΗΜΟΣΘΕΝΗ ΜΙΤΣΗnicolaidoumarina
 
Big data on AWS
Big data on AWSBig data on AWS
Big data on AWSStylight
 

En vedette (18)

Integrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationIntegrating React.js Into a PHP Application
Integrating React.js Into a PHP Application
 
Article
ArticleArticle
Article
 
Μασάι Ελευθέριος
Μασάι   ΕλευθέριοςΜασάι   Ελευθέριος
Μασάι Ελευθέριος
 
Mεσαιωνικο καστρο λεμεσου
Mεσαιωνικο καστρο λεμεσουMεσαιωνικο καστρο λεμεσου
Mεσαιωνικο καστρο λεμεσου
 
Sample ppt new niche interior by mulavira interior systems
Sample ppt new niche interior   by mulavira interior systemsSample ppt new niche interior   by mulavira interior systems
Sample ppt new niche interior by mulavira interior systems
 
Κωνσταντίνος Καβάφης
Κωνσταντίνος Καβάφης Κωνσταντίνος Καβάφης
Κωνσταντίνος Καβάφης
 
Wakayama 1 day
Wakayama 1 dayWakayama 1 day
Wakayama 1 day
 
Islamic economic system
Islamic economic systemIslamic economic system
Islamic economic system
 
ΟΙ ΖΟΥΛΟΥ Παναγιώτα
ΟΙ ΖΟΥΛΟΥ  ΠαναγιώταΟΙ ΖΟΥΛΟΥ  Παναγιώτα
ΟΙ ΖΟΥΛΟΥ Παναγιώτα
 
Κωνσταντίνος Καβάφης
Κωνσταντίνος ΚαβάφηςΚωνσταντίνος Καβάφης
Κωνσταντίνος Καβάφης
 
RENNIE COWAN - GRAPHIC DESIGN
RENNIE COWAN - GRAPHIC DESIGN RENNIE COWAN - GRAPHIC DESIGN
RENNIE COWAN - GRAPHIC DESIGN
 
Alejandra la paradoja de james hunter
Alejandra la paradoja de james hunterAlejandra la paradoja de james hunter
Alejandra la paradoja de james hunter
 
Conventions of short films
Conventions of short filmsConventions of short films
Conventions of short films
 
οικια μέλπως πηλαβάκη
οικια μέλπως πηλαβάκηοικια μέλπως πηλαβάκη
οικια μέλπως πηλαβάκη
 
Κωνσταντίνος Καβάφης
Κωνσταντίνος  Καβάφης  Κωνσταντίνος  Καβάφης
Κωνσταντίνος Καβάφης
 
3d printing....science....
3d printing....science....3d printing....science....
3d printing....science....
 
ΟΔΟΣ ΔΗΜΟΣΘΕΝΗ ΜΙΤΣΗ
ΟΔΟΣ ΔΗΜΟΣΘΕΝΗ ΜΙΤΣΗΟΔΟΣ ΔΗΜΟΣΘΕΝΗ ΜΙΤΣΗ
ΟΔΟΣ ΔΗΜΟΣΘΕΝΗ ΜΙΤΣΗ
 
Big data on AWS
Big data on AWSBig data on AWS
Big data on AWS
 

Similaire à Better PHP-Frontend Integration with Tungsten.js

Web Development Presentation
Web Development PresentationWeb Development Presentation
Web Development PresentationTurnToTech
 
Backend asa service - juan
Backend asa service - juanBackend asa service - juan
Backend asa service - juanLama K Banna
 
Backend asa service - juan
Backend asa service - juanBackend asa service - juan
Backend asa service - juanLama K Banna
 
Modular Web Applications With Netzke
Modular Web Applications With NetzkeModular Web Applications With Netzke
Modular Web Applications With Netzkenetzke
 
WinJS at NYC Code Camp 2012
WinJS at NYC Code Camp 2012WinJS at NYC Code Camp 2012
WinJS at NYC Code Camp 2012Dmitri Artamonov
 
FATC - AIR 2.0 workshop
FATC - AIR 2.0 workshopFATC - AIR 2.0 workshop
FATC - AIR 2.0 workshopPeter Elst
 
Intro to mobile web application development
Intro to mobile web application developmentIntro to mobile web application development
Intro to mobile web application developmentzonathen
 
Web Development Today
Web Development TodayWeb Development Today
Web Development Todaybretticus
 
Intro to .NET for Government Developers
Intro to .NET for Government DevelopersIntro to .NET for Government Developers
Intro to .NET for Government DevelopersFrank La Vigne
 
Dynamic Application Development by NodeJS ,AngularJS with OrientDB
Dynamic Application Development by NodeJS ,AngularJS with OrientDBDynamic Application Development by NodeJS ,AngularJS with OrientDB
Dynamic Application Development by NodeJS ,AngularJS with OrientDBApaichon Punopas
 
Defy Occassionally Connected Challenges With Smart Client Applications
Defy Occassionally Connected Challenges With Smart Client ApplicationsDefy Occassionally Connected Challenges With Smart Client Applications
Defy Occassionally Connected Challenges With Smart Client ApplicationsClint Edmonson
 
Developing Next-Gen Enterprise Web Application
Developing Next-Gen Enterprise Web ApplicationDeveloping Next-Gen Enterprise Web Application
Developing Next-Gen Enterprise Web ApplicationMark Gu
 
HTML5 introduction for beginners
HTML5 introduction for beginnersHTML5 introduction for beginners
HTML5 introduction for beginnersVineeth N Krishnan
 
Website development
Website developmentWebsite development
Website developmentAnurag Gupta
 

Similaire à Better PHP-Frontend Integration with Tungsten.js (20)

Web Development Presentation
Web Development PresentationWeb Development Presentation
Web Development Presentation
 
Web 2.0
Web 2.0Web 2.0
Web 2.0
 
Backend asa service - juan
Backend asa service - juanBackend asa service - juan
Backend asa service - juan
 
Backend asa service - juan
Backend asa service - juanBackend asa service - juan
Backend asa service - juan
 
Modular Web Applications With Netzke
Modular Web Applications With NetzkeModular Web Applications With Netzke
Modular Web Applications With Netzke
 
WinJS at NYC Code Camp 2012
WinJS at NYC Code Camp 2012WinJS at NYC Code Camp 2012
WinJS at NYC Code Camp 2012
 
php
phpphp
php
 
Intro to vaadin
Intro to vaadinIntro to vaadin
Intro to vaadin
 
FATC - AIR 2.0 workshop
FATC - AIR 2.0 workshopFATC - AIR 2.0 workshop
FATC - AIR 2.0 workshop
 
Web summit.pptx
Web summit.pptxWeb summit.pptx
Web summit.pptx
 
Intro to mobile web application development
Intro to mobile web application developmentIntro to mobile web application development
Intro to mobile web application development
 
Web Development Today
Web Development TodayWeb Development Today
Web Development Today
 
Intro to .NET for Government Developers
Intro to .NET for Government DevelopersIntro to .NET for Government Developers
Intro to .NET for Government Developers
 
Push it to the Edge
Push it to the EdgePush it to the Edge
Push it to the Edge
 
Node js
Node jsNode js
Node js
 
Dynamic Application Development by NodeJS ,AngularJS with OrientDB
Dynamic Application Development by NodeJS ,AngularJS with OrientDBDynamic Application Development by NodeJS ,AngularJS with OrientDB
Dynamic Application Development by NodeJS ,AngularJS with OrientDB
 
Defy Occassionally Connected Challenges With Smart Client Applications
Defy Occassionally Connected Challenges With Smart Client ApplicationsDefy Occassionally Connected Challenges With Smart Client Applications
Defy Occassionally Connected Challenges With Smart Client Applications
 
Developing Next-Gen Enterprise Web Application
Developing Next-Gen Enterprise Web ApplicationDeveloping Next-Gen Enterprise Web Application
Developing Next-Gen Enterprise Web Application
 
HTML5 introduction for beginners
HTML5 introduction for beginnersHTML5 introduction for beginners
HTML5 introduction for beginners
 
Website development
Website developmentWebsite development
Website development
 

Plus de Andrew Rota

Integrating React.js Into a PHP Application: Dutch PHP 2019
Integrating React.js Into a PHP Application: Dutch PHP 2019Integrating React.js Into a PHP Application: Dutch PHP 2019
Integrating React.js Into a PHP Application: Dutch PHP 2019Andrew Rota
 
Performant APIs with GraphQL and PHP (Dutch PHP 2019)
Performant APIs with GraphQL and PHP (Dutch PHP 2019)Performant APIs with GraphQL and PHP (Dutch PHP 2019)
Performant APIs with GraphQL and PHP (Dutch PHP 2019)Andrew Rota
 
Getting Started with GraphQL && PHP
Getting Started with GraphQL && PHPGetting Started with GraphQL && PHP
Getting Started with GraphQL && PHPAndrew Rota
 
Tutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHPTutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHPAndrew Rota
 
Building a GraphQL API in PHP
Building a GraphQL API in PHPBuilding a GraphQL API in PHP
Building a GraphQL API in PHPAndrew Rota
 
Ten practical ways to improve front-end performance
Ten practical ways to improve front-end performanceTen practical ways to improve front-end performance
Ten practical ways to improve front-end performanceAndrew Rota
 
Component Based UI Architectures for the Web
Component Based UI Architectures for the WebComponent Based UI Architectures for the Web
Component Based UI Architectures for the WebAndrew Rota
 
Client-Side Performance Monitoring (MobileTea, Rome)
Client-Side Performance Monitoring (MobileTea, Rome)Client-Side Performance Monitoring (MobileTea, Rome)
Client-Side Performance Monitoring (MobileTea, Rome)Andrew Rota
 
Effectively Monitoring Client-Side Performance
Effectively Monitoring Client-Side PerformanceEffectively Monitoring Client-Side Performance
Effectively Monitoring Client-Side PerformanceAndrew Rota
 
Why Static Type Checking is Better
Why Static Type Checking is BetterWhy Static Type Checking is Better
Why Static Type Checking is BetterAndrew Rota
 
The Complementarity of React and Web Components
The Complementarity of React and Web ComponentsThe Complementarity of React and Web Components
The Complementarity of React and Web ComponentsAndrew Rota
 
Web Components + Backbone: a Game-Changing Combination
Web Components + Backbone: a Game-Changing CombinationWeb Components + Backbone: a Game-Changing Combination
Web Components + Backbone: a Game-Changing CombinationAndrew Rota
 
Web Components and Modular CSS
Web Components and Modular CSSWeb Components and Modular CSS
Web Components and Modular CSSAndrew Rota
 

Plus de Andrew Rota (14)

Integrating React.js Into a PHP Application: Dutch PHP 2019
Integrating React.js Into a PHP Application: Dutch PHP 2019Integrating React.js Into a PHP Application: Dutch PHP 2019
Integrating React.js Into a PHP Application: Dutch PHP 2019
 
Performant APIs with GraphQL and PHP (Dutch PHP 2019)
Performant APIs with GraphQL and PHP (Dutch PHP 2019)Performant APIs with GraphQL and PHP (Dutch PHP 2019)
Performant APIs with GraphQL and PHP (Dutch PHP 2019)
 
Getting Started with GraphQL && PHP
Getting Started with GraphQL && PHPGetting Started with GraphQL && PHP
Getting Started with GraphQL && PHP
 
Tutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHPTutorial: Building a GraphQL API in PHP
Tutorial: Building a GraphQL API in PHP
 
Building a GraphQL API in PHP
Building a GraphQL API in PHPBuilding a GraphQL API in PHP
Building a GraphQL API in PHP
 
Ten practical ways to improve front-end performance
Ten practical ways to improve front-end performanceTen practical ways to improve front-end performance
Ten practical ways to improve front-end performance
 
Component Based UI Architectures for the Web
Component Based UI Architectures for the WebComponent Based UI Architectures for the Web
Component Based UI Architectures for the Web
 
Client-Side Performance Monitoring (MobileTea, Rome)
Client-Side Performance Monitoring (MobileTea, Rome)Client-Side Performance Monitoring (MobileTea, Rome)
Client-Side Performance Monitoring (MobileTea, Rome)
 
Effectively Monitoring Client-Side Performance
Effectively Monitoring Client-Side PerformanceEffectively Monitoring Client-Side Performance
Effectively Monitoring Client-Side Performance
 
Why Static Type Checking is Better
Why Static Type Checking is BetterWhy Static Type Checking is Better
Why Static Type Checking is Better
 
The Complementarity of React and Web Components
The Complementarity of React and Web ComponentsThe Complementarity of React and Web Components
The Complementarity of React and Web Components
 
Web Components + Backbone: a Game-Changing Combination
Web Components + Backbone: a Game-Changing CombinationWeb Components + Backbone: a Game-Changing Combination
Web Components + Backbone: a Game-Changing Combination
 
Bem methodology
Bem methodologyBem methodology
Bem methodology
 
Web Components and Modular CSS
Web Components and Modular CSSWeb Components and Modular CSS
Web Components and Modular CSS
 

Better PHP-Frontend Integration with Tungsten.js