Vercel Now(旧ZEIT Now)上でnode-canvasを動かす
このサイトでは、記事のサムネイルなんかを作るためにnode-canvasを使用しています。 で、サーバにはVercel Nowを使っています。
node-canvasにはいくつかの共有ライブラリへの依存があるのですが、以下のものはNow上では使用出来ません。
- libuuid.so
- libmount.so
- libblkid.so
なので、何も考えずのnode-canvasをimportしようとすると以下のようなエラーが出てしまいます。
undefined ERROR Error: libuuid.so.1: cannot open shared object file: No such file or directory at Object.Module._extensions..node (internal/modules/cjs/loader.js:807:18) at Module.load (internal/modules/cjs/loader.js:653:32) at tryModuleLoad (internal/modules/cjs/loader.js:593:12) at Function.Module._load (internal/modules/cjs/loader.js:585:3) at Module.require (internal/modules/cjs/loader.js:692:17) at require (internal/modules/cjs/helpers.js:25:18) at Object.<anonymous> (/var/task/node_modules/canvas/lib/bindings.js:3:18) at Module._compile (internal/modules/cjs/loader.js:778:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) at Module.load (internal/modules/cjs/loader.js:653:32)
しかたがないので、これらを解決してあげる必要があります。
依存関係を解決するためのコマンドは以下のような感じ。
これがnpm run build
する前に動いてくれればOKです。
$ yum install libuuid-devel libmount-devel $ cp /lib64/{libuuid,libmount,libblkid}.so.1 node_modules/canvas/build/Release/
これを実行してもらうために、package.jsonを以下のように編集します。
{ "scripts": { "now-build": "yum install libuuid-devel libmount-devel && cp /lib64/{libuuid,libmount,libblkid}.so.1 node_modules/canvas/build/Release/ && npm run build" // ...そのほか色々... } }
scriptsにnow-build
っていうのを入れておくと、build
の代わりに使ってくれるみたいです。
これを利用して、さきほどのコマンドを実行している感じ。
あとは通常通り、node-canvasが使えるようになっているはずです。