All Projects → gajus → Usus

gajus / Usus

Licence: other
Webpage pre-rendering service. ⚡️

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Usus

universal-react-relay-starter-kit
A starter kit for React in combination with Relay including a GraphQL server, server side rendering, code splitting, i18n, SEO.
Stars: ✭ 14 (-98.26%)
Mutual labels:  isomorphic, universal, seo
Universal
Seed project for Angular Universal apps featuring Server-Side Rendering (SSR), Webpack, CLI scaffolding, dev/prod modes, AoT compilation, HMR, SCSS compilation, lazy loading, config, cache, i18n, SEO, and TSLint/codelyzer
Stars: ✭ 669 (-16.79%)
Mutual labels:  universal, isomorphic, seo
Jackblog React
Jackblog react 版, 个人博客系统, 使用服务端渲染(Universal / Isomorphic), react, redux, react-router, react-bootstrap, immutablejs, redux-form等
Stars: ✭ 292 (-63.68%)
Mutual labels:  universal, isomorphic
Isomorphic Webpack
Abstracts universal consumption of application code base using webpack.
Stars: ✭ 294 (-63.43%)
Mutual labels:  universal, isomorphic
Vortigern
A universal boilerplate for building web applications w/ TypeScript, React, Redux, Server Side Rendering and more.
Stars: ✭ 647 (-19.53%)
Mutual labels:  universal, isomorphic
react-seo-friendly-spa-template
React PWA/SPA template initially scaffolded with CRA (Create React App) and configured for SEO. Makes use of prerendering and other techniques/packages in order to achieve a perfect "Lighthouse Score".
Stars: ✭ 24 (-97.01%)
Mutual labels:  seo, prerender
Universal Nest
Nest + Angular Universal = ❤️ by @TrilonIO
Stars: ✭ 258 (-67.91%)
Mutual labels:  universal, prerender
Hackernews
HackerNews clone built with Nuxt.js
Stars: ✭ 758 (-5.72%)
Mutual labels:  universal, isomorphic
react-ssr-spa
Server side rendered single page app using reactjs official libraries.
Stars: ✭ 30 (-96.27%)
Mutual labels:  isomorphic, universal
React Server
🚀 Blazing fast page load and seamless navigation.
Stars: ✭ 3,932 (+389.05%)
Mutual labels:  universal, isomorphic
Prep
Pre-renders your web app (React, Vue, Angular, ...) into static HTML based on your specified routes enabling SEO for single page applications.
Stars: ✭ 371 (-53.86%)
Mutual labels:  seo, prerender
React Snap
👻 Zero-configuration framework-agnostic static prerendering for SPAs
Stars: ✭ 4,565 (+467.79%)
Mutual labels:  seo, prerender
angular-rollup-starter
Angular2 & Rollup.js including AoT and Universal Prerendering
Stars: ✭ 33 (-95.9%)
Mutual labels:  universal, prerender
Go Starter Kit
[abandoned] Golang isomorphic react/hot reloadable/redux/css-modules/SSR starter kit
Stars: ✭ 2,855 (+255.1%)
Mutual labels:  universal, isomorphic
FlipED
A LMS built specifically for Thailand's Education 4.0 system.
Stars: ✭ 24 (-97.01%)
Mutual labels:  isomorphic, universal
Isomorphic React
A simple but powerful React application built on a standards-compliant back-end
Stars: ✭ 318 (-60.45%)
Mutual labels:  universal, isomorphic
Catberry
Catberry is an isomorphic framework for building universal front-end apps using components, Flux architecture and progressive rendering.
Stars: ✭ 793 (-1.37%)
Mutual labels:  universal, isomorphic
react-ssr-starter
📚 Featuring Webpack 4, React 17-18, SSR, HMR, prefetching, universal lazy-loading, and more
Stars: ✭ 18 (-97.76%)
Mutual labels:  isomorphic, universal
webpack-isomorphic-compiler
A compiler that makes your life easier if you are building isomorphic webpack powered apps, that is, single page applications with server-side rendering
Stars: ✭ 16 (-98.01%)
Mutual labels:  isomorphic, universal
Ngx Meta
Dynamic page title & meta tags utility for Angular (w/server-side rendering)
Stars: ✭ 331 (-58.83%)
Mutual labels:  universal, seo

ūsus

Travis build status Coveralls NPM version Canonical Code Style Twitter Follow

Webpage pre-rendering service. ⚡️

Deprecated

Deprecated in favour of https://github.com/GoogleChrome/rendertron

The two projects are not functionally interchangeable. However, the overlap is significant enough to discourage the duplication of effort.

Future releases of ūsus will be limited to bug fixes.

Features

  • Renders webpage using the Chrome Debugging Protocol (CDP).
  • Extracts CSS used to render the page.
  • Renders HTML with the blocking CSS made asynchronous.
  • Inlines the critical CSS.
  • Preloads CSS and fonts used to render the page using rel=preload.

Motivation

Static HTML pages with inline CSS load faster and are better indexed than single page applications (SPA). ūsus pre-renders single page applications into static HTML with the critical CSS inlined.

Removing the blocking CSS and inlining the CSS required to render the page increases the perceived page loading speed. Presumably, improves SEO by reducing the page loading time.

Read Pre-rendering SPA for SEO and improved perceived page loading speed.

Demo

Examples of web pages using ūsus:

Use cases

  • Produce HTML used to render the page. Used to render single page applications (e.g. React and Angular) to produce a static HTML. This can be used as a replacement of https://prerender.io/. Default behaviour.
  • Extract CSS used to render a specific page. Used to capture the critical CSS. Use --extractStyles option.
  • Produce HTML used to render the page with the critical-path CSS inlined and blocking CSS made asynchronous. Use --inlineStyles option.

