Astro.js と astro-compress をアップデートしたら Sharp でエラーが出た

# Astro.js と astro-compress をアップデートした

本日（2023年12月28日）、管理下のサイトにてnodeモジュールのアップデートを行ったところ、開発機のWindowsでは問題なかったのだが、ビルドを行うLinux上でエラーが発生した。

以下がアップデート内容（npm-check-updatesを利用）

```sh
@astrojs/check     ^0.3.1  →   ^0.3.4
@astrojs/sitemap   ^3.0.3  →   ^3.0.4
astro              ^4.0.3  →   ^4.0.8
astro-compress     ^2.2.3  →   ^2.2.5
```

エラーメッセージ

```sh
$npm run build

[vite] Error when evaluating SSR module /path_to_project/astro.config.mjs: failed to import "astro-compress"
|- Error: Could not load the "sharp" module using the linux-x64 runtime
ERR_DLOPEN_FAILED: libvips-cpp.so.42: cannot open shared object file: No such file or directory
Possible solutions:
- Add platform-specific dependencies:
    npm install --os=linux --cpu=x64 sharp
  or
    npm install --force @img/sharp-linux-x64
- Consult the installation documentation: https://sharp.pixelplumbing.com/install
    at Object.<anonymous> (/path_to_project/node_modules/astro-compress/node_modules/sharp/lib/sharp.js:85:9)
    at Module._compile (node:internal/modules/cjs/loader:1241:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
    at Module.load (node:internal/modules/cjs/loader:1091:32)
    at Module._load (node:internal/modules/cjs/loader:938:12)
    at Module.require (node:internal/modules/cjs/loader:1115:19)
    at require (node:internal/modules/helpers:130:18)
    at Object.<anonymous> (/path_to_project/node_modules/astro-compress/node_modules/sharp/lib/constructor.js:10:1)
    at Module._compile (node:internal/modules/cjs/loader:1241:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)

[astro] Unable to load your Astro config

Could not load the "sharp" module using the linux-x64 runtime
ERR_DLOPEN_FAILED: libvips-cpp.so.42: cannot open shared object file: No such file or directory
Possible solutions:
- Add platform-specific dependencies:
    npm install --os=linux --cpu=x64 sharp
  or
    npm install --force @img/sharp-linux-x64
```

いや、もちろん[Sharpの記事を書いているくらい](https://qiita.com/bananacoffee/items/d7a4b5cb4afff7efd162)なので、[Sharpのクロスプラットフォーム問題](https://sharp.pixelplumbing.com/install)があるのは知っているが・・・
何故いままで問題なかったのに出てきたのか？

## 【NG】とりあえずSharpをインストールしてみる

エラーメッセージにある通りにSharpをインストールしてみる

```sh
npm install --os=linux --cpu=x64 sharp
or
npm install --force @img/sharp-linux-x64
```

が、どちらも駄目。
そりゃ、AstroやAstro-compressに含まれているのでインストールしたところで使われないし。

`package-lock.json` と `node_module` を一旦削除してみても駄目。

## 【原因判明】Astro と Astro-compress の Sharp の利用バージョンが違う

よくよく見てみるとAstroとAstro-compressの Sharp の利用バージョンが異なっている。

| Package        | Version | Sharp Version |
|:---------------|:-------:|:-------------:|
| astro          | 4.0.8   | 0.33.1 (以上) |
| astro-compress | 2.2.5   | 0.33.0 (固定) |

なるほどこれか。
更に深掘りすると、**astro-compress側がバージョンを固定してしまっている** 模様。

## 解決策

### 1. astro-compressのアップデートを待つ（推奨）

いまは何も触らず、恐らく次のアップデートで対応されると思わるのでそれまで待つ。

### 2. astro と astro-compress が共存できる最新バージョンまで下げる（推奨）

~~[AstroのChangeLog](https://github.com/withastro/astro/blob/main/packages/astro/CHANGELOG.md)を見ると、4.0.8でSharpのアップデートを行っているので、4.0.7に下げれば良い~~

**[訂正]**
astro-compress側が2.2.5でバージョンを固定しているので、 astro-compressを2.2.3（2.2.4は存在しない）にすればエラーは消える。

その上で astro-compress が追いついたら再度アップデートをする。

### 3. Sharpのバージョンを固定する

package.json に `overrides（npm）` や `resolutions（yarn）` を追記してSharpのバージョンを固定してしまう。

```sh
# npmの場合
"overrides": {
  "sharp": "0.33.1"
}

# yarnの場合
"resolutions": {
  "astro/sharp": "0.33.1",
  "astro-compress/sharp": "0.33.1"
},
```

これを行った場合、Sharpのアップデートがあったときに解除するかバージョンを自分で書き直す必要が発生するため、かなり面倒くさい。

## まとめ

Astroとastro-compress、Sharpのアップデートのタイミングにより今後もぼちぼち出そうなので忘備録として書いてみた。
Sharpは便利だけど面倒くさい。

では、皆さん良いお年を。

## 参考

- Astro build failing due to astro-compress dependency
  [https://community.cloudflare.com/t/astro-build-failing-due-to-astro-compress-dependency/592058](https://community.cloudflare.com/t/astro-build-failing-due-to-astro-compress-dependency/592058)
- 依存パッケージの脆弱性修正には、package.jsonのoverrides / resolutionsフィールドを使いましょう

https://qiita.com/masato_makino/items/20d4fcfc9c05bd3907da