Skip to content

Commit 081fcf6

Browse files
authored
perf: uninstall classnames, install clsx (#583)
* perf: uninstall classnames, install clsx * perf: uninstall classnames, install clsx
1 parent 2b40fbd commit 081fcf6

File tree

9 files changed

+48
-38
lines changed

9 files changed

+48
-38
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ es
2727
coverage
2828
yarn.lock
2929
package-lock.json
30+
pnpm-lock.yaml
3031
bun.lockb
3132
.vscode
3233

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,13 @@
4545
"@rc-component/portal": "^2.0.0",
4646
"@rc-component/resize-observer": "^1.0.0",
4747
"@rc-component/util": "^1.2.1",
48-
"classnames": "^2.3.2"
48+
"clsx": "^2.1.1"
4949
},
5050
"devDependencies": {
5151
"@rc-component/father-plugin": "^2.0.0",
5252
"@rc-component/np": "^1.0.3",
5353
"@testing-library/jest-dom": "^6.1.4",
5454
"@testing-library/react": "^16.0.0",
55-
"@types/classnames": "^2.2.10",
5655
"@types/jest": "^29.5.2",
5756
"@types/node": "^24.0.3",
5857
"@types/react": "^19.1.2",

src/Popup/Arrow.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import classNames from 'classnames';
1+
import { clsx } from 'clsx';
22
import * as React from 'react';
33
import type { AlignType, ArrowPos, ArrowTypeOuter } from '../interface';
44

@@ -57,7 +57,7 @@ export default function Arrow(props: ArrowProps) {
5757
return (
5858
<div
5959
ref={arrowRef}
60-
className={classNames(`${prefixCls}-arrow`, className)}
60+
className={clsx(`${prefixCls}-arrow`, className)}
6161
style={{ ...alignStyle, ...style }}
6262
>
6363
{content}

src/Popup/Mask.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import classNames from 'classnames';
1+
import { clsx } from 'clsx';
22
import type { CSSMotionProps } from '@rc-component/motion';
33
import CSSMotion from '@rc-component/motion';
44
import * as React from 'react';
@@ -36,7 +36,7 @@ export default function Mask(props: MaskProps) {
3636
{({ className }) => (
3737
<div
3838
style={{ zIndex }}
39-
className={classNames(
39+
className={clsx(
4040
`${prefixCls}-mask`,
4141
mobile && `${prefixCls}-mobile-mask`,
4242
className,

src/Popup/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import classNames from 'classnames';
1+
import { clsx } from 'clsx';
22
import type { CSSMotionProps } from '@rc-component/motion';
33
import CSSMotion from '@rc-component/motion';
44
import ResizeObserver, {
@@ -266,7 +266,7 @@ const Popup = React.forwardRef<HTMLDivElement, PopupProps>((props, ref) => {
266266
{ className: motionClassName, style: motionStyle },
267267
motionRef,
268268
) => {
269-
const cls = classNames(prefixCls, motionClassName, className, {
269+
const cls = clsx(prefixCls, motionClassName, className, {
270270
[`${prefixCls}-mobile`]: isMobile,
271271
});
272272

src/UniqueProvider/UniqueContainer.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import useOffsetStyle from '../hooks/useOffsetStyle';
3-
import classNames from 'classnames';
3+
import { clsx } from 'clsx';
44
import CSSMotion from '@rc-component/motion';
55
import type { CSSMotionProps } from '@rc-component/motion';
66
import type { AlignType, ArrowPos } from '../interface';
@@ -86,9 +86,12 @@ const UniqueContainer = (props: UniqueContainerProps) => {
8686
}}
8787
>
8888
{({ className: motionClassName, style: motionStyle }) => {
89-
const cls = classNames(containerCls, motionClassName, uniqueContainerClassName, {
90-
[`${containerCls}-visible`]: motionVisible,
91-
});
89+
const cls = clsx(
90+
containerCls,
91+
motionClassName,
92+
uniqueContainerClassName,
93+
{ [`${containerCls}-visible`]: motionVisible },
94+
);
9295

9396
return (
9497
<div

src/UniqueProvider/index.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { useEvent } from '@rc-component/util';
1313
import useTargetState from './useTargetState';
1414
import { isDOM } from '@rc-component/util/lib/Dom/findDOMNode';
1515
import UniqueContainer from './UniqueContainer';
16-
import classNames from 'classnames';
16+
import { clsx } from 'clsx';
1717
import { getAlignPopupClassName } from '../util';
1818

1919
export interface UniqueProviderProps {
@@ -128,7 +128,7 @@ const UniqueProvider = ({
128128
false, // alignPoint is false for UniqueProvider
129129
);
130130

131-
return classNames(
131+
return clsx(
132132
baseClassName,
133133
mergedOptions.getPopupClassNameFromAlign?.(alignInfo),
134134
);
@@ -186,7 +186,7 @@ const UniqueProvider = ({
186186
portal={Portal}
187187
prefixCls={prefixCls}
188188
popup={mergedOptions.popup}
189-
className={classNames(
189+
className={clsx(
190190
mergedOptions.popupClassName,
191191
alignedClassName,
192192
`${prefixCls}-unique-controlled`,
@@ -239,7 +239,7 @@ const UniqueProvider = ({
239239
}}
240240
popupSize={popupSize}
241241
motion={mergedOptions.popupMotion}
242-
uniqueContainerClassName={classNames(
242+
uniqueContainerClassName={clsx(
243243
mergedOptions.uniqueContainerClassName,
244244
alignedClassName,
245245
)}

src/index.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Portal from '@rc-component/portal';
2-
import classNames from 'classnames';
2+
import { clsx } from 'clsx';
33
import type { CSSMotionProps } from '@rc-component/motion';
44
import ResizeObserver from '@rc-component/resize-observer';
55
import { isDOM } from '@rc-component/util/lib/Dom/findDOMNode';
@@ -511,7 +511,7 @@ export function generateTrigger(
511511
alignPoint,
512512
);
513513

514-
return classNames(baseClassName, getPopupClassNameFromAlign?.(alignInfo));
514+
return clsx(baseClassName, getPopupClassNameFromAlign?.(alignInfo));
515515
}, [
516516
alignInfo,
517517
getPopupClassNameFromAlign,
@@ -804,10 +804,7 @@ export function generateTrigger(
804804
ref={setPopupRef}
805805
prefixCls={prefixCls}
806806
popup={popup}
807-
className={classNames(
808-
popupClassName,
809-
!isMobile && alignedClassName,
810-
)}
807+
className={clsx(popupClassName, !isMobile && alignedClassName)}
811808
style={popupStyle}
812809
target={targetEle}
813810
onMouseEnter={onPopupMouseEnter}

tests/unique.test.tsx

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React from 'react';
33
import Trigger, { UniqueProvider, type UniqueProviderProps } from '../src';
44
import { awaitFakeTimer } from './util';
55
import type { TriggerProps } from '../src';
6-
import classNames from 'classnames';
6+
import { clsx } from 'clsx';
77

88
// Mock UniqueContainer to check if open props changed
99
global.openChangeLog = [];
@@ -185,21 +185,30 @@ describe('Trigger.Unique', () => {
185185
});
186186

187187
it('should apply uniqueContainerClassName to UniqueContainer component', async () => {
188-
await setupAndOpenPopup({ uniqueContainerClassName: 'custom-container-class' });
188+
await setupAndOpenPopup({
189+
uniqueContainerClassName: 'custom-container-class',
190+
});
189191

190192
// Check that UniqueContainer has the custom container className
191-
const uniqueContainer = document.querySelector('.rc-trigger-popup-unique-container');
193+
const uniqueContainer = document.querySelector(
194+
'.rc-trigger-popup-unique-container',
195+
);
192196
expect(uniqueContainer).toBeTruthy();
193197
expect(uniqueContainer.className).toContain('custom-container-class');
194198
});
195199

196200
it('should apply uniqueContainerStyle to UniqueContainer component', async () => {
197201
await setupAndOpenPopup({
198-
uniqueContainerStyle: { backgroundColor: 'red', border: '1px solid blue' },
202+
uniqueContainerStyle: {
203+
backgroundColor: 'red',
204+
border: '1px solid blue',
205+
},
199206
});
200207

201208
// Check that UniqueContainer has the custom container style
202-
const uniqueContainer = document.querySelector('.rc-trigger-popup-unique-container');
209+
const uniqueContainer = document.querySelector(
210+
'.rc-trigger-popup-unique-container',
211+
);
203212
expect(uniqueContainer).toBeTruthy();
204213
expect(uniqueContainer).toHaveStyle({
205214
backgroundColor: 'red',
@@ -211,7 +220,9 @@ describe('Trigger.Unique', () => {
211220
await setupAndOpenPopup();
212221

213222
// Check that UniqueContainer exists but does not have custom container className
214-
const uniqueContainer = document.querySelector('.rc-trigger-popup-unique-container');
223+
const uniqueContainer = document.querySelector(
224+
'.rc-trigger-popup-unique-container',
225+
);
215226
expect(uniqueContainer).toBeTruthy();
216227
expect(uniqueContainer.className).not.toContain('undefined');
217228
});
@@ -246,12 +257,14 @@ describe('Trigger.Unique', () => {
246257
);
247258

248259
expect(document.querySelector('.rc-trigger-popup')).toHaveClass('bamboo');
249-
expect(document.querySelector('.rc-trigger-popup-unique-container')).toHaveClass(
250-
'bamboo',
251-
);
260+
expect(
261+
document.querySelector('.rc-trigger-popup-unique-container'),
262+
).toHaveClass('bamboo');
252263

253264
// Check that arrow position CSS variables are set
254-
const uniqueContainer = document.querySelector('.rc-trigger-popup-unique-container');
265+
const uniqueContainer = document.querySelector(
266+
'.rc-trigger-popup-unique-container',
267+
);
255268
const computedStyle = getComputedStyle(uniqueContainer);
256269
expect(computedStyle.getPropertyValue('--arrow-x')).not.toBe('');
257270
expect(computedStyle.getPropertyValue('--arrow-y')).not.toBe('');
@@ -262,10 +275,7 @@ describe('Trigger.Unique', () => {
262275
options,
263276
) => ({
264277
...options,
265-
popupClassName: classNames(
266-
options.popupClassName,
267-
'custom-post-options-class',
268-
),
278+
popupClassName: clsx(options.popupClassName, 'custom-post-options-class'),
269279
});
270280

271281
render(
@@ -293,7 +303,7 @@ describe('Trigger.Unique', () => {
293303
// Mock useAlign to return our mock onAlign function
294304
const useAlignModule = require('../src/hooks/useAlign');
295305
const originalUseAlign = useAlignModule.default;
296-
306+
297307
jest.spyOn(useAlignModule, 'default').mockImplementation((...args) => {
298308
const originalResult = originalUseAlign(...args);
299309
// Replace onAlign with our mock
@@ -319,7 +329,7 @@ describe('Trigger.Unique', () => {
319329

320330
return (
321331
<div>
322-
<button
332+
<button
323333
className="switch-trigger-btn"
324334
onClick={() => {
325335
// Switch which trigger is open - this changes the target

0 commit comments

Comments
 (0)