mrkeyoor.com_
Sun 13 Sept 06:24 UTC
Webevaluationupdated 13 Sept 2026

fabric.js review

Fabric.js turns an HTML canvas into an object editor whose shapes, text, images, groups, and controls can be moved, resized, rotated, serialized, and exported. It solves the low-level event handling and geometry work behind browser design tools, while also supporting server-side rendering through a separate Node package.

Verdict

Our Fabric.js run installed 843 packages in 31 seconds and built in 23 seconds, but it exposed no test target for us to run, so serious editors need their own saved-document and rendering regressions. Use it when you need an established object model with interaction controls, JSON, SVG, and matching browser and Node entrypoints. Choose a narrower renderer when native Node canvas setup, package lockstep, or editor-specific edge cases cost more than those features save.

We ran it

Lab card: what happened when we ran fabric.jsScreenshot of fabric.js (fabricjs.com)
Install✓ · 31s843 packages · 544 MB
Build✓ · 23s
Testsn/ano test script
Repo1963 files~109,490 lines of source · 61.3 MB · 11 CI workflows · tests dir

Answers from our run

Does fabric.js build from source?

Dependencies installed in 31 seconds (843 packages), and the build succeeded in 23 seconds. We cloned commit 9752ff4 into a clean Debian container with 3 CPUs and no project-specific setup.

Does fabric.js have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Who should not use fabric.js?

Teams that need a DOM-free drawing core: the README says @fabricjs/core still requires an environment implementation for APIs that touch the DOM or canvas.

What are the alternatives to fabric.js?

Konva, PixiJS, Paper.js. Our Fabric.

Setup4/531-second install and 23-second build; Node adds native canvas work
Docs4/5Clear package split and platform limits, with brief examples
Community5/531,435 stars and active issues and pull requests in September 2026
Maturity5/5Version 7.4.0, 11 workflows, and a 2026-09-12 push

Who it’s for

Frontend developers building diagram editors, product customizers, annotation tools, or browser design software.
Teams that need editable Canvas objects plus JSON and SVG import or export.
Node developers rendering the same scene model to PNG outside the browser.
Maintainers prepared to pin matching Fabric.js workspace package versions and test their own object combinations.

Who it’s NOT for

Teams that need a DOM-free drawing core: the README says @fabricjs/core still requires an environment implementation for APIs that touch the DOM or canvas.
Node deployments that cannot accommodate native canvas dependencies: Fabric.js relies on node-canvas and points users to its platform-specific installation guide.
Products supporting IE11 or legacy Edge: both are explicitly unsupported.
Editors that cannot regression-test saved groups and layered effects: open issue 11016 reports misplaced group items after JSON reload, while issue 10855 reports an exception when exporting grouped text, shadows, and a clip path.

Setup reality

At commit 9752ff4, our sandbox installed 843 pnpm packages in 31 seconds and used 544 MB on disk. The 61.3 MB checkout contained 1,963 files and about 109,490 source lines. Its build passed in 23 seconds. We skipped tests because the repository exposed no test script or target to our runner.

