typescript - 「Canvasはコンストラクタではありません」エラー - Angular 6でFabricJSを使用する
私は最近Angular 5から6にアップグレードされたプロジェクトに取り組んでいます。新しい機能を追加しており、データから画像を描画する必要があるため、CanvasやSVGのDOMオブジェクトを使おうとしています。FabricJSには私が必要とする多くの機能があります。
昨夜、プロジェクトに追加しようとしました。ウェブサイトからFabricJSのフルDEV/MINバージョン、v2.3.3をダウンロードしました。それから、node_modulesフォルダに「fabric」フォルダを作り、そこに*.jsファイルを入れました。angular.jsonファイルを編集して、次のようにしました:
"scripts": [
"node_modules/fabric/fabric.js"
]
次に、これを使って typings.d.ts ファイルを作成しました:
declare const fabric: any;
最後に、私のモジュールでは、このようにインポートします:
import * as fabric from 'fabric';
ページにキャンバス要素を置き、それに「C」と名前を付けました
<canvas id="c"></canvas>
そして次に、布コードを使用してみてください:
// create a wrapper around native canvas element (with id="c")
const canvas = new fabric.Canvas('c');
ファブリックコードが実行されると、エラーが発生します:
***ERROR TypeError: fabric__WEBPACK_IMPORTED_MODULE_2__.Canvas is not a constructor
at SafeSubscriber._next***
これが何を意味するのか、私はあまりよく分かりません。答えを探すのに少し時間を費やしましたが、あまり多くは見つかりませんでした。ただ、こちらのページは見つけました:
Fabric.js と Typescript と Webpack: Canvas はコンストラクタではありません
これは私の問題にかなり似ていますが、私はまだAngularに慣れていないため、何が起こっているのか常に理解できるわけではありません。その投稿では、webpack.mix.jsファイルを変更することについて話しています。しかし、私はそのようなファイルを持っておらず、Angular 6には新しいバージョンのWebPackがあることを知っています。もしかしたらそれが問題を引き起こしているのでしょうか?
これをどう直すかについて何か考えはありますか?どこから始めればいいですか?
回答 #1
まず最初に確認するのは、インポート文です。
生地は〜として輸入されます
import { fabric } from 'fabric';
webpackの設定やFabric全般に関しては、こちらをご覧ください:
https://github.com/fabricjs/fabricjs-webpack
ここでは、必要に応じて npm モジュールを直接使用するための設定例を見つけることができます。またいずれにしても、webpack が Node の依存関係をバンドルしようとするのを回避するのに役立ちます。
回答 #2
私は次の手順に従って、グローバル輸出としてファブリックを使用しています:
npm install fabricを実行する- スクリプトに追加:
["node_modules/fabric/dist/fabric.js"] - typings.d.ts に追加してください:
declare const fabric: any; - インポートせずに使用してください:
const canvas=new fabric.Canvas('c'); - 利益
最後の部分が欠けていると思います。もしAngularのスクリプトにライブラリを追加すると、インポートする必要はなくなります。さもなければ、ライブラリの異なるコピーが2つ存在することになります。モジュールとして使用したい場合は、スクリプト配列に追加すべきではありません。詳細はこちら: https://github.com/angular/angular-cli/wiki/stories-global-scripts#using-global-libraries-inside-your-app
これが役に立てば幸いです。