2022年6月26日日曜日

clojure cliのclojrue scriptのビルドでjsのecmascriptのバージョンに関するエラーが発生する場合は、言語の規格設定を新し目にしたら良い



背景

clojure scriptでfront endを作成してたところライブラリを追加したらエラーが発生してビルドできなくなりました。
調べたらbuild.ednで言語規格(ecmascriptのバージョン)を指定できると分かり、新し目の規格を指定したらエラーを回避できました。
備忘録を兼ねて対応内容と関連リンクを記事に残します。

使ったもの

clojure cliを利用して作成しているログ管理サーバーをdockerで動かして動作確認しました。

  • docker + docker-compose
  • clojure cli
  • clojure cliのclojure scriptプロジェクト

ビルド環境

clojure cliでbuild.ednを呼び出してビルドします。
docker上で実施するビルドコマンドはこちらです。
docker-compose run front bash -c "yarn && clj -M -m cljs.main -co build.edn -O advanced -v -c"

関連ファイルはリポジトリのfrontディレクトリを参照してください。
対策前のコミットのコード
対策後のコミットのコード

発生したエラー

cljs-timeを依存ライブラリとして追加したら、cljsのビルド時に下記のエラーが発生しました。
Jun 15, 2022 6:49:43 AM com.google.javascript.jscomp.LoggerErrorManager println
SEVERE: /usr/src/app/front/out-cljs/goog/i18n/numberformat.js:963:8: ERROR - [JSC_LANGUAGE_FEATURE] This language feature is only supported for ECMASCRIPT_2019 mode or better: Optional catch binding.
963| } catch {
^

googのライブラリのcatchの書き方がECMASCRIPT_2019以上で対応する書き方であるためビルドできないようです。

ビルド対象の言語規格を新し目に設定

build.ednの:language-inで言語規格を指定できるので、:ecmascript-nextと記述して新し目の規格を利用します。
build.edn
 :language-in :ecmascript-next

上記設定を追加すると期待通りにビルド出来るようになりました。

なお、記事を書いている時点でlanguage-inでバージョン指定可能な最新版のecmascriptは2017で、それより新しいecmascriptを指定するにはecmascript-nextと書く必要がありました。
今回のes2019で規定された書き方をビルドできたことから、ecmascript-nextはes2019以上のバージョンが適用されているようです。

参考: :language-in and :language-out

終わり

clojure scriptではなくjsの記述方法が問題でビルドが失敗するようになり戸惑いましたが、deps.ednでjsの新し目の規格(ecmascript-next)を使うことで、ビルドできるようになりました。

参考

Regex works in cljs using lein figwheel but fails when trying to run lein uberjar on my project
:language-in and :language-out
How to compile ES2018 javascript dependency?
All Activity Questions Unanswered Tags Ask a Question About "Optional catch binding" problem in recent versions
ECMAScript

0 件のコメント :