JSPM

  • Created
  • Published
  • Downloads 200521
  • Score
    100M100P100Q184131F
  • License MIT

A Vite plugin that takes the CSS and adds it to the page through the JS. For those who want a single JS file.

Package Exports

  • vite-plugin-css-injected-by-js

Readme

Vite Plugin: CssInjectedByJs

A Vite plugin that takes the CSS and adds it to the page through the JS. For those who want a single JS file.

How does it work

Essentially what it does is take all the CSS generated by the build process and add it via JavaScript. The CSS file is therefore not generated and the declaration in the generated HTML file is also removed. You can also configure when the CSS injection will be executed (before or after your app code).

Installation

npm i vite-plugin-css-injected-by-js --save

Usage

import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'

export default {
  plugins: [
    cssInjectedByJsPlugin(),
  ]
}

Configurations

When you add the plugin, you can provide a configuration object. For now, you can configure only when the injection of CSS is done at execution time topExecutionPriority.

topExecutionPriority

The default behavior adds the injection of CSS before your bundle code. If you provide topExecutionPriority equal to: false the code of injection will be added after the bundle code. This is an example:

import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'

export default {
  plugins: [
    cssInjectedByJsPlugin({topExecutionPriority: false}),
  ]
}

styleId

If you provide a string for styleId param the code of injection will set the id attribute of the style element with the value of the parameter provided. This is an example:

import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'

export default {
  plugins: [
    cssInjectedByJsPlugin({styleId: "foo"}),
  ]
}

The output injected into the DOM will look like this example:

<head>
    <style id="foo">/* Generated CSS rules */</style>
</head>

injectCode

You can provide also a function for injectCode param to customize the injection code used. The injectCode callback must return a string (with valid JS code) and it's called with two arguments:

  • cssCode (the string that contains all the css code that need to be injected via JavaScript)
  • options (a simple object that currently contains only the styleId param)

This is an example:

import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'

export default {
  plugins: [
    cssInjectedByJsPlugin({injectCode: (cssCode, options) => { return `try{if(typeof document != 'undefined'){var elementStyle = document.createElement('style');elementStyle.appendChild(document.createTextNode(${cssCode}));document.head.appendChild(elementStyle);}}catch(e){console.error('vite-plugin-css-injected-by-js', e);}`}}),
  ]
}

injectCodeFunction

If you prefer to specify the injectCode as a plain function you can use the injectCodeFunction param.

The injectCodeFunction function is a void function that will be called at runtime application with two arguments:

  • cssCode (the string that contains all the css code that need to be injected via JavaScript)
  • options (a simple object that currently contains only the styleId param)

This is an example:

import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'

export default {
    plugins: [
        cssInjectedByJsPlugin({
            injectCodeFunction: function injectCodeCustomRunTimeFunction(cssCode, options) {
                try {
                    if (typeof document != 'undefined') {
                        var elementStyle = document.createElement('style');
                        elementStyle.appendChild(document.createTextNode(${cssCode}));
                        document.head.appendChild(elementStyle);
                    }
                } catch (e) {
                    console.error('vite-plugin-css-injected-by-js', e);
                }
            }
        }),
    ]
}

useStrictCSP

The useStrictCSP configuration option adds a nonce to style tags based on <meta property="csp-nonce" content={{ nonce }} />. See the following link for more information.

This is an example:

import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'

export default {
  plugins: [
    cssInjectedByJsPlugin({useStrictCSP: true}),
  ]
}

The tag <meta property="csp-nonce" content={{ nonce }} /> (nonce should be replaced with the value) must be present in your html page. The content value of that tag will be provided to the nonce property of the style element that will be injected by our default injection code.

Contributing

When you make changes to plugin locally, you may want to build the js from the typescript file of the plugin. Here the guidelines:

Install

npm install

Build plugin

npm run build

See CONTRIBUTING.md for more information.