Node.js API

ūsus can be used either as a Node.js dependency or as a CLI program.

import {
  render
} from 'usus';

/**
 * @see https://github.com/gajus/usus#configuration
 */
const configuration: UserConfigurationType = {}

const css = await render('http://gajus.com/', configuration);

Configuration

// Flow type annotations included for user reference only.
// ūsus does not depend or require use of Flow type.
//
// Refer to the table below for an alternative form of documentation.

type CookieType = {|
  +name: string,
  +value: string
|};

export type UserDeviceMetricsOverrideType = {
  +deviceScaleFactor?: number,
  +fitWindow?: boolean,
  +height?: number,
  +mobile?: boolean,
  +width?: number
};

type FormatStylesType = (styles: string) => Promise<string>;

export type UserConfigurationType = {
  +chromePort?: number,
  +cookies?: $ReadOnlyArray<CookieType>,
  +delay?: number,
  +deviceMetricsOverride?: UserDeviceMetricsOverrideType,
  +extractStyles?: boolean,
  +formatStyles?: FormatStylesType,
  +inlineStyles?: boolean,
  +preloadFonts?: boolean,
  +preloadStyles?: boolean
};

The default behaviour is to return the HTML.

  • Using the --extractStyles option returns the CSS used to render the document.
  • Using the --inlineStyles option returns HTML document with CSS inlined.
Name Type Description Default value
chromePort number Port of an existing Chrome instance. See Controlling the Chrome instance. N/A
cookies Array<{name: string, value: string}> Sets a cookie with the given cookie data. N/A
delay number Defines how many milliseconds to wait after the "load" event has been fired before capturing the styles used to load the page. This is important if resources appearing on the page are being loaded asynchronously. number
deviceMetricsOverride See deviceMetricsOverride configuration
extractStyles boolean Extracts CSS used to render the page. false
formatStyles (styles: string) => Promise<string> Used to format CSS. Useful with inlineStyles=true option to format the CSS before it is inlined. N/A
inlineStyles boolean Inlines the styles required to render the document. false
preloadFonts boolean Adds rel=preload for all fonts required to render the page. true
preloadStyles boolean Adds rel=preload for all styles removed from <head>. Used with inlineStyles=true. true
url string The URL to render. N/A

deviceMetricsOverride configuration

Name Type Description Default value
deviceScaleFactor number Overriding device scale factor value. 1
fitWindow boolean Whether a view that exceeds the available browser window area should be scaled down to fit. false
height number Overriding width value in pixels (minimum 0, maximum 10000000). 1080
width number Overriding height value in pixels (minimum 0, maximum 10000000). 1920
mobile boolean Whether to emulate mobile device. This includes viewport meta tag, overlay scrollbars, text autosizing and more. false

For more information about the deviceMetricsOverride configuration, refer to Chrome DevTools Protocol Viewer documentation.

Installation

Using ūsus requires to install usus NPM package and Google Chrome browser (refer to Dependencies).

Dependencies

ūsus depends on Chrome v59+.

For Docker installation instructions, refer to Building Docker container with Chrome.

Cookbook

Using via the command line interface (CLI)

$ npm install usus --global
$ usus --help
# usus <command> --help
$ usus render --help
# Renders static HTML. Equivalent to https://prerender.io/.
$ usus render --url http://gajus.com/
# Inlines styles required to render the page.
$ usus render --url http://gajus.com/ --inlineStyles true
# Use cookies when loading the page.
$ usus render --url http://gajus.com/ --cookies foo=bar,baz=qux
# Render emulating a mobile device (example is using iPhone 6 parameters).
$ usus render --url http://gajus.com/ --deviceMetricsOverride.deviceScaleFactor 2 --deviceMetricsOverride.fitWindow false --deviceMetricsOverride.height 1334 --deviceMetricsOverride.mobile true --deviceMetricsOverride.width 750

Building Docker container with Chrome

Add the following line to your Dockerfile:

RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
  && sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
  && apt-get update -y \
  && apt-get install google-chrome-stable -y

This assumes that you are extending from the base node image.

Controlling the Chrome instance

By default, ūsus creates a new instance of Chrome for every render operation and destroys it after completion. However, you can start Chrome independent of ūsus and re-use the same instance for multiple renderings.

import {
  launchChrome,
  render
} from 'usus';

const chrome = await launchChrome();

await render('https://go2cinema.com/movies/baywatch-2017-1198354', {
  chromePort: chrome.port,
  inlineStyles: true
});

await render('https://go2cinema.com/movies/baby-driver-2017-2257838', {
  chromePort: chrome.port,
  inlineStyles: true
});

await chrome.kill();

launchChrome is a convenience method to launch Chrome using default ūsus configuration. If you need granular control over how Chrome is launched, refer to the chrome-launcher program.

Minifying the CSS

Use the formatStyles callback to minify/ format/ optimize/ remove CSS before it is inlined.

In this example, I am using csso minifier.

import {
  render
} from 'usus';
import {
  minify
} from 'csso';

await render(url, {
  formatStyles: (styles: string): Promise<string> => {
    return minify(styles).css;
  },
  inlineStyles: true
});

Debugging

Export DEBUG=usus variable to get additional debugging information, e.g.

$ export DEBUG=usus*
$ usus --url http://gajus.com

Implementation

ūsus uses Chrome Debugging Protocol CSS coverage report to generate a stylesheet used to render the document.

Alternatives

The following programs provide equivalent service:

All of these programs are using PhantomJS or JSDom to render the page/ evaluate the scripts.

ūsus is different because it is using Chrome Debugging Protocol and it leverages the Chrome CSS coverage report to generate a stylesheet used to render the document.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].