HTML Preparation code:
x
 
1
2
<script src='https://cdnjs.cloudflare.com/ajax/libs/classnames/2.3.2/index.min.js'></script>
3
<script src='https://unpkg.com/clsx@1.2.1/dist/clsx.min.js'></script>
Script Preparation code:
 
var str = 'style';
var obj = {
    'style-2': true,
    'style-3': false,
    'style-4': true,
}
var arr = ['style-5', 'style-6']
const isArray = (value) => Array.isArray(value)
const isUndefined = (value) => typeof value === "undefined"
const isString = (value) => typeof value === "string"
const isNumber = (value) => !Number.isNaN(value) && typeof value === "number"
const isObject = (value) => !isArray(value) && value !== null && typeof value === "object"
function composeClass(...values) {
    if (!values.length) {
        return
    }
    const classNameStack = []
    for (const value of values) {
        switch (true) {
            case !value: {
                continue
            }
            case isString(value):
            case isNumber(value): {
                classNameStack.push(value)
                continue
            }
            case isArray(value) && value.length > 0: {
                const valueFromArray = Reflect.apply(composeClass, undefined, value)
                if (!isUndefined(valueFromArray)) {
                    classNameStack.push(valueFromArray)
                }
                continue
            }
            case isObject(value): {
                for (const key in value) {
                    if (value[key]) {
                        classNameStack.push(key)
                    }
                }
                continue
            }
        }
    }
    return classNameStack.length > 0 ? classNameStack.join(" ") : undefined
}
Tests:
  • classnames

     
    let result = window.classNames(str, obj, arr, 'test classname')
  • clsx

     
    let result = window.clsx(str, obj, arr, 'test classname')
  • custom implemenatation

     
    let result = composeClass(str, obj, arr, 'test classname')
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    classnames
    clsx
    custom implemenatation

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: one year ago)
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36
Chrome 112 on Mac OS X 10.15.7
View result in a separate tab
Test name Executions per second
classnames 2602847.5 Ops/sec
clsx 3746647.0 Ops/sec
custom implemenatation 1197065.0 Ops/sec