WebpackにBabel、Terser(JavaScriptのミニファイヤ)、圧縮プラグインを入れて、webpack
コマンド一発で成果物の.js.gz
を得られるような環境を作っていたのですが、出力されたコードを見ていると、return null==n?"":Object(r.O)(n)
のように、ほかからimport
しているものを圧縮したr.O
に対してObject()
関数をかけてから関数呼び出ししているコードがありました。
なお、ES Modulesをフル活用するため、Babelのモジュール変換は止めてあり、import
/export
を直接Webpackで処理させています。
質問
その1
このように、import
の結果に対してObject()
を入れているのはどのような理由からでしょうか。
その2
Object(...)(...)
のようにObject()
の結果に対して関数呼び出しを行う場合、(Object
自体を上書きするという改変されたような環境は無視するなら)もともと関数の場合はObject()
ありでもなしでも同じ関数を呼ぶことになる、関数でない場合はObject()
ありでもなしでも(エラーメッセージは変わるけど)TypeError
になる、ということでObject()
を外しても挙動に有意な差は出ない、と考えられますが、それで間違いないでしょうか。
その3
関数呼び出しの前にあるObject()
を外すことで動作に致命的な差が出ない(全く差がない、あるいは変化するのはエッジケースだけで、import
の結果に仕掛けているという条件を考えれば問題とならない)なら、出力の容量削減のためにこのObject()
を消し去りたいのですが、どのようにすればいいでしょうか。
考えられる方策としては、
- バンドル後、terserへ渡す前に処理を挟み込む
- terserのオプションとして何か仕掛ける
- terserでの処理後、gzip圧縮を行う前に処理を挟み込む
などが考えられますが、そういったところに処理を仕掛けたことがなくて、イマイチやり方がわかっていません。string-replace-loader
はバンドル前に動くものなので、この状況では役に立たなさそうです。
バージョン
- Webpack 4.29.6
- babel-loader 8.0.5
- @babel/core 7.3.4
- terser-webpack-plugin 1.2.3
- terser 3.16.1
- compression-webpack-plugin 2.0.0
- Node.js 10.x系列
あなたの回答
tips
プレビュー