Gatsby.jsのビルドでWebpackのエラーが出たので対処した

エンジニアサイトのビルドでエラーを踏んだので、軽くメモを残します。調べてみたら、1年以上前から発生するはずなので、なんで今さら踏んだのかという感じです。
結論から言うと、以下のstackoverflowと公式のドキュメントで大体解決です。

発生した2つのエラー

webpack < 5 used to include polyfills for node.js core modules by default. This is no longer the case.

ERROR #98124  WEBPACK

Generating JavaScript bundles failed

Can't resolve 'zlib' in '/Users/yasuharu-sakai/workspace/cybozu-tech/node_modules/jsdom/lib/jsdom/living/helpers'

If you're trying to use a package make sure that 'zlib' is installed. If you're trying to use a local file make sure that the path is correct.

BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.

If you want to include a polyfill, you need to:
	- add a fallback 'resolve.fallback: { "zlib": require.resolve("browserify-zlib") }'
	- install 'browserify-zlib' 
If you don't want to include a polyfill, you can use an empty module like this:
        resolve.fallback: { "zlib": false }

File: node_modules/jsdom/lib/jsdom/living/helpers/http-request.js:26:11

If you're trying to use a package make sure that 'fs' is installed. If you're trying to use a local file make sure that the path is correct.

ERROR #98124  WEBPACK

Generating JavaScript bundles failed

Can't resolve 'fs' in '/Users/yasuharu-sakai/workspace/cybozu-tech/node_modules/jsdom/lib'

If you're trying to use a package make sure that 'fs' is installed. If you're trying to use a local file make sure that the path is correct.

エラーの原因

エラーメッセージにもありますが、webpack 4まではnode.jsのコアモジュールのpolyfillが含まれていました。それが、webpack 5では含まれなくなったため、polyfillを設定する必要が出たというわけです。

対処法

最初に貼ったリンクの通りに対応します。Gatsby.jsではgatsby-node.jsにwebpackの設定ファイルをカスタマイズするように書くことができます。

1つ目のエラーに対しては、stackoverflowにもあるように、以下のように対処します。上記のエラーはzlibで怒られているので、こんな感じです。

exports.onCreateWebpackConfig = ({ actions }) => {
  actions.setWebpackConfig({
    resolve: {
      fallback: {
          zlib: require.resolve("browserify-zlib")
      },
    },
  })
}

2つ目のエラーに対しては、公式のトラブルシューティングに沿って、以下のように。

exports.onCreateWebpackConfig = ({ actions }) => {
  actions.setWebpackConfig({
    resolve: {
      fallback: {
          fs: false,
      },
    },
  })
}

最終的に、出ているエラー全てに対応すると、私のサイトでは以下のような感じになりました。

exports.onCreateWebpackConfig = ({ actions }) => {
  actions.setWebpackConfig({
    resolve: {
      fallback: {
          canvas: false,
          child_process: false,
          fs: false,
          http: require.resolve("stream-http"),
          https: require.resolve("https-browserify"),
          net: false,
          os: require.resolve("os-browserify/browser"),
          path: require.resolve("path-browserify"),
          stream: require.resolve("stream-browserify"),
          tls: false,
          url: require.resolve("url"),
          util: require.resolve("util"),
          zlib: require.resolve("browserify-zlib")
      },
    },
  })
}

ちなみに、対応が必要なパッケージは以下を参照してください。

(本当に、なんで今まで踏まなかったんだろう…?)

最後に宣伝ですが、サイボウズのエンジニアサイトをどうぞよろしくお願いします。


この記事が気に入ったらサポートをしてみませんか?