html-to-reactでビルドエラー
公開日:
突然のエラー
/workspaces/project/node_modules/htmlparser2/lib/esm/index.js 48:9
Module parse failed: Unexpected token (48:9)
You may need an appropriate loader to handle this file type.
| * They should probably be removed eventually.
| */
> export * as ElementType from "domelementtype";
| import { getFeed } from "domutils";
| export { getFeed } from "domutils";
> Build error occurred
Error: > Build failed because of webpack errors
at Object.build [as default] (/workspaces/project/apps/app1/node_modules/next/dist/build/index.js:192:15)
error Command failed with exit code 1.
開発していたアプリをビルドしようとしたらエラーが発生。
特にライブラリをアップデートした覚えもないし、なぜ。
前提
- Next.js:
@8.1.0
を用いたプロジェクトで、babel
を用いてトランスパイルしているプロジェクトの対処方法です。
原因
https://github.com/fb55/htmlparser2/issues/1237#issuecomment-1182522861
webpack4
が
export * as ns from 'mod';
この記法に対応していないのが原因らしい。
対処法
Next.js
の config ファイルで babel
のプラグインを挟んであげましょう
{
test: /\.js?$/,
use: [{
loader: "babel-loader",
options: {
plugins: ["@babel/plugin-transform-export-namespace-from"]
}
},]
},
エラーの詳細
原因となるライブラリ
今回の原因となるライブラリは、html-to-react
とhtmlparser2
というライブラリです。
html-to-react
というライブラリの依存関係にhtmlparser2
が含まれています。
エラーの原因
htmlparser2
というライブラリは 7 系から 8 系になるときにesm
とcjs
の両方に対応しています。そしてその中には
export * as ns from 'mod';
こういうようなコードが含まれていました。
しかし、webpack4
ではこの構文はまだサポートされていないので、エラーが出たわけです。
もちろん、webpack4
を使っている状態でhtmlparser2
を7系
から8系
にアップデートすると上のようなエラーが出ます。ただ、そんなに何も考えずにライブラリをメジャーアップデートするか?って話で、実際今回はライブラリのメジャーアップデートはしていませんでした。
なら何が原因かというと、html-to-react
というライブラリの1.4系
から1.5系
へのマイナーアップデートにhtmlparser2
の7系
から8系
へのメジャーアップデートが含まれていることです。
html-to-react
の 1.4 系のpackage.json
https://github.com/aknuds1/html-to-react/blob/v1.4.7/package.json
これと
html-to-react
の 1.5 系のpackage.json
https://github.com/aknuds1/html-to-react/blob/v1.5.1/package.json
これを見比べて貰えばわかるかと思います。
要するに、react-to-html
のマイナーアップデートにhtmlparser2
のメジャーアップデートが含まれてしまっている状態で、結果的にマイナーアップデートに破壊的な変更が加わってしまったということです。これが原因。
これってライブラリとしてあんまよくないのでは?とは思うけど、まぁ解決したので許します。
最後に
エラーの原因がわかってスッキリ
では
Bye