All Projects → addyosmani → Critical

addyosmani / Critical

Licence: apache-2.0
Extract & Inline Critical-path CSS in HTML pages

Programming Languages

javascript
184084 projects - #8 most used programming language
HTML
75241 projects
CSS
56736 projects

Projects that are alternatives of or similar to Critical

critical-plugin
⚙️ Critical plugin for webpack (https://webpack.js.org/)
Stars: ✭ 17 (-99.82%)
Mutual labels:  inline-css, inline-styles, critical-css, critical-path-css, critical-path-styles
inline.js
Live CSS Helpers with Javascript
Stars: ✭ 36 (-99.62%)
Mutual labels:  inline-css, inline-styles
stylenames
A simple JavaScript utility for conditionally joining inline styles together
Stars: ✭ 18 (-99.81%)
Mutual labels:  inline-css, inline-styles
InlineCssParser
A Visual Studio Extension that helps to extract inline styles into a seperate css file.
Stars: ✭ 23 (-99.75%)
Mutual labels:  inline-css, inline-styles
gulp-penthouse
Gulp plugin for extracting critical path css
Stars: ✭ 14 (-99.85%)
Mutual labels:  critical-css
crittr
High performance critical css extraction with a great configuration abilities
Stars: ✭ 39 (-99.58%)
Mutual labels:  critical-css
postcss-critical-css
PostCSS plugin to define and output critical CSS using custom atRules, and/or custom CSS properties. Critical CSS may be output to one or more files, as defined within the plugin options or within the CSS.
Stars: ✭ 84 (-99.1%)
Mutual labels:  critical-css
react-critical-css
Extracts your critical CSS.
Stars: ✭ 18 (-99.81%)
Mutual labels:  critical-css
Polished
A lightweight toolset for writing styles in JavaScript ✨
Stars: ✭ 7,074 (-24.46%)
Mutual labels:  inline-styles
Responsive Html Email Signature
Template generator for (responsive) emails & email signatures ✨
Stars: ✭ 525 (-94.39%)
Mutual labels:  inline-styles
athlete
💪 type safe elm-html-css-builder aka athlete
Stars: ✭ 60 (-99.36%)
Mutual labels:  inline-css
vue-grid
A powerful flexbox grid system for Vue.js 2.x, built with inline-styles
Stars: ✭ 23 (-99.75%)
Mutual labels:  inline-styles
React Magic
A collection of magic animations for react components.
Stars: ✭ 264 (-97.18%)
Mutual labels:  inline-styles
Css In Js Benchmarks
Stars: ✭ 360 (-96.16%)
Mutual labels:  inline-styles
used-styles
📝All the critical styles you've used to render a page.
Stars: ✭ 100 (-98.93%)
Mutual labels:  critical-css
React Timekeeper
Google Keep app inspired time picker for react 🕓
Stars: ✭ 651 (-93.05%)
Mutual labels:  inline-styles
alter.email
Transform your HTML emails.
Stars: ✭ 66 (-99.3%)
Mutual labels:  inline-css
critical-css-widget
A browser widget to extract Critical CSS and Full CSS from a page. Can be used via the browser console.
Stars: ✭ 35 (-99.63%)
Mutual labels:  critical-css
Html Inline Css Webpack Plugin
☄️ A webpack plugin for convert external stylesheet to the embedded stylesheet
Stars: ✭ 48 (-99.49%)
Mutual labels:  inline-styles
Animate Components
✨ Elemental components for doing animations in React
Stars: ✭ 908 (-90.3%)
Mutual labels:  inline-styles

NPM version Build Status dependencies Status devDependencies Status Coverage

critical

Critical extracts & inlines critical-path (above-the-fold) CSS from HTML

Preview

Install

npm i -D critical

Build plugins

Demo projects

Usage

Include:

const critical = require('critical');

Full blown example with available options:

critical.generate({
  // Inline the generated critical-path CSS
  // - true generates HTML
  // - false generates CSS
  inline: true,

  // Your base directory
  base: 'dist/',

  // HTML source
  html: '<html>...</html>',

  // HTML source file
  src: 'index.html',

  // Your CSS Files (optional)
  css: ['dist/styles/main.css'],

  // Viewport width
  width: 1300,

  // Viewport height
  height: 900,

  // Output results to file
  target: {
    css: 'critical.css',
    html: 'index-critical.html',
    uncritical: 'uncritical.css',
  },

  // Extract inlined styles from referenced stylesheets
  extract: true,

  // ignore CSS rules
  ignore: {
    atrule: ['@font-face'],
    rule: [/some-regexp/],
    decl: (node, value) => /big-image\.png/.test(value),
  },
});

Generate and inline critical-path CSS

Basic usage:

critical.generate({
  inline: true,
  base: 'test/',
  src: 'index.html',
  target: 'index-critical.html',
  width: 1300,
  height: 900,
});

Generate critical-path CSS

Basic usage:

critical.generate({
  base: 'test/',
  src: 'index.html',
  target: 'styles/main.css',
  width: 1300,
  height: 900,
});

Generate and minify critical-path CSS:

critical.generate({
  base: 'test/',
  src: 'index.html',
  target: 'styles/styles.min.css',
  width: 1300,
  height: 900,
});

Generate, minify and inline critical-path CSS:

critical.generate({
  inline: true,
  base: 'test/',
  src: 'index.html',
  target: {
    html: 'index-critical.html',
    css: 'critical.css',
  },
  width: 1300,
  height: 900,
});

Generate and return output via callback:

critical.generate({
    base: 'test/',
    src: 'index.html',
    width: 1300,
    height: 900,
    inline: true
}, (err, ({css, html, uncritical})) => {
    // You now have critical-path CSS as well as the modified HTML.
    // Works with and without target specified.
    ...
});

Generate and return output via promise:

critical.generate({
    base: 'test/',
    src: 'index.html',
    width: 1300,
    height: 900
}).then((({css, html, uncritical})) => {
    // You now have critical-path CSS as well as the modified HTML.
    // Works with and without target specified.
    ...
}).error(err => {
    ...
});

Generate and return output via async function:

const {css, html, uncritical} = await critical.generate({
  base: 'test/',
  src: 'index.html',
  width: 1300,
  height: 900,
});

Generate critical-path CSS with multiple resolutions

When your site is adaptive and you want to deliver critical CSS for multiple screen resolutions this is a useful option. note: (your final output will be minified as to eliminate duplicate rule inclusion)

critical.generate({
  base: 'test/',
  src: 'index.html',
  target: {
    css: 'styles/main.css',
  },
  dimensions: [
    {
      height: 200,
      width: 500,
    },
    {
      height: 900,
      width: 1200,
    },
  ],
});

Generate critical-path CSS and ignore specific selectors

This is a useful option when you e.g. want to defer loading of webfonts or background images.

critical.generate({
  base: 'test/',
  src: 'index.html',
  target: {
    css: 'styles/main.css',
  },
  ignore: {
    atrule: ['@font-face'],
    decl: (node, value) => /url\(/.test(value),
  },
});

Generate critical-path CSS and specify asset rebase behaviour

critical.generate({
  base: 'test/',
  src: 'index.html',
  target: {
    css: 'styles/main.css',
  },
  rebase: {
    from: '/styles/main.css',
    to: '/folder/subfolder/index.html',
  },
});
critical.generate({
  base: 'test/',
  src: 'index.html',
  target: {
    css: 'styles/main.css',
  },
  rebase: asset => `https://my-cdn.com${asset.absolutePath}`,
});

Options

Name Type Default Description
inline boolean|object false Inline critical-path CSS using filamentgroup's loadCSS. Pass an object to configure inline-critical
base string path.dirname(src) or process.cwd() Base directory in which the source and destination are to be written
html string HTML source to be operated against. This option takes precedence over the src option.
css array [] An array of paths to css files, file globs or Vinyl file objects.
src string Location of the HTML source to be operated against
target string or object Location of where to save the output of an operation. Use an object with 'html' and 'css' props if you want to store both
width integer 1300 Width of the target viewport
height integer 900 Height of the target viewport
dimensions array [] An array of objects containing height and width. Takes precedence over width and height if set
extract boolean false Remove the inlined styles from any stylesheets referenced in the HTML. It generates new references based on extracted content so it's safe to use for multiple HTML files referencing the same stylesheet. Use with caution. Removing the critical CSS per page results in a unique async loaded CSS file for every page. Meaning you can't rely on cache across multiple pages
inlineImages boolean false Inline images
assetPaths array [] List of directories/urls where the inliner should start looking for assets
maxImageFileSize integer 10240 Sets a max file size (in bytes) for base64 inlined images
rebase object or function undefined Critical tries it's best to rebase the asset paths relative to the document. If this doesn't work as expected you can always use this option to control the rebase paths. See postcss-url for details. (https://github.com/pocketjoso/penthouse#usage-1).
ignore array object undefined
userAgent string '' User agent to use when fetching a remote src
penthouse object {} Configuration options for penthouse.
request object {} Configuration options for got.
user string undefined RFC2617 basic authorization: user
pass string undefined RFC2617 basic authorization: pass
strict boolean false Throw an error if no css is found

CLI

npm install -g critical

critical works well with standard input.

cat test/fixture/index.html | critical --base test/fixture --inline > index.critical.html

Or on Windows:

type test\fixture\index.html | critical --base test/fixture --inline > index.critical.html

You can also pass in the critical CSS file as an option.

critical test/fixture/index.html --base test/fixture > critical.css

Gulp

const gulp = require('gulp');
const log = require('fancy-log');
const critical = require('critical').stream;

// Generate & Inline Critical-path CSS
gulp.task('critical', () => {
  return gulp
    .src('dist/*.html')
    .pipe(
      critical({
        base: 'dist/',
        inline: true,
        css: ['dist/styles/components.css', 'dist/styles/main.css'],
      })
    )
    .on('error', err => {
      log.error(err.message);
    })
    .pipe(gulp.dest('dist'));
});

Why?

Why is critical-path CSS important?

CSS is required to construct the render tree for your pages and JavaScript will often block on CSS during initial construction of the page. You should ensure that any non-essential CSS is marked as non-critical (e.g. print and other media queries), and that the amount of critical CSS and the time to deliver it is as small as possible.

Why should critical-path CSS be inlined?

For best performance, you may want to consider inlining the critical CSS directly into the HTML document. This eliminates additional roundtrips in the critical path and if done correctly can be used to deliver a “one roundtrip” critical path length where only the HTML is a blocking resource.

FAQ

Are there any sample projects available using Critical?

Why, yes!. Take a look at this Gulp project which demonstrates using Critical to generate and inline critical-path CSS. It also includes a mini-tutorial that walks through how to use it in a simple webapp.

When should I just use Penthouse directly?

The main differences between Critical and Penthouse, a module we use, are:

  • Critical will automatically extract stylesheets from your HTML from which to generate critical-path CSS from, whilst other modules generally require you to specify this upfront.
  • Critical provides methods for inlining critical-path CSS (a common logical next-step once your CSS is generated)
  • Since we tackle both generation and inlining, we're able to abstract away some of the ugly boilerplate otherwise involved in tackling these problems separately.

That said, if your site or app has a large number of styles or styles which are being dynamically injected into the DOM (sometimes common in Angular apps) I recommend using Penthouse directly. It will require you to supply styles upfront, but this may provide a higher level of accuracy if you find Critical isn't serving your needs.

What other alternatives to Critical are available?

FilamentGroup maintain a criticalCSS node module, which similar to Penthouse will find and output the critical-path CSS for your pages. The PageSpeed Optimization modules for nginx, apache, IIS, ATS, and Open Lightspeed can do all the heavy lifting automatically when you enable the prioritize_critical_css filter

Is Critical stable and suitable for production use?

Critical has been used on a number of production sites that have found it stable for everyday use. That said, we welcome you to try it out on your project and report bugs if you find them.

Can I contribute?

Of course. We appreciate all of our contributors and welcome contributions to improve the project further. If you're uncertain whether an addition should be made, feel free to open up an issue and we can discuss it.

Maintainers

This module is brought to you and maintained by the following people:

License

Apache-2.0 © Addy Osmani, Ben Zörb

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].