Skip to content

Commit 6e6948f

Browse files
authored
Merge pull request #2 from react18-tools/optimize
Optimize
2 parents 7cd7c13 + ae89b6b commit 6e6948f

File tree

9 files changed

+69
-16
lines changed

9 files changed

+69
-16
lines changed

.changeset/lazy-doors-give.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"react-mouse-trails": patch
3+
---
4+
5+
Pause the render loop when not required.

.changeset/pre.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"mode": "exit",
3+
"tag": "optimize",
4+
"initialVersions": {
5+
"@example/nextjs": "0.0.0",
6+
"@example/vite": "0.0.0",
7+
"react-mouse-trails": "0.0.1",
8+
"@repo/eslint-config": "0.0.0",
9+
"@repo/typescript-config": "0.0.0",
10+
"@repo/shared": "0.0.1",
11+
"@repo/scripts": "0.0.0"
12+
},
13+
"changesets": [
14+
"lazy-doors-give"
15+
]
16+
}

lib/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# react-mouse-trails
22

3+
## 0.0.2-optimize.0
4+
5+
### Patch Changes
6+
7+
- 18657b1: Pause the render loop when not required.
8+
39
## 0.0.1
410

511
### Patch Changes

lib/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "react-mouse-trails",
33
"author": "Mayank Kumar Chaudhari <https://mayank-chaudhari.vercel.app>",
44
"private": false,
5-
"version": "0.0.1",
5+
"version": "0.0.2-optimize.0",
66
"description": "A lightweight WebGL-based React component for creating a mouse trail effect.",
77
"license": "MPL-2.0",
88
"main": "./dist/index.js",

lib/src/client/mouse-trail/mouse-trail.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import styles from "./mouse-trail.module.scss";
33
import { trails } from "../../utils";
44

55
export interface MouseTrailProps extends HTMLProps<HTMLCanvasElement> {
6+
/** Trail color tuple RGB color values - 0.0 to 1.0 */
67
rgb?: [number, number, number];
78
}
89

@@ -17,7 +18,6 @@ export const MouseTrail = ({ className, rgb, ...props }: MouseTrailProps) => {
1718
useEffect(() => {
1819
const canvas = canvasRef.current;
1920
const gl = canvas?.getContext("webgl");
20-
console.log({ canvas, gl });
2121
if (!gl || !canvas) return;
2222
const onResize = () => {
2323
canvas.width = innerWidth;

lib/src/utils.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export const trails = (
3838
/* v8 ignore next */
3939
gl.deleteShader(shader);
4040
/* v8 ignore next */
41-
throw new Error(`Could not compile WebGL shader. \n\n" ${info}`);
41+
throw new Error("Could not compile WebGL shader. \n\n" + info); // skipcq: JS-0246
4242
/* v8 ignore next */
4343
}
4444
return shader;
@@ -80,18 +80,13 @@ export const trails = (
8080
const positionBuffer = createBuffer();
8181
const timeBuffer = createBuffer();
8282

83+
let runningAnim = false;
8384
let positions: number[] = [];
8485
let fades: number[] = [];
85-
canvas.addEventListener("mousemove", (event: MouseEvent) => {
86-
const x = (event.clientX / canvas.width) * 2 - 1;
87-
const y = (event.clientY / canvas.height) * -2 + 1;
88-
89-
positions.unshift(x, y);
90-
fades.unshift(1);
91-
});
9286

93-
/** Start render loop */
87+
/** The render loop */
9488
const render = () => {
89+
runningAnim = true;
9590
fades = fades.map(fade => fade / 1.1);
9691
positions = positions.filter((_, index) => fades[index] > 0.001);
9792
fades = fades.filter(fade => fade > 0.01);
@@ -107,8 +102,16 @@ export const trails = (
107102

108103
gl.drawArrays(gl.LINE_STRIP, 0, positions.length / 2);
109104

110-
requestAnimationFrame(render);
105+
positions.length ? requestAnimationFrame(render) : (runningAnim = false);
111106
};
112107
gl.clearColor(0.0, 0.0, 0.0, 0.0);
113-
render();
108+
109+
canvas.addEventListener("mousemove", (event: MouseEvent) => {
110+
const x = (event.clientX / canvas.width) * 2 - 1;
111+
const y = (event.clientY / canvas.height) * -2 + 1;
112+
113+
positions.unshift(x, y);
114+
fades.unshift(1);
115+
!runningAnim && render();
116+
});
114117
};

lib/tsup.config.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,36 @@ import { defineConfig, type Options } from "tsup";
22
import react18Plugin from "esbuild-plugin-react18";
33
import cssPlugin from "esbuild-plugin-react18-css";
44
import { rdiPlugin } from "esbuild-plugin-rdi";
5+
import fs from "fs";
56

67
export default defineConfig(
78
(options: Options) =>
89
({
910
format: ["cjs", "esm"],
1011
target: "es2019",
11-
entry: ["./src/index.ts"],
12+
entry: ["./src"],
1213
sourcemap: false,
1314
clean: !options.watch,
1415
bundle: true,
1516
minify: !options.watch,
1617
esbuildPlugins: [
18+
{
19+
name: "minify",
20+
setup(build) {
21+
if (options.watch) return;
22+
build.onLoad({ filter: /utils\.ts$/, namespace: "file" }, args => {
23+
const text = fs.readFileSync(args.path, "utf8");
24+
const contents = text
25+
.replace(/if \(!gl[^}]*}/gm, "")
26+
.replace(/;\s*if \(![^;]*;/gm, "!;")
27+
.replace(/`[^`]*`/gm, match => match.replace(/\s+/g, " ").trim())
28+
.trim();
29+
return { contents, loader: "ts" };
30+
});
31+
},
32+
},
1733
react18Plugin({ disableJSXRequireDedup: true }),
18-
cssPlugin({ generateScopedName: "[folder]__[local]" }),
34+
cssPlugin({ generateScopedName: "rt_[local]" }),
1935
rdiPlugin(),
2036
],
2137
...options,

packages/shared/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# @repo/shared
22

3+
## 0.0.2-optimize.0
4+
5+
### Patch Changes
6+
7+
- Updated dependencies [18657b1]
8+
9+
310
## 0.0.1
411

512
### Patch Changes

packages/shared/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@repo/shared",
3-
"version": "0.0.1",
3+
"version": "0.0.2-optimize.0",
44
"private": true,
55
"sideEffects": false,
66
"main": "./dist/index.js",

0 commit comments

Comments
 (0)