rollup で Vue コンポーネントの npm パッケージを作る時に SSR も考慮する
お手伝いしている会社で、対応したやつのメモ。
Vue のコンポーネントを複数のプロジェクトで共有するために npm パッケージ化しているときに遭遇した問題。
Vue コンポーネントを npm パッケージ化する — Vue.js 等を参考にパッケージを作っている場合は、ブラウザで動作させる前提のバンドルファイルが生成されるので、これを SSR に利用すると、document
などのブラウザのAPIにアクセスしてエラーになる。
対応としては、SSR 用のバンドルファイルを別に用意して、実行するプラットフォームに応じて利用するバンドルファイルを切り替える。 具体的には、rollup の場合、Examples | Rollup Plugin Vue に書かれているオプションを指定すると SSR 用のバンドルファイルが生成される。
切り替えは nuxt の場合、以下のようにプラットフォームごとにプラグインのファイルを用意して
foo-ui-client.js
import Vue from 'vue' import FooUI from 'foo_ui' Vue.use(FooUI)
foo-ui-server.js
import Vue from 'vue' import FooUI from 'foo_ui/dist/ssr' Vue.use(FooUI)
プラグインの設定で、作成したファイルに対して適切な mode を指定する。
plugins: [ ...., { src: '@/plugins/foo-ui-client.js', mode: 'client' }, { src: '@/plugins/foo-ui-server.js', mode: 'server' }, ],