Browser use needs no credentials or hosted service. New projects choose @fabricjs/browser or @fabricjs/node; extensions are separate imports. The README warns that all fabric and @fabricjs/* packages must stay on matching versions or an application can load separate runtimes.

Node.js 20 is the documented minimum. Server rendering depends on node-canvas and jsdom, so native libraries and canvas implementation limits become part of deployment. The core package is environment-neutral, but it is not DOM-free. Our checkout had no Dockerfile, so container packaging remains the adopter's job.

Fabric.js gives Canvas objects an editor interaction model

Fabric.js version 7.4.0 wraps the browser's immediate-mode Canvas API in objects that retain position, scale, angle, styles, and relationships. A rectangle can be selected, dragged, rotated, grouped, serialized to JSON, restored, and exported without an application rebuilding all of that behavior. Built-in shapes, text, images, filters, gradients, patterns, brushes, animations, and controls cover much of the machinery behind a design surface. The library also reads and writes SVG, though an SVG round trip should be tested with the exact documents a product accepts.

The current package split matters. New browser applications use @fabricjs/browser; server rendering uses @fabricjs/node; the old fabric package remains a compatibility facade. Advanced consumers can import @fabricjs/core and individual extensions. The README warns that these packages must have matching versions because a mismatch can load separate runtime copies with different class identities. That is an unusual failure mode, and it deserves a package-manager constraint in a monorepo rather than a comment in onboarding notes.

Node.js 20 support still depends on native canvas libraries

Node.js 20 is the documented minimum, and @fabricjs/node depends on node-canvas for the canvas implementation plus jsdom for a window. The project links directly to the native installation instructions and warns that node-canvas bugs and limits apply. Rendering a scene to PNG on a server is useful, especially when the browser and backend share object JSON, but deployment now includes system libraries and native-module compatibility that browser-only teams never see.

Browser setup is easier: install the browser package, create a Canvas, and attach it to an HTML canvas element. The public API supplies selection and transformation behavior that would otherwise require pointer tracking, hit testing, coordinate conversions, and redraw logic. Supported environments include current Chromium-based browsers, Firefox, and Safari, while IE11 and legacy Edge are explicitly out. If an application still serves those older engines, Fabric.js is already ruled out.

What happened when we ran it

Our measurement setup was a fresh unprivileged sandbox, where pnpm installed commit 9752ff4 in 31 seconds. It added 843 packages and occupied 544 MB on disk, on top of a 61.3 MB checkout containing 1,963 files and about 109,490 source lines. The build passed in 23 seconds on 3 CPUs with 8 GB of RAM. Those figures make a local evaluation easy enough, while the installed size is substantial for a library whose browser import can look deceptively small.

We could not run a test suite because the repository exposed no test script or target to our runner, so the test step was skipped. That finding does not mean the project has no tests: our scan found a tests directory and 11 CI workflow files. It means the same checkout that built cleanly did not present a runnable test command through the lab's discovery path. The repository had no Dockerfile, leaving adopters to define any repeatable container build themselves.

Versions 6.3 through 7.4 have an open group reload report

Versions 6.3 through 7.4 are named in issue 11016, where grouped items reportedly return with the wrong display or position after a JSON reload and subsequent ungrouping. Serialization is central to editors that save user work. The report does not include a reproduction link, so it is evidence of an unresolved user case rather than proof that every group fails. Test nested groups, custom properties, and upgrade migrations against real saved documents before changing the package version.

Effects can interact in less ordinary combinations. Issue 10855 includes a reproduction where grouped text with a shadow and a clip path throws while exporting a data URL in version 6.6.4. Another open report, issue 11074, says image-loading failures do not expose the HTTP status and response body the user needs. A basic canvas demo will not exercise either path. An editor should keep a small corpus of troublesome documents and verify exports, image failures, copy and paste, and undo behavior around each release.

Version 7.4.0 fixes security while migration work continues

The latest GitHub release is version 7.4.0, published May 18, 2026. Its notes lead with a fix for CVE-2026-44311 and also mention viewport rotation corrections. The repository was pushed again on September 12, 2026, and a same-day issue about hardening build-stat handling received immediate project attention. That combination is stronger evidence of maintenance than the release date alone. GitHub listed 467 open issues and pull requests, including 428 issues and 39 pull requests in separate searches, so activity comes with a large triage queue.

The project has also changed how new applications consume it. Browser and Node packages now make the environment boundary clearer, while compatibility imports remain for existing applications. That transition reduces unwanted Node dependencies in browser work, but it creates another upgrade detail: extension packages and the facade must stay aligned. Teams moving from version 5 or 6 should budget for document fixtures, TypeScript checks, and visual comparisons instead of treating a major update as a package-name substitution.

Fabric.js earns its place when the product is an editor

A diagram editor, label designer, image annotator, or product customizer benefits from Fabric.js because object selection and manipulation are the product, not an incidental animation. JSON persistence and SVG exchange make its scene graph useful beyond one render. The 31-second install and successful 23-second build lower the cost of a trial, and the browser package requires no service account or remote backend. Start with a real workflow that includes loading, editing, saving, reopening, and exporting the same document.

For games, particle fields, or draw-heavy visualizations, PixiJS is a more direct renderer. Konva is worth comparing for a smaller retained Canvas layer, while Paper.js suits path construction and vector geometry. Fabric.js asks for more dependency weight and more care around package versions because it solves a broader editor problem. Pick it when those editor behaviors remove months of application code, then own the regression suite the repository did not expose to our sandbox.

Alternatives

ProjectWhat it isPick it when
KonvaA 2D Canvas framework with retained shapes, events, drag controls, and framework bindings.pick this instead when you want a smaller retained-mode Canvas API and do not need Fabric.js's SVG and editor-oriented object model.
PixiJSA GPU-focused 2D renderer for interactive scenes, games, and visual effects.pick this instead when rendering throughput and WebGL or WebGPU scenes matter more than built-in editing handles and serialization.
Paper.jsA vector graphics scripting framework built around paths, curves, and geometry.pick this instead when precise vector construction and path math are the main job rather than an object editor.

What people are saying

  1. [velocity-scout] fabricjs/fabric.js

Sources

  1. Fabric.js README
  2. Fabric.js repository
  3. Fabric.js version 7.4.0 release
  4. Issue 11016: group reload
  5. Issue 10855: grouped text, shadow, and clip path export
  6. Issue 11074: image loading error details

More web reviews

uBlock · OI-wiki · dioxus · Folo · Babylon.js · react-navigation · the whole board →