category icon
2023-11-19
JavaScript - Nuxt3

Nuxt3 で fabric.js を使う方法

nuxt
3.8.1
fabric
5.3.0
@types/fabric
5.3.6
profile
hikaru
Software Developer / DIY'er

(1) fabric パッケージを追加する

bash
> npm i fabric
> npm i -D @types/fabric
package.json
{
  "name": "nuxt-app",
  "private": true,
  "type": "module",
  "scripts": {
    "build": "nuxt build",
    "dev": "nuxt dev",
    "preview": "nuxt preview",
    "postinstall": "nuxt prepare"
  },
  "devDependencies": {
    "@types/fabric": "^5.3.6",
    "nuxt": "^3.8.1"
  },
  "dependencies": {
    "fabric": "^5.3.0"
  }
}

(2) fabric を内包した AppCanvas コンポーネントを作成する

components/AppCanvas.vue
<template>
  <canvas ref="canvasRef" width="300" height="300"></canvas>
</template>

<script lang="ts" setup>
import { fabric } from "fabric";

// template内のキャンバスを参照
const canvasRef = ref<HTMLCanvasElement>();

onMounted(() => {
  // fabricを初期化
  const canvas = new fabric.Canvas(canvasRef.value!);
  canvas.isDrawingMode = true; // お絵描きモードを有効
});
</script>

<style>
canvas {
  border: 1px solid #eee;
}
</style>

(3) AppCanvas を使う

SSR 環境だと Nodejs 上で fabric を import してしまうことになるので、 Nuxt3 が提供する ClientOnly タグを使用してブラウザでのみ AppCanvas コンポーネントを使用するように指定。

app.vue
<template>
  <ClientOnly>
    <AppCanvas></AppCanvas>
  </ClientOnly>
<template>

fabric で手振れ補正(線補正)機能を使う方法

鉛筆ブラシ(fabric.PencilBrush)の decimate のプロパティの数値を適当に大きくすることで線の補正ができる。

components/AppCanvas.vue
<script lang="ts" setup>
import { fabric } from "fabric";

// template内のキャンバスを参照
const canvasRef = ref<HTMLCanvasElement>();

onMounted(() => {
  // fabricを初期化
  const canvas = new fabric.Canvas(canvasRef.value!, {
    isDrawingMode: true, // お絵描きモードを有効
  });

  // 鉛筆ブラシのdecimateのプロパティの数値を適当に大きくすることで線の補正ができる。
  const brush = new fabric.PencilBrush(canvas);
  brush.decimate = 4; // default: 0.4

  // fabricのcanvasにブラシを反映
  canvas.freeDrawingBrush = brush;
});
</script>

おわり。