Skip to content

Repository files navigation

CRITICAL PATH GENERATOR

npmjsrNPM Downloadsscreenshot

Critical path generator tools using node oe the web browser.

Web browser script

Extract critical CSS path for the current viewport in the current page.

Using modules

<scripttype="module">import{parse,render}from'https://esm.sh/@tbela99/css-parser@0.7.1/web';import{extract}from'https://esm.sh/@tbela99/critical@1.2.0/browser';constresults=awaitextract({fonts: true});// css is optimized using https://www.npmjs.com/package/@tbela99/css-parser// pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);</script>

Without using modules

<scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/critical@1.2.0/dist/browser-umd.js"></script><scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/css-parser@0.7.1/dist/index-umd-web.js"></script><script>(async()=>{const{parse, render}=CSSParser;constresults=awaitcritical.extract({fonts: true});// optimize and pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);})();</script>

Options

  • options: object
    • fonts: bool? generate Javascript to load web fonts dynamically
    • html: bool? generate an HTML page containing inlined critical css
    • signal: AbortSignal? abort critical extraction using AbortSignal

Limitations

The web browser script is subject to the same origin policy and CSP. This can prevent the script from reading external stylesheets.

Node script

Generate critical CSS path from your nodejs script

import{critical}from"@tbela99/critical";consturls=['http://github.com','https://docs.npmjs.com/cli/v8/configuring-npm/package-json#directories'];urls.forEach(asyncurl=>critical(url,{html: true,console: true,screenshot: true,secure: false,// dimensions can be specified as an array of string or objectdimensions: ['1400x900','1200x675','992x558'],advanced: true}).then((results)=>{// print extracted CSSconsole.log(results.styles.join('\n'));}));

Node script options

  • options: object

    browser settings

    • headless: bool. start the browser in headless mode. default true
    • browser: string. browser to use [choices: "chromium", "firefox", "webkit", "edge", "chrome"] default "chromium"
    • browserType: string. use a desktop or mobile browser [choices: 'desktop', 'mobile']
    • randomBrowser: use a random web browser
    • randomUserAgent: bool. use a random user agent

    runtime settings

    • container: bool. turn off additional security features, required to run inside a container
    • secure: bool. enforce browser security features such as CSP and same origin policy. default false

    screenshots settings

    • screenshot: bool. generate screenshot for each viewport mentioned. default false
    • colorScheme: string. force a color scheme [choices: 'dark', 'light']
    • filename: string. prefix of the generated files
    • width: int. viewport width. default 800
    • height: int. viewport height. default 600
    • dimensions: array or string. array of viewports. this takes precedence over height and width. viewports can be specified as objects with width and height property or a string.

    input settings

    • input: string. specify HTML input
    • base: string. specify HTML of the HTML input

    output settings

    • base: string. specify HTML for URL
    • html: bool. generate an HTML page containing the inlined critical css
    • output: string. change output directory. default './output/'
    • fonts: bool. generate javascript to load web fonts. default true
    • json: bool. dump result as JSON
    • advanced: bool. remove parts of css selectors that do not match any element. default false

    debugging settings

    • console: bool. log console messages from the pages. default true
    • verbose: bool. enable verbose mode

Command line script

Use with npx

$ npx @tbela99/critical@latest --help
$ npx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Use with bun

$ bunx @tbela99/critical@latest --help
$ bunx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Install from npm

$ npm install @tbela99/critical

Install from jsr

install for deno specific project

$ deno add @tbela99/critical

Install globally

when installed globally, it is available as critical-cli

$ npm install -g @tbela99/critical
$ critical-cli -i http://google.com

Usage

$ critical-cli.js [options+] url [url+]
run the command line tools:
Example: critical-cli.js -d 800x600 -d 1024x768 -i https://facebook.com
Options:
--help Show help [boolean]
--version Show version number [boolean]
-t, --headless enable or disable headless mode[boolean] [default: true]
-g, --base base path using reading data from stdin [string]
-b, --browser browser to use
[string] [choices: "chromium", "firefox", "webkit", "edge", "chrome"] [default
:"chromium"]
-k, --browser-type use a mobile browser
[string] [choices: "mobile", "desktop"]
-r, --random-browser use a random browser [boolean] [default: false]
-u, --random-user-agent use a random user agent [boolean] [default: false]
-i, --screenshot Generate screenshots [boolean]
-s, --secure enable or disable security settings such as CSP and same
origin policy [boolean]
-m, --color-scheme color scheme
[string] [choices: "light", "dark"] [default: "dark"]
-o, --output Output directory [string]
-n, --filename prefix of the generated files [string]
-w, --width Viewport width [number]
-a, --height Viewport height [number]
-d, --dimensions Array of viewports, override height/width settings
[array]
-f, --fonts Generate javascript to load fonts dynamically
[boolean] [default: true]
-l, --console Show console messages from the browser [boolean]
-c, --container Disable additional security settings to run inside a con
tainer [boolean]
-p, --html Generate an HTML page containing inlined critical css
[boolean]
--json print result in JSON format [boolean] [default: false]
-e, --advanced remove parts of css selectors that do not match any elem
ent [boolean] [default: false]
-v, --verbose Enable verbose mode [boolean] [default: false]

Example

Read data from URL

$ critical-cli https://github.com/ https://nodejs.org --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from file(s)

$ critical-cli pages/dashboard.html pages/404.html --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from STDIN

$ cat pages/dashboard.html | critical-cli --base=pages/ --secure=no -i -d '1440x900' -d '1366x768' --json

CHANGELOG

V1.2.0

  • accept files parameters in addition to urls
  • add missing cli argument 'random-user-agent'

V1.1.1

  • fix node 22 compatibility issues
  • publish to jsr.io

V1.1.0

  • read data from STDIN
  • remove unused selectors
  • dump cli result as JSON

V1.0.1

  • fix package.json dependencies and dev dependencies mix up

V1.0.0

  • converted to typescript
  • changed default export to es module
  • optimized generated css (merge rule, remove duplicate, minify, generate nested css)
  • specify color scheme [dark/light]

About

Generate critical CSS path from HTML pages to enable instantaneous rendering

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - tbela99/critical: Generate critical CSS path from HTML pages to enable instantaneous rendering · GitHub
Skip to content

Repository files navigation

CRITICAL PATH GENERATOR

npmjsrNPM Downloadsscreenshot

Critical path generator tools using node oe the web browser.

Web browser script

Extract critical CSS path for the current viewport in the current page.

Using modules

<scripttype="module">import{parse,render}from'https://esm.sh/@tbela99/css-parser@0.7.1/web';import{extract}from'https://esm.sh/@tbela99/critical@1.2.0/browser';constresults=awaitextract({fonts: true});// css is optimized using https://www.npmjs.com/package/@tbela99/css-parser// pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);</script>

Without using modules

<scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/critical@1.2.0/dist/browser-umd.js"></script><scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/css-parser@0.7.1/dist/index-umd-web.js"></script><script>(async()=>{const{parse, render}=CSSParser;constresults=awaitcritical.extract({fonts: true});// optimize and pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);})();</script>

Options

  • options: object
    • fonts: bool? generate Javascript to load web fonts dynamically
    • html: bool? generate an HTML page containing inlined critical css
    • signal: AbortSignal? abort critical extraction using AbortSignal

Limitations

The web browser script is subject to the same origin policy and CSP. This can prevent the script from reading external stylesheets.

Node script

Generate critical CSS path from your nodejs script

import{critical}from"@tbela99/critical";consturls=['http://github.com','https://docs.npmjs.com/cli/v8/configuring-npm/package-json#directories'];urls.forEach(asyncurl=>critical(url,{html: true,console: true,screenshot: true,secure: false,// dimensions can be specified as an array of string or objectdimensions: ['1400x900','1200x675','992x558'],advanced: true}).then((results)=>{// print extracted CSSconsole.log(results.styles.join('\n'));}));

Node script options

  • options: object

    browser settings

    • headless: bool. start the browser in headless mode. default true
    • browser: string. browser to use [choices: "chromium", "firefox", "webkit", "edge", "chrome"] default "chromium"
    • browserType: string. use a desktop or mobile browser [choices: 'desktop', 'mobile']
    • randomBrowser: use a random web browser
    • randomUserAgent: bool. use a random user agent

    runtime settings

    • container: bool. turn off additional security features, required to run inside a container
    • secure: bool. enforce browser security features such as CSP and same origin policy. default false

    screenshots settings

    • screenshot: bool. generate screenshot for each viewport mentioned. default false
    • colorScheme: string. force a color scheme [choices: 'dark', 'light']
    • filename: string. prefix of the generated files
    • width: int. viewport width. default 800
    • height: int. viewport height. default 600
    • dimensions: array or string. array of viewports. this takes precedence over height and width. viewports can be specified as objects with width and height property or a string.

    input settings

    • input: string. specify HTML input
    • base: string. specify HTML of the HTML input

    output settings

    • base: string. specify HTML for URL
    • html: bool. generate an HTML page containing the inlined critical css
    • output: string. change output directory. default './output/'
    • fonts: bool. generate javascript to load web fonts. default true
    • json: bool. dump result as JSON
    • advanced: bool. remove parts of css selectors that do not match any element. default false

    debugging settings

    • console: bool. log console messages from the pages. default true
    • verbose: bool. enable verbose mode

Command line script

Use with npx

$ npx @tbela99/critical@latest --help
$ npx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Use with bun

$ bunx @tbela99/critical@latest --help
$ bunx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Install from npm

$ npm install @tbela99/critical

Install from jsr

install for deno specific project

$ deno add @tbela99/critical

Install globally

when installed globally, it is available as critical-cli

$ npm install -g @tbela99/critical
$ critical-cli -i http://google.com

Usage

$ critical-cli.js [options+] url [url+]
run the command line tools:
Example: critical-cli.js -d 800x600 -d 1024x768 -i https://facebook.com
Options:
--help Show help [boolean]
--version Show version number [boolean]
-t, --headless enable or disable headless mode[boolean] [default: true]
-g, --base base path using reading data from stdin [string]
-b, --browser browser to use
[string] [choices: "chromium", "firefox", "webkit", "edge", "chrome"] [default
:"chromium"]
-k, --browser-type use a mobile browser
[string] [choices: "mobile", "desktop"]
-r, --random-browser use a random browser [boolean] [default: false]
-u, --random-user-agent use a random user agent [boolean] [default: false]
-i, --screenshot Generate screenshots [boolean]
-s, --secure enable or disable security settings such as CSP and same
origin policy [boolean]
-m, --color-scheme color scheme
[string] [choices: "light", "dark"] [default: "dark"]
-o, --output Output directory [string]
-n, --filename prefix of the generated files [string]
-w, --width Viewport width [number]
-a, --height Viewport height [number]
-d, --dimensions Array of viewports, override height/width settings
[array]
-f, --fonts Generate javascript to load fonts dynamically
[boolean] [default: true]
-l, --console Show console messages from the browser [boolean]
-c, --container Disable additional security settings to run inside a con
tainer [boolean]
-p, --html Generate an HTML page containing inlined critical css
[boolean]
--json print result in JSON format [boolean] [default: false]
-e, --advanced remove parts of css selectors that do not match any elem
ent [boolean] [default: false]
-v, --verbose Enable verbose mode [boolean] [default: false]

Example

Read data from URL

$ critical-cli https://github.com/ https://nodejs.org --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from file(s)

$ critical-cli pages/dashboard.html pages/404.html --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from STDIN

$ cat pages/dashboard.html | critical-cli --base=pages/ --secure=no -i -d '1440x900' -d '1366x768' --json

CHANGELOG

V1.2.0

  • accept files parameters in addition to urls
  • add missing cli argument 'random-user-agent'

V1.1.1

  • fix node 22 compatibility issues
  • publish to jsr.io

V1.1.0

  • read data from STDIN
  • remove unused selectors
  • dump cli result as JSON

V1.0.1

  • fix package.json dependencies and dev dependencies mix up

V1.0.0

  • converted to typescript
  • changed default export to es module
  • optimized generated css (merge rule, remove duplicate, minify, generate nested css)
  • specify color scheme [dark/light]

About

Generate critical CSS path from HTML pages to enable instantaneous rendering

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tbela99/critical: Generate critical CSS path from HTML pages to enable instantaneous rendering · GitHub
Skip to content

Repository files navigation

CRITICAL PATH GENERATOR

npmjsrNPM Downloadsscreenshot

Critical path generator tools using node oe the web browser.

Web browser script

Extract critical CSS path for the current viewport in the current page.

Using modules

<scripttype="module">import{parse,render}from'https://esm.sh/@tbela99/css-parser@0.7.1/web';import{extract}from'https://esm.sh/@tbela99/critical@1.2.0/browser';constresults=awaitextract({fonts: true});// css is optimized using https://www.npmjs.com/package/@tbela99/css-parser// pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);</script>

Without using modules

<scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/critical@1.2.0/dist/browser-umd.js"></script><scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/css-parser@0.7.1/dist/index-umd-web.js"></script><script>(async()=>{const{parse, render}=CSSParser;constresults=awaitcritical.extract({fonts: true});// optimize and pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);})();</script>

Options

  • options: object
    • fonts: bool? generate Javascript to load web fonts dynamically
    • html: bool? generate an HTML page containing inlined critical css
    • signal: AbortSignal? abort critical extraction using AbortSignal

Limitations

The web browser script is subject to the same origin policy and CSP. This can prevent the script from reading external stylesheets.

Node script

Generate critical CSS path from your nodejs script

import{critical}from"@tbela99/critical";consturls=['http://github.com','https://docs.npmjs.com/cli/v8/configuring-npm/package-json#directories'];urls.forEach(asyncurl=>critical(url,{html: true,console: true,screenshot: true,secure: false,// dimensions can be specified as an array of string or objectdimensions: ['1400x900','1200x675','992x558'],advanced: true}).then((results)=>{// print extracted CSSconsole.log(results.styles.join('\n'));}));

Node script options

  • options: object

    browser settings

    • headless: bool. start the browser in headless mode. default true
    • browser: string. browser to use [choices: "chromium", "firefox", "webkit", "edge", "chrome"] default "chromium"
    • browserType: string. use a desktop or mobile browser [choices: 'desktop', 'mobile']
    • randomBrowser: use a random web browser
    • randomUserAgent: bool. use a random user agent

    runtime settings

    • container: bool. turn off additional security features, required to run inside a container
    • secure: bool. enforce browser security features such as CSP and same origin policy. default false

    screenshots settings

    • screenshot: bool. generate screenshot for each viewport mentioned. default false
    • colorScheme: string. force a color scheme [choices: 'dark', 'light']
    • filename: string. prefix of the generated files
    • width: int. viewport width. default 800
    • height: int. viewport height. default 600
    • dimensions: array or string. array of viewports. this takes precedence over height and width. viewports can be specified as objects with width and height property or a string.

    input settings

    • input: string. specify HTML input
    • base: string. specify HTML of the HTML input

    output settings

    • base: string. specify HTML for URL
    • html: bool. generate an HTML page containing the inlined critical css
    • output: string. change output directory. default './output/'
    • fonts: bool. generate javascript to load web fonts. default true
    • json: bool. dump result as JSON
    • advanced: bool. remove parts of css selectors that do not match any element. default false

    debugging settings

    • console: bool. log console messages from the pages. default true
    • verbose: bool. enable verbose mode

Command line script

Use with npx

$ npx @tbela99/critical@latest --help
$ npx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Use with bun

$ bunx @tbela99/critical@latest --help
$ bunx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Install from npm

$ npm install @tbela99/critical

Install from jsr

install for deno specific project

$ deno add @tbela99/critical

Install globally

when installed globally, it is available as critical-cli

$ npm install -g @tbela99/critical
$ critical-cli -i http://google.com

Usage

$ critical-cli.js [options+] url [url+]
run the command line tools:
Example: critical-cli.js -d 800x600 -d 1024x768 -i https://facebook.com
Options:
--help Show help [boolean]
--version Show version number [boolean]
-t, --headless enable or disable headless mode[boolean] [default: true]
-g, --base base path using reading data from stdin [string]
-b, --browser browser to use
[string] [choices: "chromium", "firefox", "webkit", "edge", "chrome"] [default
:"chromium"]
-k, --browser-type use a mobile browser
[string] [choices: "mobile", "desktop"]
-r, --random-browser use a random browser [boolean] [default: false]
-u, --random-user-agent use a random user agent [boolean] [default: false]
-i, --screenshot Generate screenshots [boolean]
-s, --secure enable or disable security settings such as CSP and same
origin policy [boolean]
-m, --color-scheme color scheme
[string] [choices: "light", "dark"] [default: "dark"]
-o, --output Output directory [string]
-n, --filename prefix of the generated files [string]
-w, --width Viewport width [number]
-a, --height Viewport height [number]
-d, --dimensions Array of viewports, override height/width settings
[array]
-f, --fonts Generate javascript to load fonts dynamically
[boolean] [default: true]
-l, --console Show console messages from the browser [boolean]
-c, --container Disable additional security settings to run inside a con
tainer [boolean]
-p, --html Generate an HTML page containing inlined critical css
[boolean]
--json print result in JSON format [boolean] [default: false]
-e, --advanced remove parts of css selectors that do not match any elem
ent [boolean] [default: false]
-v, --verbose Enable verbose mode [boolean] [default: false]

Example

Read data from URL

$ critical-cli https://github.com/ https://nodejs.org --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from file(s)

$ critical-cli pages/dashboard.html pages/404.html --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from STDIN

$ cat pages/dashboard.html | critical-cli --base=pages/ --secure=no -i -d '1440x900' -d '1366x768' --json

CHANGELOG

V1.2.0

  • accept files parameters in addition to urls
  • add missing cli argument 'random-user-agent'

V1.1.1

  • fix node 22 compatibility issues
  • publish to jsr.io

V1.1.0

  • read data from STDIN
  • remove unused selectors
  • dump cli result as JSON

V1.0.1

  • fix package.json dependencies and dev dependencies mix up

V1.0.0

  • converted to typescript
  • changed default export to es module
  • optimized generated css (merge rule, remove duplicate, minify, generate nested css)
  • specify color scheme [dark/light]

About

Generate critical CSS path from HTML pages to enable instantaneous rendering

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tbela99/critical: Generate critical CSS path from HTML pages to enable instantaneous rendering · GitHub
Skip to content

Repository files navigation

CRITICAL PATH GENERATOR

npmjsrNPM Downloadsscreenshot

Critical path generator tools using node oe the web browser.

Web browser script

Extract critical CSS path for the current viewport in the current page.

Using modules

<scripttype="module">import{parse,render}from'https://esm.sh/@tbela99/css-parser@0.7.1/web';import{extract}from'https://esm.sh/@tbela99/critical@1.2.0/browser';constresults=awaitextract({fonts: true});// css is optimized using https://www.npmjs.com/package/@tbela99/css-parser// pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);</script>

Without using modules

<scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/critical@1.2.0/dist/browser-umd.js"></script><scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/css-parser@0.7.1/dist/index-umd-web.js"></script><script>(async()=>{const{parse, render}=CSSParser;constresults=awaitcritical.extract({fonts: true});// optimize and pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);})();</script>

Options

  • options: object
    • fonts: bool? generate Javascript to load web fonts dynamically
    • html: bool? generate an HTML page containing inlined critical css
    • signal: AbortSignal? abort critical extraction using AbortSignal

Limitations

The web browser script is subject to the same origin policy and CSP. This can prevent the script from reading external stylesheets.

Node script

Generate critical CSS path from your nodejs script

import{critical}from"@tbela99/critical";consturls=['http://github.com','https://docs.npmjs.com/cli/v8/configuring-npm/package-json#directories'];urls.forEach(asyncurl=>critical(url,{html: true,console: true,screenshot: true,secure: false,// dimensions can be specified as an array of string or objectdimensions: ['1400x900','1200x675','992x558'],advanced: true}).then((results)=>{// print extracted CSSconsole.log(results.styles.join('\n'));}));

Node script options

  • options: object

    browser settings

    • headless: bool. start the browser in headless mode. default true
    • browser: string. browser to use [choices: "chromium", "firefox", "webkit", "edge", "chrome"] default "chromium"
    • browserType: string. use a desktop or mobile browser [choices: 'desktop', 'mobile']
    • randomBrowser: use a random web browser
    • randomUserAgent: bool. use a random user agent

    runtime settings

    • container: bool. turn off additional security features, required to run inside a container
    • secure: bool. enforce browser security features such as CSP and same origin policy. default false

    screenshots settings

    • screenshot: bool. generate screenshot for each viewport mentioned. default false
    • colorScheme: string. force a color scheme [choices: 'dark', 'light']
    • filename: string. prefix of the generated files
    • width: int. viewport width. default 800
    • height: int. viewport height. default 600
    • dimensions: array or string. array of viewports. this takes precedence over height and width. viewports can be specified as objects with width and height property or a string.

    input settings

    • input: string. specify HTML input
    • base: string. specify HTML of the HTML input

    output settings

    • base: string. specify HTML for URL
    • html: bool. generate an HTML page containing the inlined critical css
    • output: string. change output directory. default './output/'
    • fonts: bool. generate javascript to load web fonts. default true
    • json: bool. dump result as JSON
    • advanced: bool. remove parts of css selectors that do not match any element. default false

    debugging settings

    • console: bool. log console messages from the pages. default true
    • verbose: bool. enable verbose mode

Command line script

Use with npx

$ npx @tbela99/critical@latest --help
$ npx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Use with bun

$ bunx @tbela99/critical@latest --help
$ bunx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Install from npm

$ npm install @tbela99/critical

Install from jsr

install for deno specific project

$ deno add @tbela99/critical

Install globally

when installed globally, it is available as critical-cli

$ npm install -g @tbela99/critical
$ critical-cli -i http://google.com

Usage

$ critical-cli.js [options+] url [url+]
run the command line tools:
Example: critical-cli.js -d 800x600 -d 1024x768 -i https://facebook.com
Options:
--help Show help [boolean]
--version Show version number [boolean]
-t, --headless enable or disable headless mode[boolean] [default: true]
-g, --base base path using reading data from stdin [string]
-b, --browser browser to use
[string] [choices: "chromium", "firefox", "webkit", "edge", "chrome"] [default
:"chromium"]
-k, --browser-type use a mobile browser
[string] [choices: "mobile", "desktop"]
-r, --random-browser use a random browser [boolean] [default: false]
-u, --random-user-agent use a random user agent [boolean] [default: false]
-i, --screenshot Generate screenshots [boolean]
-s, --secure enable or disable security settings such as CSP and same
origin policy [boolean]
-m, --color-scheme color scheme
[string] [choices: "light", "dark"] [default: "dark"]
-o, --output Output directory [string]
-n, --filename prefix of the generated files [string]
-w, --width Viewport width [number]
-a, --height Viewport height [number]
-d, --dimensions Array of viewports, override height/width settings
[array]
-f, --fonts Generate javascript to load fonts dynamically
[boolean] [default: true]
-l, --console Show console messages from the browser [boolean]
-c, --container Disable additional security settings to run inside a con
tainer [boolean]
-p, --html Generate an HTML page containing inlined critical css
[boolean]
--json print result in JSON format [boolean] [default: false]
-e, --advanced remove parts of css selectors that do not match any elem
ent [boolean] [default: false]
-v, --verbose Enable verbose mode [boolean] [default: false]

Example

Read data from URL

$ critical-cli https://github.com/ https://nodejs.org --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from file(s)

$ critical-cli pages/dashboard.html pages/404.html --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from STDIN

$ cat pages/dashboard.html | critical-cli --base=pages/ --secure=no -i -d '1440x900' -d '1366x768' --json

CHANGELOG

V1.2.0

  • accept files parameters in addition to urls
  • add missing cli argument 'random-user-agent'

V1.1.1

  • fix node 22 compatibility issues
  • publish to jsr.io

V1.1.0

  • read data from STDIN
  • remove unused selectors
  • dump cli result as JSON

V1.0.1

  • fix package.json dependencies and dev dependencies mix up

V1.0.0

  • converted to typescript
  • changed default export to es module
  • optimized generated css (merge rule, remove duplicate, minify, generate nested css)
  • specify color scheme [dark/light]

About

Generate critical CSS path from HTML pages to enable instantaneous rendering

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - tbela99/critical: Generate critical CSS path from HTML pages to enable instantaneous rendering · GitHub
Skip to content

Repository files navigation

CRITICAL PATH GENERATOR

npmjsrNPM Downloadsscreenshot

Critical path generator tools using node oe the web browser.

Web browser script

Extract critical CSS path for the current viewport in the current page.

Using modules

<scripttype="module">import{parse,render}from'https://esm.sh/@tbela99/css-parser@0.7.1/web';import{extract}from'https://esm.sh/@tbela99/critical@1.2.0/browser';constresults=awaitextract({fonts: true});// css is optimized using https://www.npmjs.com/package/@tbela99/css-parser// pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);</script>

Without using modules

<scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/critical@1.2.0/dist/browser-umd.js"></script><scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/css-parser@0.7.1/dist/index-umd-web.js"></script><script>(async()=>{const{parse, render}=CSSParser;constresults=awaitcritical.extract({fonts: true});// optimize and pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);})();</script>

Options

  • options: object
    • fonts: bool? generate Javascript to load web fonts dynamically
    • html: bool? generate an HTML page containing inlined critical css
    • signal: AbortSignal? abort critical extraction using AbortSignal

Limitations

The web browser script is subject to the same origin policy and CSP. This can prevent the script from reading external stylesheets.

Node script

Generate critical CSS path from your nodejs script

import{critical}from"@tbela99/critical";consturls=['http://github.com','https://docs.npmjs.com/cli/v8/configuring-npm/package-json#directories'];urls.forEach(asyncurl=>critical(url,{html: true,console: true,screenshot: true,secure: false,// dimensions can be specified as an array of string or objectdimensions: ['1400x900','1200x675','992x558'],advanced: true}).then((results)=>{// print extracted CSSconsole.log(results.styles.join('\n'));}));

Node script options

  • options: object

    browser settings

    • headless: bool. start the browser in headless mode. default true
    • browser: string. browser to use [choices: "chromium", "firefox", "webkit", "edge", "chrome"] default "chromium"
    • browserType: string. use a desktop or mobile browser [choices: 'desktop', 'mobile']
    • randomBrowser: use a random web browser
    • randomUserAgent: bool. use a random user agent

    runtime settings

    • container: bool. turn off additional security features, required to run inside a container
    • secure: bool. enforce browser security features such as CSP and same origin policy. default false

    screenshots settings

    • screenshot: bool. generate screenshot for each viewport mentioned. default false
    • colorScheme: string. force a color scheme [choices: 'dark', 'light']
    • filename: string. prefix of the generated files
    • width: int. viewport width. default 800
    • height: int. viewport height. default 600
    • dimensions: array or string. array of viewports. this takes precedence over height and width. viewports can be specified as objects with width and height property or a string.

    input settings

    • input: string. specify HTML input
    • base: string. specify HTML of the HTML input

    output settings

    • base: string. specify HTML for URL
    • html: bool. generate an HTML page containing the inlined critical css
    • output: string. change output directory. default './output/'
    • fonts: bool. generate javascript to load web fonts. default true
    • json: bool. dump result as JSON
    • advanced: bool. remove parts of css selectors that do not match any element. default false

    debugging settings

    • console: bool. log console messages from the pages. default true
    • verbose: bool. enable verbose mode

Command line script

Use with npx

$ npx @tbela99/critical@latest --help
$ npx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Use with bun

$ bunx @tbela99/critical@latest --help
$ bunx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Install from npm

$ npm install @tbela99/critical

Install from jsr

install for deno specific project

$ deno add @tbela99/critical

Install globally

when installed globally, it is available as critical-cli

$ npm install -g @tbela99/critical
$ critical-cli -i http://google.com

Usage

$ critical-cli.js [options+] url [url+]
run the command line tools:
Example: critical-cli.js -d 800x600 -d 1024x768 -i https://facebook.com
Options:
--help Show help [boolean]
--version Show version number [boolean]
-t, --headless enable or disable headless mode[boolean] [default: true]
-g, --base base path using reading data from stdin [string]
-b, --browser browser to use
[string] [choices: "chromium", "firefox", "webkit", "edge", "chrome"] [default
:"chromium"]
-k, --browser-type use a mobile browser
[string] [choices: "mobile", "desktop"]
-r, --random-browser use a random browser [boolean] [default: false]
-u, --random-user-agent use a random user agent [boolean] [default: false]
-i, --screenshot Generate screenshots [boolean]
-s, --secure enable or disable security settings such as CSP and same
origin policy [boolean]
-m, --color-scheme color scheme
[string] [choices: "light", "dark"] [default: "dark"]
-o, --output Output directory [string]
-n, --filename prefix of the generated files [string]
-w, --width Viewport width [number]
-a, --height Viewport height [number]
-d, --dimensions Array of viewports, override height/width settings
[array]
-f, --fonts Generate javascript to load fonts dynamically
[boolean] [default: true]
-l, --console Show console messages from the browser [boolean]
-c, --container Disable additional security settings to run inside a con
tainer [boolean]
-p, --html Generate an HTML page containing inlined critical css
[boolean]
--json print result in JSON format [boolean] [default: false]
-e, --advanced remove parts of css selectors that do not match any elem
ent [boolean] [default: false]
-v, --verbose Enable verbose mode [boolean] [default: false]

Example

Read data from URL

$ critical-cli https://github.com/ https://nodejs.org --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from file(s)

$ critical-cli pages/dashboard.html pages/404.html --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from STDIN

$ cat pages/dashboard.html | critical-cli --base=pages/ --secure=no -i -d '1440x900' -d '1366x768' --json

CHANGELOG

V1.2.0

  • accept files parameters in addition to urls
  • add missing cli argument 'random-user-agent'

V1.1.1

  • fix node 22 compatibility issues
  • publish to jsr.io

V1.1.0

  • read data from STDIN
  • remove unused selectors
  • dump cli result as JSON

V1.0.1

  • fix package.json dependencies and dev dependencies mix up

V1.0.0

  • converted to typescript
  • changed default export to es module
  • optimized generated css (merge rule, remove duplicate, minify, generate nested css)
  • specify color scheme [dark/light]

About

Generate critical CSS path from HTML pages to enable instantaneous rendering

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tbela99/critical: Generate critical CSS path from HTML pages to enable instantaneous rendering · GitHub
Skip to content

Repository files navigation

CRITICAL PATH GENERATOR

npmjsrNPM Downloadsscreenshot

Critical path generator tools using node oe the web browser.

Web browser script

Extract critical CSS path for the current viewport in the current page.

Using modules

<scripttype="module">import{parse,render}from'https://esm.sh/@tbela99/css-parser@0.7.1/web';import{extract}from'https://esm.sh/@tbela99/critical@1.2.0/browser';constresults=awaitextract({fonts: true});// css is optimized using https://www.npmjs.com/package/@tbela99/css-parser// pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);</script>

Without using modules

<scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/critical@1.2.0/dist/browser-umd.js"></script><scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/css-parser@0.7.1/dist/index-umd-web.js"></script><script>(async()=>{const{parse, render}=CSSParser;constresults=awaitcritical.extract({fonts: true});// optimize and pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);})();</script>

Options

  • options: object
    • fonts: bool? generate Javascript to load web fonts dynamically
    • html: bool? generate an HTML page containing inlined critical css
    • signal: AbortSignal? abort critical extraction using AbortSignal

Limitations

The web browser script is subject to the same origin policy and CSP. This can prevent the script from reading external stylesheets.

Node script

Generate critical CSS path from your nodejs script

import{critical}from"@tbela99/critical";consturls=['http://github.com','https://docs.npmjs.com/cli/v8/configuring-npm/package-json#directories'];urls.forEach(asyncurl=>critical(url,{html: true,console: true,screenshot: true,secure: false,// dimensions can be specified as an array of string or objectdimensions: ['1400x900','1200x675','992x558'],advanced: true}).then((results)=>{// print extracted CSSconsole.log(results.styles.join('\n'));}));

Node script options

  • options: object

    browser settings

    • headless: bool. start the browser in headless mode. default true
    • browser: string. browser to use [choices: "chromium", "firefox", "webkit", "edge", "chrome"] default "chromium"
    • browserType: string. use a desktop or mobile browser [choices: 'desktop', 'mobile']
    • randomBrowser: use a random web browser
    • randomUserAgent: bool. use a random user agent

    runtime settings

    • container: bool. turn off additional security features, required to run inside a container
    • secure: bool. enforce browser security features such as CSP and same origin policy. default false

    screenshots settings

    • screenshot: bool. generate screenshot for each viewport mentioned. default false
    • colorScheme: string. force a color scheme [choices: 'dark', 'light']
    • filename: string. prefix of the generated files
    • width: int. viewport width. default 800
    • height: int. viewport height. default 600
    • dimensions: array or string. array of viewports. this takes precedence over height and width. viewports can be specified as objects with width and height property or a string.

    input settings

    • input: string. specify HTML input
    • base: string. specify HTML of the HTML input

    output settings

    • base: string. specify HTML for URL
    • html: bool. generate an HTML page containing the inlined critical css
    • output: string. change output directory. default './output/'
    • fonts: bool. generate javascript to load web fonts. default true
    • json: bool. dump result as JSON
    • advanced: bool. remove parts of css selectors that do not match any element. default false

    debugging settings

    • console: bool. log console messages from the pages. default true
    • verbose: bool. enable verbose mode

Command line script

Use with npx

$ npx @tbela99/critical@latest --help
$ npx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Use with bun

$ bunx @tbela99/critical@latest --help
$ bunx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Install from npm

$ npm install @tbela99/critical

Install from jsr

install for deno specific project

$ deno add @tbela99/critical

Install globally

when installed globally, it is available as critical-cli

$ npm install -g @tbela99/critical
$ critical-cli -i http://google.com

Usage

$ critical-cli.js [options+] url [url+]
run the command line tools:
Example: critical-cli.js -d 800x600 -d 1024x768 -i https://facebook.com
Options:
--help Show help [boolean]
--version Show version number [boolean]
-t, --headless enable or disable headless mode[boolean] [default: true]
-g, --base base path using reading data from stdin [string]
-b, --browser browser to use
[string] [choices: "chromium", "firefox", "webkit", "edge", "chrome"] [default
:"chromium"]
-k, --browser-type use a mobile browser
[string] [choices: "mobile", "desktop"]
-r, --random-browser use a random browser [boolean] [default: false]
-u, --random-user-agent use a random user agent [boolean] [default: false]
-i, --screenshot Generate screenshots [boolean]
-s, --secure enable or disable security settings such as CSP and same
origin policy [boolean]
-m, --color-scheme color scheme
[string] [choices: "light", "dark"] [default: "dark"]
-o, --output Output directory [string]
-n, --filename prefix of the generated files [string]
-w, --width Viewport width [number]
-a, --height Viewport height [number]
-d, --dimensions Array of viewports, override height/width settings
[array]
-f, --fonts Generate javascript to load fonts dynamically
[boolean] [default: true]
-l, --console Show console messages from the browser [boolean]
-c, --container Disable additional security settings to run inside a con
tainer [boolean]
-p, --html Generate an HTML page containing inlined critical css
[boolean]
--json print result in JSON format [boolean] [default: false]
-e, --advanced remove parts of css selectors that do not match any elem
ent [boolean] [default: false]
-v, --verbose Enable verbose mode [boolean] [default: false]

Example

Read data from URL

$ critical-cli https://github.com/ https://nodejs.org --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from file(s)

$ critical-cli pages/dashboard.html pages/404.html --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from STDIN

$ cat pages/dashboard.html | critical-cli --base=pages/ --secure=no -i -d '1440x900' -d '1366x768' --json

CHANGELOG

V1.2.0

  • accept files parameters in addition to urls
  • add missing cli argument 'random-user-agent'

V1.1.1

  • fix node 22 compatibility issues
  • publish to jsr.io

V1.1.0

  • read data from STDIN
  • remove unused selectors
  • dump cli result as JSON

V1.0.1

  • fix package.json dependencies and dev dependencies mix up

V1.0.0

  • converted to typescript
  • changed default export to es module
  • optimized generated css (merge rule, remove duplicate, minify, generate nested css)
  • specify color scheme [dark/light]

About

Generate critical CSS path from HTML pages to enable instantaneous rendering

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tbela99/critical: Generate critical CSS path from HTML pages to enable instantaneous rendering · GitHub
Skip to content

Repository files navigation

CRITICAL PATH GENERATOR

npmjsrNPM Downloadsscreenshot

Critical path generator tools using node oe the web browser.

Web browser script

Extract critical CSS path for the current viewport in the current page.

Using modules

<scripttype="module">import{parse,render}from'https://esm.sh/@tbela99/css-parser@0.7.1/web';import{extract}from'https://esm.sh/@tbela99/critical@1.2.0/browser';constresults=awaitextract({fonts: true});// css is optimized using https://www.npmjs.com/package/@tbela99/css-parser// pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);</script>

Without using modules

<scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/critical@1.2.0/dist/browser-umd.js"></script><scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/css-parser@0.7.1/dist/index-umd-web.js"></script><script>(async()=>{const{parse, render}=CSSParser;constresults=awaitcritical.extract({fonts: true});// optimize and pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);})();</script>

Options

  • options: object
    • fonts: bool? generate Javascript to load web fonts dynamically
    • html: bool? generate an HTML page containing inlined critical css
    • signal: AbortSignal? abort critical extraction using AbortSignal

Limitations

The web browser script is subject to the same origin policy and CSP. This can prevent the script from reading external stylesheets.

Node script

Generate critical CSS path from your nodejs script

import{critical}from"@tbela99/critical";consturls=['http://github.com','https://docs.npmjs.com/cli/v8/configuring-npm/package-json#directories'];urls.forEach(asyncurl=>critical(url,{html: true,console: true,screenshot: true,secure: false,// dimensions can be specified as an array of string or objectdimensions: ['1400x900','1200x675','992x558'],advanced: true}).then((results)=>{// print extracted CSSconsole.log(results.styles.join('\n'));}));

Node script options

  • options: object

    browser settings

    • headless: bool. start the browser in headless mode. default true
    • browser: string. browser to use [choices: "chromium", "firefox", "webkit", "edge", "chrome"] default "chromium"
    • browserType: string. use a desktop or mobile browser [choices: 'desktop', 'mobile']
    • randomBrowser: use a random web browser
    • randomUserAgent: bool. use a random user agent

    runtime settings

    • container: bool. turn off additional security features, required to run inside a container
    • secure: bool. enforce browser security features such as CSP and same origin policy. default false

    screenshots settings

    • screenshot: bool. generate screenshot for each viewport mentioned. default false
    • colorScheme: string. force a color scheme [choices: 'dark', 'light']
    • filename: string. prefix of the generated files
    • width: int. viewport width. default 800
    • height: int. viewport height. default 600
    • dimensions: array or string. array of viewports. this takes precedence over height and width. viewports can be specified as objects with width and height property or a string.

    input settings

    • input: string. specify HTML input
    • base: string. specify HTML of the HTML input

    output settings

    • base: string. specify HTML for URL
    • html: bool. generate an HTML page containing the inlined critical css
    • output: string. change output directory. default './output/'
    • fonts: bool. generate javascript to load web fonts. default true
    • json: bool. dump result as JSON
    • advanced: bool. remove parts of css selectors that do not match any element. default false

    debugging settings

    • console: bool. log console messages from the pages. default true
    • verbose: bool. enable verbose mode

Command line script

Use with npx

$ npx @tbela99/critical@latest --help
$ npx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Use with bun

$ bunx @tbela99/critical@latest --help
$ bunx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Install from npm

$ npm install @tbela99/critical

Install from jsr

install for deno specific project

$ deno add @tbela99/critical

Install globally

when installed globally, it is available as critical-cli

$ npm install -g @tbela99/critical
$ critical-cli -i http://google.com

Usage

$ critical-cli.js [options+] url [url+]
run the command line tools:
Example: critical-cli.js -d 800x600 -d 1024x768 -i https://facebook.com
Options:
--help Show help [boolean]
--version Show version number [boolean]
-t, --headless enable or disable headless mode[boolean] [default: true]
-g, --base base path using reading data from stdin [string]
-b, --browser browser to use
[string] [choices: "chromium", "firefox", "webkit", "edge", "chrome"] [default
:"chromium"]
-k, --browser-type use a mobile browser
[string] [choices: "mobile", "desktop"]
-r, --random-browser use a random browser [boolean] [default: false]
-u, --random-user-agent use a random user agent [boolean] [default: false]
-i, --screenshot Generate screenshots [boolean]
-s, --secure enable or disable security settings such as CSP and same
origin policy [boolean]
-m, --color-scheme color scheme
[string] [choices: "light", "dark"] [default: "dark"]
-o, --output Output directory [string]
-n, --filename prefix of the generated files [string]
-w, --width Viewport width [number]
-a, --height Viewport height [number]
-d, --dimensions Array of viewports, override height/width settings
[array]
-f, --fonts Generate javascript to load fonts dynamically
[boolean] [default: true]
-l, --console Show console messages from the browser [boolean]
-c, --container Disable additional security settings to run inside a con
tainer [boolean]
-p, --html Generate an HTML page containing inlined critical css
[boolean]
--json print result in JSON format [boolean] [default: false]
-e, --advanced remove parts of css selectors that do not match any elem
ent [boolean] [default: false]
-v, --verbose Enable verbose mode [boolean] [default: false]

Example

Read data from URL

$ critical-cli https://github.com/ https://nodejs.org --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from file(s)

$ critical-cli pages/dashboard.html pages/404.html --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from STDIN

$ cat pages/dashboard.html | critical-cli --base=pages/ --secure=no -i -d '1440x900' -d '1366x768' --json

CHANGELOG

V1.2.0

  • accept files parameters in addition to urls
  • add missing cli argument 'random-user-agent'

V1.1.1

  • fix node 22 compatibility issues
  • publish to jsr.io

V1.1.0

  • read data from STDIN
  • remove unused selectors
  • dump cli result as JSON

V1.0.1

  • fix package.json dependencies and dev dependencies mix up

V1.0.0

  • converted to typescript
  • changed default export to es module
  • optimized generated css (merge rule, remove duplicate, minify, generate nested css)
  • specify color scheme [dark/light]

About

Generate critical CSS path from HTML pages to enable instantaneous rendering

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - tbela99/critical: Generate critical CSS path from HTML pages to enable instantaneous rendering · GitHub
Skip to content

Repository files navigation

CRITICAL PATH GENERATOR

npmjsrNPM Downloadsscreenshot

Critical path generator tools using node oe the web browser.

Web browser script

Extract critical CSS path for the current viewport in the current page.

Using modules

<scripttype="module">import{parse,render}from'https://esm.sh/@tbela99/css-parser@0.7.1/web';import{extract}from'https://esm.sh/@tbela99/critical@1.2.0/browser';constresults=awaitextract({fonts: true});// css is optimized using https://www.npmjs.com/package/@tbela99/css-parser// pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);</script>

Without using modules

<scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/critical@1.2.0/dist/browser-umd.js"></script><scriptsrc="https://cdn.jsdelivr.net/gh/tbela99/css-parser@0.7.1/dist/index-umd-web.js"></script><script>(async()=>{const{parse, render}=CSSParser;constresults=awaitcritical.extract({fonts: true});// optimize and pretty print cssconstcss=awaitparse(results.styles.join('\n')).then(result=>render(result.ast,{minify: false}).code);console.debug(css);})();</script>

Options

  • options: object
    • fonts: bool? generate Javascript to load web fonts dynamically
    • html: bool? generate an HTML page containing inlined critical css
    • signal: AbortSignal? abort critical extraction using AbortSignal

Limitations

The web browser script is subject to the same origin policy and CSP. This can prevent the script from reading external stylesheets.

Node script

Generate critical CSS path from your nodejs script

import{critical}from"@tbela99/critical";consturls=['http://github.com','https://docs.npmjs.com/cli/v8/configuring-npm/package-json#directories'];urls.forEach(asyncurl=>critical(url,{html: true,console: true,screenshot: true,secure: false,// dimensions can be specified as an array of string or objectdimensions: ['1400x900','1200x675','992x558'],advanced: true}).then((results)=>{// print extracted CSSconsole.log(results.styles.join('\n'));}));

Node script options

  • options: object

    browser settings

    • headless: bool. start the browser in headless mode. default true
    • browser: string. browser to use [choices: "chromium", "firefox", "webkit", "edge", "chrome"] default "chromium"
    • browserType: string. use a desktop or mobile browser [choices: 'desktop', 'mobile']
    • randomBrowser: use a random web browser
    • randomUserAgent: bool. use a random user agent

    runtime settings

    • container: bool. turn off additional security features, required to run inside a container
    • secure: bool. enforce browser security features such as CSP and same origin policy. default false

    screenshots settings

    • screenshot: bool. generate screenshot for each viewport mentioned. default false
    • colorScheme: string. force a color scheme [choices: 'dark', 'light']
    • filename: string. prefix of the generated files
    • width: int. viewport width. default 800
    • height: int. viewport height. default 600
    • dimensions: array or string. array of viewports. this takes precedence over height and width. viewports can be specified as objects with width and height property or a string.

    input settings

    • input: string. specify HTML input
    • base: string. specify HTML of the HTML input

    output settings

    • base: string. specify HTML for URL
    • html: bool. generate an HTML page containing the inlined critical css
    • output: string. change output directory. default './output/'
    • fonts: bool. generate javascript to load web fonts. default true
    • json: bool. dump result as JSON
    • advanced: bool. remove parts of css selectors that do not match any element. default false

    debugging settings

    • console: bool. log console messages from the pages. default true
    • verbose: bool. enable verbose mode

Command line script

Use with npx

$ npx @tbela99/critical@latest --help
$ npx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Use with bun

$ bunx @tbela99/critical@latest --help
$ bunx @tbela99/critical@latest -r -i -e --html https://github.com/ https://nodejs.org

Install from npm

$ npm install @tbela99/critical

Install from jsr

install for deno specific project

$ deno add @tbela99/critical

Install globally

when installed globally, it is available as critical-cli

$ npm install -g @tbela99/critical
$ critical-cli -i http://google.com

Usage

$ critical-cli.js [options+] url [url+]
run the command line tools:
Example: critical-cli.js -d 800x600 -d 1024x768 -i https://facebook.com
Options:
--help Show help [boolean]
--version Show version number [boolean]
-t, --headless enable or disable headless mode[boolean] [default: true]
-g, --base base path using reading data from stdin [string]
-b, --browser browser to use
[string] [choices: "chromium", "firefox", "webkit", "edge", "chrome"] [default
:"chromium"]
-k, --browser-type use a mobile browser
[string] [choices: "mobile", "desktop"]
-r, --random-browser use a random browser [boolean] [default: false]
-u, --random-user-agent use a random user agent [boolean] [default: false]
-i, --screenshot Generate screenshots [boolean]
-s, --secure enable or disable security settings such as CSP and same
origin policy [boolean]
-m, --color-scheme color scheme
[string] [choices: "light", "dark"] [default: "dark"]
-o, --output Output directory [string]
-n, --filename prefix of the generated files [string]
-w, --width Viewport width [number]
-a, --height Viewport height [number]
-d, --dimensions Array of viewports, override height/width settings
[array]
-f, --fonts Generate javascript to load fonts dynamically
[boolean] [default: true]
-l, --console Show console messages from the browser [boolean]
-c, --container Disable additional security settings to run inside a con
tainer [boolean]
-p, --html Generate an HTML page containing inlined critical css
[boolean]
--json print result in JSON format [boolean] [default: false]
-e, --advanced remove parts of css selectors that do not match any elem
ent [boolean] [default: false]
-v, --verbose Enable verbose mode [boolean] [default: false]

Example

Read data from URL

$ critical-cli https://github.com/ https://nodejs.org --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from file(s)

$ critical-cli pages/dashboard.html pages/404.html --secure=no -i -d '1440x900' -d '1366x768' --json

Read data from STDIN

$ cat pages/dashboard.html | critical-cli --base=pages/ --secure=no -i -d '1440x900' -d '1366x768' --json

CHANGELOG

V1.2.0

  • accept files parameters in addition to urls
  • add missing cli argument 'random-user-agent'

V1.1.1

  • fix node 22 compatibility issues
  • publish to jsr.io

V1.1.0

  • read data from STDIN
  • remove unused selectors
  • dump cli result as JSON

V1.0.1

  • fix package.json dependencies and dev dependencies mix up

V1.0.0

  • converted to typescript
  • changed default export to es module
  • optimized generated css (merge rule, remove duplicate, minify, generate nested css)
  • specify color scheme [dark/light]

About

Generate critical CSS path from HTML pages to enable instantaneous rendering

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages