npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

grow-loader

v0.1.2

Published

a webpack loader to do code splitting on class methods

Downloads

7

Readme

grow-loader

Travis CI npm version

The grow-loader is a webpack loader to let you split "growable" methods into separate files, by simply adding a decorator to the methods in class declarations.

By "growable methods", we mean the methods that need to be dynamically imported. To learn more about dynamic import, read this document from webpack.

Learn more about grow-loader:

Installing grow-loader

To install grow-loader, run the following command on your terminal.

npm install --save-dev "grow-loader"

Using grow-loader

Getting started

  1. In your webpack config, add grow-loader before the babel-loader.

    Note. Webpack chains loaders from right to left, so to run a loader before another loader, it should be put latter. See https://webpack.js.org/configuration/module/#rule-use for more information.

    webpack.config.js

    {
        test: /\.jsx?$/,
        use: [
            'babel-loader',
            'grow-loader'
        ]
    }
  2. Add the @grow decorator to your class methods that need to "grow". The functions marked will be split into separate files.

    class SampleClass {
    
        @grow
        methodToGrow() {
            // ...
        }
    
        @grow
        methodToGrowAndBind = () => {
            // ...
        }
    
        methodToBeBundled(){
    
        }
    }

    If you use any linter tool before grow-loader, you may use the following import statement (which does nothing) to avoid syntax error.

    import grow from 'grow-loader/lib/grow';
  3. To install split functions back, call the grow() function.

    const sample = new SampleClass();
    console.assert(a.methodToGrow === undefined);
    console.assert(a.methodToGrowAndBind === undefined);
    
    sample.grow().then(() => {
        sample.methodToGrow();
        sample.methodToGrowAndBind();
    });

Customizing loader options

To avoid naming conflicts, you can customize the following grow-loader options.

| Option | Default Value | Description | | -------|---------|-------------| | methodName | grow | The name of the method to be called before a split method. e.g. grow() | | decoratorName | grow | The decorator to be detected. e.g. @grow. |

The grow-loader options are to be defined in your webpack config or in an import statement.

Note. Learn more about configuring loaders from the webpack documentation on loaders.

The following is an example of customizing the grow method as myGrow() and the decorator as @myGrowDec.

{
    test: /\.jsx?$/,
    use: [
        'babel-loader',
        'grow-loader?methodName=myGrow&decoratorName=myGrowDec'
    ]
}

React Component Example

Using grow-loader to code-split requires only a few modifications to your code. Here is an example:

Before applying grow-loader

export default class A extends React.Component {

    methodToGrow(){}

    anotherMethodToGrow(){}

    methodToBeBundled(){}

    render(){
        return <div>...</div>
    }
}

After applying grow-loader

class GrowablePage extends React.Component {
    componentDidMount() {
        if (this.grow) {
            this.grow().then(() => {
                this.hasGrown = true;
                this.forceUpdate();
            });
        }
    }
}

export default class A extends GrowablePage {
    @grow
    methodToGrow(){ }

    @grow
    anotherMethodToGrow(){ }

    methodToBeBundled{ }

    @grow
    renderMore() {
        return <div>...</div>
    }

    render(){
        return <div>
            { this.hasGrown ? this.renderMore() : null }
        </div>
    }
}

Background story

Higher-Order Components(HOC) is a common solution in implementing code-splitting. But we found HOC solutions unsuitable for our project built with React.js.

  • We use different placeholder components for almost every page, but HOC solutions only support a common component for all pages.
  • Instant page transition was our ultimate goal, but the following two problems had surfaced in using HOC solutions:
    • We organize pages in a stack—see our blog posting on this—the hooks provided could not be easily integrated.
    • A lot of code modifications were required. Preloading pages would help our case, but preloading costs a lot in time and management. And page transition still felt janky for long pages because of DOM manipulation.

That's why we decided to split every page into two parts:

  • Basic part: Contains placeholder components in the first view, which are to be included in the main bundle.
  • Grown part: Parts to be dynamically imported, and rendered after the Basic Part

But manually splitting files requires a heavy workload and makes methods in both parts messy. This is why we created the grow-loader to do it in a flexible way.

Contributing

Please check CONTRIBUTING before making a contribution.

License

Apache License Version 2.0