2020-05-31

node v12+でgraceful-fsが動かない

JavaScript
Node.js

今更ですが、node.js のバージョンを 10 系から 12 系にあげてみました。

すると自作ツールが動かなくてハマったのでメモ。。。

unzipを利用するツールがあったのですが、最終更新が 6 年前。
このライブラリが使っている graceful-fs 、さらにはその先の fstream が v12 系に対応していないらしく、エラーがでます。

ReferenceError: primordials is not defined  

いろいろ調べてみると gulp が古いとだめだよ、って書いてありましたがそもそも gulp 使ってないし。
直接 node.js で JavaScript 実行してるだけだし。

unzip のアップデートができない

開発が止まっているので、yarnから入れ直しても解決しません。
unzipに見切りをつけて、別のライブラリを利用することにしました。

unzipper ってのがある

よく調べずに、unzip 検索結果の次に来ていた unzipper を採用。
使い方とかどうなんだろ。

unzip の削除と unzipper のインストール

単純に package.json の登録を入れ替えました。

yarn remove unzip  
yarn add unzipper  

なんと、そのまま利用できた!

ツールで利用しているのは pipe で unzip にストリーム渡しているだけです。

  fs.createReadStream(f)  
    .pipe(unzip.Parse()) // ← ここ  
    .on('entry', function (entry) {  
      // do something...  
    }  

unzipper にも同じ名前のparse関数があったので、require先のライブラリだけ変更して実行。
すると、何事もなかったかのように同じ出力結果が得られました! バンザイ!

ところが?

unzipだと全解凍、内部ファイルの読み出しからクローズまで終わってからcloseイベントを発火していたのですが、unzipperは内部ファイルを引き渡したらすぐにcloseしてしまうみたいです。
スキャン完了してからクローズが走って後処理、という流れだったのに先にクローズが走ってからスキャン完了になるという。。。

まあ、Promise 一つかますだけですが。

ライブラリの end of life には気をつけましょう、というお話でした。


猫派 / 基本インドア / ガジェット大好き / RDP推進派
コロナ禍の趣味はPC+VRでゲーム。
最近のゲーム:Factorio / BeatSaber / にゃんこ大戦争

→ Policy