A tiny (239B) utility for constructing `className` strings conditionally.
MIT License
Bot releases are hidden (Show)
bigint
in ClassValue
type: (#96): 3d960ab@types/react
changes to ReactNode
.licenses.dev
badge: 684509cpolka@next
and a larger astro
example.
Full Changelog: https://github.com/lukeed/clsx/compare/v2.1.0...v2.1.1
Published by lukeed 10 months ago
Add new clsx/lite
submodule for string
-only usage: 1a49142
This is a 140b version of clsx
that is ideal for Tailwind and/or React contexts, which typically follow this clsx
usage pattern:
clsx('foo bar', props.maybe && 'conditional classes', props.className);
Important: This
clsx/lite
module ignores all non-string arguments and is therefore not a 1:1 replacement forclsx
itself!
import { clsx } from 'clsx';
import { clsx as lite } from 'clsx/lite';
// strings-only usage is identical
clsx('foo', null, 'bar', true && 'baz'); //=> "foo bar baz"
lite('foo', null, 'bar', true && 'baz'); //=> "foo bar baz"
// clsx/lite ignores all non-strings
clsx('foo', { a: true, b: false, c: true }); //=> "foo a c"
lite('foo', { a: true, b: false, c: true }); //=> "foo"
Full Changelog: https://github.com/lukeed/clsx/compare/v2.0.1...v2.1.0
Published by lukeed 10 months ago
arguments.length
& array.length
for 6% performance gain (#26): deff09bnyc
with c8
in CI: 6e2468eFull Changelog: https://github.com/lukeed/clsx/compare/v2.0.0...v2.0.1
Published by lukeed over 1 year ago
"exports"
map for native ESM support (#57): 3ec8e9f, 0949868node16
/nodenext
module resolutionFull Changelog: https://github.com/lukeed/clsx/compare/v1.2.1...v2.0.0
Published by lukeed over 2 years ago
clsx
export tooFull Changelog: https://github.com/lukeed/clsx/compare/v1.2.0...v1.2.1
Published by lukeed over 2 years ago
Add named clsx
export alias (#43, #44): 56ab81f
Thank you @danikaze~!
This is purely an alias for the default export so that TypeScript users can avoid the esModuleInterop
setting. In other words, the follow import
statements are effectively identical, but the latter is preferred by TypeScript:
import clsx from 'clsx';
// or
import { clsx } from 'clsx';
Important: Just to reiterate, both still work!
tape
to uvu
for tests: 1c36d10Full Changelog: https://github.com/lukeed/clsx/compare/v1.1.1...v1.2.0
Note: This is a performance-related patch only!Across all benchmarks, this version of
clsx
is ~1M ops/sec faster than[email protected]
....It also happens to be 1 byte (gzip) smaller 😅🎉
toVal
calls with truthy assertions: 4fa8811, 019ec02typeof
checks for common case: 08a5a7fesm
hook with tests: 0287e40Run on Node.js v10.13.0.You may find updated browser benchmarks here.
The snippet below is comparing [email protected]
(this version) to the previous version, and to classnames
for ballpark comparison. All candidates are functionally identical!
# Strings
classnames x 3,992,284 ops/sec ±1.64% (94 runs sampled)
[email protected] x 11,253,372 ops/sec ±0.35% (96 runs sampled)
[email protected] x 12,784,134 ops/sec ±0.42% (97 runs sampled)
# Objects
classnames x 3,772,978 ops/sec ±0.46% (96 runs sampled)
[email protected] x 7,288,178 ops/sec ±0.31% (96 runs sampled)
[email protected] x 9,412,010 ops/sec ±0.42% (95 runs sampled)
# Arrays
classnames x 1,665,275 ops/sec ±1.83% (93 runs sampled)
[email protected] x 8,340,174 ops/sec ±0.53% (96 runs sampled)
[email protected] x 9,141,916 ops/sec ±0.42% (95 runs sampled)
# Nested Arrays
classnames x 1,164,706 ops/sec ±1.60% (95 runs sampled)
[email protected] x 6,284,485 ops/sec ±0.58% (90 runs sampled)
[email protected] x 7,165,151 ops/sec ±0.47% (91 runs sampled)
# Nested Arrays w/ Objects
classnames x 1,597,180 ops/sec ±1.49% (93 runs sampled)
[email protected] x 6,345,248 ops/sec ±0.21% (95 runs sampled)
[email protected] x 7,651,411 ops/sec ±0.56% (95 runs sampled)
# Mixed
classnames x 2,129,199 ops/sec ±1.46% (94 runs sampled)
[email protected] x 6,557,515 ops/sec ±0.73% (91 runs sampled)
[email protected] x 8,119,210 ops/sec ±0.42% (93 runs sampled)
# Mixed (Bad Data)
classnames x 1,166,577 ops/sec ±0.84% (94 runs sampled)
[email protected] x 2,018,654 ops/sec ±0.15% (98 runs sampled)
[email protected] x 2,238,939 ops/sec ±0.34% (95 runs sampled)
Use Array.isArray
for proper Array
type-checking (#17): 0d6023a
This prevents an object with a truthy push
key from being treated as an Array. While (likely) rare, this produced an incorrect result.
Important: Because of this change, Internet Explorer 8 (and older) are no longer supported.If you happen to require support for these browsers, please continue to use the
1.0.x
version range.
Updated benchmark results: 3cfb6c3
Because Array.isArray
is highly optimized in all modern JS engines, we received a bit of a speed boost!
Below is [email protected]
versus this release, running in Node.js 10.13.0
# Strings
clsx (prev) x 10,336,101 ops/sec ±1.45% (90 runs sampled)
clsx x 11,191,101 ops/sec ±0.51% (97 runs sampled)
# Objects
clsx (prev) x 7,195,049 ops/sec ±0.35% (92 runs sampled)
clsx x 7,133,215 ops/sec ±0.31% (93 runs sampled)
# Arrays
clsx (prev) x 8,265,223 ops/sec ±0.32% (94 runs sampled)
clsx x 8,346,704 ops/sec ±0.29% (98 runs sampled)
# Nested Arrays
clsx (prev) x 6,244,513 ops/sec ±1.41% (94 runs sampled)
clsx x 6,324,445 ops/sec ±0.38% (95 runs sampled)
# Nested Arrays w/ Objects
clsx (prev) x 5,157,630 ops/sec ±0.34% (92 runs sampled)
clsx x 6,349,877 ops/sec ±0.26% (97 runs sampled)
# Mixed
clsx (prev) x 5,751,180 ops/sec ±0.38% (95 runs sampled)
clsx x 6,722,160 ops/sec ±0.36% (98 runs sampled)
# Mixed (Bad Data)
clsx (prev) x 1,935,973 ops/sec ±0.19% (97 runs sampled)
clsx x 2,053,230 ops/sec ±0.27% (95 runs sampled)
Ignore function arguments: 4aff569
Separate Array and Object loops: 91f5e68
While this did add ~20 bytes to the package (which is a 10% size increase), it made any Array interactions 200% to 600% faster! 🎉 Below is a performance comparison between [email protected]
and [email protected]
running on Node v10.13.0:
# Strings
clsx (prev) x 10,661,038 ops/sec ±0.46% (92 runs sampled)
clsx x 11,066,632 ops/sec ±0.23% (96 runs sampled)
# Objects
clsx (prev) x 6,934,269 ops/sec ±0.23% (94 runs sampled)
clsx x 7,147,168 ops/sec ±0.30% (95 runs sampled)
# Arrays
clsx (prev) x 1,681,568 ops/sec ±0.32% (97 runs sampled)
clsx x 7,922,225 ops/sec ±0.18% (95 runs sampled)
# Nested Arrays
clsx (prev) x 940,741 ops/sec ±0.33% (96 runs sampled)
clsx x 6,132,222 ops/sec ±0.49% (95 runs sampled)
# Nested Arrays w/ Objects
clsx (prev) x 1,428,975 ops/sec ±0.15% (95 runs sampled)
clsx x 5,156,844 ops/sec ±0.22% (95 runs sampled)
# Mixed
clsx (prev) x 2,198,907 ops/sec ±0.34% (98 runs sampled)
clsx x 5,577,715 ops/sec ±0.20% (93 runs sampled)
# Mixed (Bad Data)
clsx (prev) x 1,038,752 ops/sec ±0.32% (94 runs sampled)
clsx x 1,887,010 ops/sec ±0.14% (96 runs sampled)
Changed "module"
entry file to .js
extension (#7): 29b2fce
Unfortunately, webpack changed how they treat .mjs
files somewhat recently. This is a huge step backwards and hopefully they revert this change soon. See https://github.com/dmtrKovalenko/material-ui-pickers/issues/894