babel-plugin-remove-react-element

v1.0.4
Removes elements from the source code. Useful when generating multiple bundles.
babel-plugin

babel-plugin-remove-react-element

This Babel plugin can be used to remove every usage of a react component from code. Used with webpack, this can be used to create a bundle for a mobile website and a desktop website.

Installation

npm install --save-dev babel-plugin-remove-react-element

Usage

Via .babelrc (Recommended)

.babelrc

{
    "plugins": [
        ["remove-react-element", { "elementNames": ["Desktop"] }]
    ]
}

Via Node API

require("@babel/core").transform("code", {
    "plugins": [
        ["remove-react-element", { "elementNames": ["Desktop"] }]
    ]
});

Example

In

    class MyPage extends Component {
        render() {
            return <div>
                <Desktop>
                    This will show on desktops.
                </Desktop>
                <Mobile>
                    This will show on mobile.
                </Mobile>
            </div>
        }
    }

Out

    class MyPage extends Component {
        render() {
            return <div>
                {null}
                <Mobile>
                    This will show on mobile.
                </Mobile>
            </div>
        }
    }

Why...

Consider the following react component... The code below can be compiled and bundled without remove-react-element. The resulting bundle would be a valid responsive website.

import MediaQuery from 'react-responsive';
import React, { Component } from 'react';

//The markup wrapped inside the <Desktop/> tag will only show
// if the width of the page is lower than 1224px.
class Desktop extends Component {
    render() {
        return <MediaQuery query="(min-device-width: 1224px)">
            { this.props.children }
        </MediaQuery>;
    }
}

//The markup wrapped inside the <Mobile/> tag will only show
// if the width of the page is lower than 1224px.
class Mobile extends Component {
    render() {
        return <MediaQuery query="(max-device-width: 1224px)">
            { this.props.children }
        </MediaQuery>;
    }
}

export class MyPage extends Component {
    render() {
        return <div>
            <Desktop>
                This will show on desktops.
            </Desktop>
            <Mobile>
                This will show on mobile.
            </Mobile>
        </div>
    }
}

But you might have a requirement to generate a smaller bundle for mobile devices. This bundle would not need to contain the markup related to desktop. This can be achieved with remove-react-element.

To achieve this, you can configure webpack as followed.

const webpack = require('webpack');
const path = require('path');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
    ...
    module: {
        rules: [
            {
                include: [
                    path.resolve('./src')
                ],
                use: [
                    {
                        loader: 'babel-loader',
                        options: {
                            plugins: [
                                [
                                    "remove-react-element",
                                    { "elementNames": ["Desktop"] }
                                ]
                            ]
                        }
                    }
                ]
            }
        ]
    },
    plugins: [
        new UglifyJSPlugin({
            uglifyOptions: {
                beautify: true,
                ecma: 6,
                compress: true,
                comments: false
            }
        })
    ]
};

Once the plugin remove-react-element has removed all the usages of the Desktop components, uglifyjs will remove all the dead code... so all the unused components should be removed from the bundle.

Metadata

  • MIT
  • Whatever
  • Nicolas Cochard
  • released 12/25/2022

Downloads

Maintainers