Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

browserify-css

Package Overview
Dependencies
Maintainers
1
Versions
34
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

browserify-css

A Browserify transform for bundling, rebasing, inlining, and minifying CSS files

  • 0.8.0
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
8.2K
increased by20.38%
Maintainers
1
Weekly downloads
 
Created
Source

browserify-css build status Coverage Status

NPM

A Browserify transform for bundling, rebasing, inlining, and minifying CSS files. It's useful for CSS modularization where styles are scoped to their related bundles.

Getting Started

If you're new to browserify, check out the browserify handbook and the resources on browserify.org.

Installation

npm install --save-dev browserify-css

Usage

app.css:

@import url("modules/foo/index.css");
@import url("modules/bar/index.css");
body {
    background-color: #fff;
}

app.js:

var css = require('./app.css');
console.log(css);

You can compile your app by passing -t browserify-css to browserify:

$ browserify -t browserify-css app.js > bundle.js

Each require('./path/to/file.css') call will concatenate CSS files with @import statements, rebasing urls, inlining @import, and minifying CSS. It will add a style tag with an optional data-href attribute to the head section of the document during runtime:

<html>
<head>
    <style type="text/css" data-href="app.css">...</style>
</head>
</html>

Configuration

You can set configuration to your package.json file:

{
    "browserify-css": {
        "autoInject": true,
        "minify": true,
        "rootDir": "."
    }
}

or use an external configuration file like below:

{
    "browserify-css": "./config/browserify-css.js"
}

config/browserify-css.js:

module.exports = {
    "autoInject": true,
    "minify": true,
    "rootDir": "."
};

Furthermore, browserify-css transform can obtain options from the command-line with subarg syntax:

$ browserify -t [ browserify-css --autoInject=true ] app.js

or from the api:

b.transform('browserify-css', { autoInject: true })

Options

autoInject

Type: Boolean Default: true

If true, each require('path/to/file.css') call will add a style tag to the head section of the document.

autoInjectOptions

Type: Object Default:

{
    "verbose": true
}

If verbose is set to true, the path to CSS will be specified in the data-href attribute inside the style tag

minify

Type: Boolean Default: false

minifyOptions

Type: Object Default: {}

Check out a list of CSS minify options at CleanCSS.

processRelativeUrl

Type: Function

The processRelativeUrl option accepts a function which takes one argument (the relative url) and returns the original relativeUrl string or the converted result. For example:

var browserify = require('browserify');

browserify(options)
    .add('src/index.js')
    .transform(require('browserify-css'), {
        rootDir: 'src',
        processRelativeUrl: function(relativeUrl) {
            return relativeUrl;
        }
    })
    .bundle();

You can embed the image data directly into the CSS file with data URI, like so:

var _ = require('lodash');
var path = require('path');
var browserify = require('browserify');

browserify(options)
    .add('src/index.js')
    .transform(require('browserify-css'), {
        rootDir: 'src',
        processRelativeUrl: function(relativeUrl) {
            if (_.contains(['.jpg','.png','.gif'], path.extname(relativeUrl))) {
                // Embed image data with data URI
                var DataUri = require('datauri');
                var dUri = new DataUri(relativeUrl);
                return dUri.content;
            }
            return relativeUrl;
        }
    })
    .bundle();

You may also want to check out the FAQ for advanced usage.

rebaseUrls

Type: Boolean Default: true

If true, relative paths will be rebased in css files; if false, paths will be unchanged.

rootDir

Type: String Default: ./

An absolute path to resolve relative paths against the project's base directory.

FAQ

1. How do I include CSS files located inside the node_modules folder?

You can choose one of the following methods to include CSS files located inside the node_modules folder:

  1. The easiest way to do this is using the @import rule. For example:

app.js:

require('./app.css');

app.css:

/* Use CSS from your node_modules folder */
@import "node_modules/foo/foo.css";

/* Or your own relative files */
@import "styles/common.css";
  1. Use the global transform option (i.e. --global-transform or -g) on the command line to transform all files in a node_modules directory:
$ browserify -g browserify-css app.js > bundle.js 

or use the API directly:

var browserify = require('browserify');
var b = browserify('./app.js');
b.transform('browserify-css', {global: true});
b.bundle().pipe(process.stdout);

See browserify transform options for details.

  1. Put browserify transform option into a submodule's package.json file inside the node_modules directory on a per-module basis like so:

node_modules/foo/package.json:

{
  "browserify": {
    "transform": ["browserify-css"]
  }
}

Then, run browserify transform on the command line:

$ browserify -t browserify-css app.js > bundle.js 

2. How do I load font and image files from node_modules?

Assume that you have the following directory structure:

package.json
dist/
src/
    index.js
    index.css
node_modules/
    bootstrap/
        dist/
            css/
                bootstrap.css

The index.css uses @import to import external style sheets:

@import url("../node_modules/bootstrap/dist/css/bootstrap.css");

All output files, including the generated bundle.js, are created under the dist directory:

dist/
    bundle.js
    vendor/
        bootstrap/
            dist/
                css/
                    bootstrap.css

Suppose that the dist directory is your web root, you might want to copy external font and images files from ../node_modules/ to dist/vendor/.

For example, the @font-face rules in node_modules/bootstrap/dist/css/bootstrap.css:

@font-face {
    font-family: 'Glyphicons Halflings';
    src: url('../fonts/glyphicons-halflings-regular.eot');
    src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),
         url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),
         url('../fonts/glyphicons-halflings-regular.woff') format('woff'),
         url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),
         url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
}

The example below illustrates the use of the processRelativeUrl option:

var gulp = require('gulp');
var gutil = require('gulp-util');
var path = require('path');
var browserify = require('browserify');
var sourceStream = require('vinyl-source-stream');
var fse = require('fs-extra');

var bundleStream = browserify()
    .add('src/index.js')
    .transform(require('browserify-css'), {
        rootDir: 'src',
        processRelativeUrl: function(relativeUrl) {
            var stripQueryStringAndHashFromPath = function(url) {
                return url.split('?')[0].split('#')[0];
            };
            var rootDir = path.resolve(process.cwd(), 'src');
            var relativePath = stripQueryStringAndHashFromPath(relativeUrl);
            var queryStringAndHash = relativeUrl.substring(relativePath.length);

            //
            // Copying files from '../node_modules/bootstrap/' to 'dist/vendor/bootstrap/'
            //
            var prefix = '../node_modules/';
            if (_.startsWith(relativePath, prefix)) {
                var vendorPath = 'vendor/' + relativePath.substring(prefix.length);
                var source = path.join(rootDir, relativePath);
                var target = path.join(rootDir, vendorPath);

                gutil.log('Copying file from ' + JSON.stringify(source) + ' to ' + JSON.stringify(target));
                fse.copySync(source, target);

                // Returns a new path string with original query string and hash fragments
                return vendorPath + queryStringAndHash;
            }

            return relativeUrl;
        }
    })
    .bundle();

bundleStream
    .pipe(sourceStream(bundleFile))
    .pipe(gulp.dest(browserifyConfig.dest));

License

Copyright (c) 2014-2015 Cheton Wu

Licensed under the MIT License.

Keywords

FAQs

Package last updated on 03 Nov 2015

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc