Astro(というかVite)でglslifyを使う
Astroは内部にViteが使われていて、Astroが必要な高度な設定をサポートしています。
Astroで標準サポートしてなくても、Viteのプラグインが使えたりするのでいろいろ便利そうな感じなのですが、
今回Viteでもサポートしているのかしてないのかわからず、事例もほとんどないので2日を要するハマり具合でした。
やりたかったのは、glslの中でglslifyプリプロセッサ構文を書くということ。
下記のような構文です。
#pragma glslify: blendOverlay = require(glsl-blend/overlay)
jsからglslを読み込むのではなく、glslファイルからglslを読み込む方法です。
'glslify' : unrecognized pragma
というエラー。glslifyのところが処理されないです。
結論から。vite-plugin-glslifyを使う
Github:vite-plugin-glslify
vite-plugin-glslify
をインストールする。
npm i vite-plugin-glslify
ですが、npmでインストールするとviteのバージョンが合わないみたいなエラーが出てインストールに失敗しました。
そんな時はyarnでインストールします。
yarn add vite-plugin-glslify
この、npmのインストールでだめならyarnで…というのは過去にも一度遭遇したことがありますが、yarnはパッケージのバージョンの衝突をうまいことやってくれるのでしょうか…?ありがたいですね。でもちょっとわかっておりません。。
astro.config.mjs
には下記設定を追加します。
(viteの場合は、vite:{}
以下をvite.config.js
に書けば多分いける)
import glslify from "vite-plugin-glslify";
export default defineConfig({
vite: {
plugins: [
glslify(),
],
}
}
astroでglslを読み込むだけならvite-plugin-glslでも
astroでglslを使うだけなら、vite-plugin-glsl
というプラグインも使えます。
ただ、vite-plugin-glslify
を使えばこの機能も兼ねるので、特段これを使用する理由は今の所ないかもしれない…が、なんだかこっちの方がメジャーな気がするし、glslifyを使うまではこれでやっていたので一応書いておきます。
astro.config.mjsの設定
(viteの場合はvite:{}
以下から指定すれば多分いけます)
import glsl from "vite-plugin-glsl";
export default defineConfig({
vite: {
plugins: [
glsl({
watch: false,
}),
],
}
}
watchはfalseにしておかないと、astroのなにかと衝突するのか、glslファイルを保存するたびに落ちてしまいました。
→関連するissue
astroではwatch:false
を加えてますが、viteではいらないかもしれません。
まとめ
普段使うフレームワークでシェーダースクリプトが書けるようになることが目標だったので、第一段階クリアしてホッとしています。
それにしても、React構文もVue構文も使えてviteの設定も流用できて、Astroがすごい。