yarn v1で画像最適化ライブラリ「sharp」を使う

結論から

sharp v0.33.0からyarn v1のサポートが切られました。詳しくは以下のissueをご覧ください。

このサポート範囲は、package.jsonのenginesの値で制御されています。
そのため、package.jsonに記述されているenginesフィールドを無視してインストールすれば、yarn v1でもsharp v0.33.0以降を利用できます。

### 単体でインストールする場合
$ yarn add sharp --ignore-engines

### 全体installする時
$ yarn install --ignore-engines

※ 上記コマンドの実行は自己責任でお願いします。
enginesフィールドを無視することは大きなリスクを伴います。上記コマンドはsharp以外のインストールにも影響を及ぼします。意図しない動作やバグを引いても、ライブラリ制作者のサポートには期待できませんので注意してください。

sharp - High performance Node.js image processingsharp - High performance Node.js image processinghttps://sharp.pixelplumbing.com/

sharpは環境依存なライブラリだから

sharpは実行環境(OSやCPUアーキテクチャ)に応じて最適化されている環境依存なライブラリです。 そのため、実行環境に応じたsharp(prebuilt binary)を適切にインストールする必要があります。

基本的には、yarn add sharpyarn installの実行時に、自動的に環境を判別して適切なprebuilt binary(@img/sharp-linux-x64など)をインストールしてくれます。しかし、sharp v0.33.0以降においてyarn v1を使用している場合、yarn installを実行するだけではprebuilt binaryをインストールしてくれません。

調べてみると、sharp自体のpackage.jsonでは、engines.yarnが記載されていないのですが、prebuilt binaryのpackage.jsonでは、engines.yarnのバージョン範囲が指定されているようでした。

すなわち、sharp v0.33.0以降においてyarn v1を使用している場合にyarn installを実行すると

「prebuilt binaryを使用するためのインタフェース(sharp)はインストールされるものの、engines.yarnのバージョン範囲に適合しないためprebuilt binary(@img/sharp-linux-x64など)はインストールされない」ため、実際には動作しないsharpが爆誕することになります。

それでもyarn v1でsharpを使いたい

sharp v0.33.0以降においてyarn v1を使用している場合にyarn installを実行すると、実際には動作しないsharpが爆誕する

これを回避するためには、sharpのprebuilt binaryのpackage.jsonで指定されているengines.yarnを無視するのが一番簡単です。そのため、yarn install --ignore-enginesで動くようになります。

ですが、冒頭にも述べたようにenginesフィールドを無視することは大きなリスクを伴います。 そのため、できればyarn v3以降を利用できないか検討してみてください。

おわりに

sharpは、かの有名なNext.jsや、弊ブログでも使用しているGatsby.jsでも内部的に使用されています。 画像のリサイズ、容量削減、WebPへのフォーマット変換など、いわゆる画像最適化を担う重要なライブラリです。

そのため、意識的にsharpを利用していなくても、メジャーなフレームワークが内部的に使用するsharpがv0.33.0以上に更新された場合は、yarn v1の利用を見直す必要があります。

今後のsharpやメジャーなフレームワークの動向には注意していきたいですね