0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

browserify中にソースコードを文字列置換で書き換えるbrowserify-sed

Posted at

node.js 向けのファイルを束ねてブラウザで実行できるようにする browserify で、node.js 用の通常コードとブラウザ用コードで一部の記述を変えたいときに使えるプラグイン browserify-sed を書いてみたので紹介します。

私は軽量に make でビルドする派なので CLI では以下のように使います。

browserify src/index.js -o build/bundle.js \
    -t [ browserify-sed "s/__VERSION__/1.2.3/g" ] 

↑の例では、ソースコード中の __VERSION__ という文字列をすべて 1.2.3 に置き換えています。

以前は perl -i -pesed -i でソースコード書き換えをしていたので、それと同じ sed 書式になっています。perl で慣れてる人には読みやすいはず。既存 Makefile もコピペで切替えできた。

なお perlsed は行単位のストリーミング置換なのに対して、
browserify-sed はファイル全体をマッチさせる仕組みなので、
複数行に渡る置換もできます。
逆に、行単位で、行頭・行末でマッチさせたいときは mg フラグを付けて下さい。

browserify src/index.js -o build/bundle.js \
    -t [ browserify-sed "s#^(exports.*? = void 0)#// $1#mg" ]

↑は TypeScript が関数とかを exports するときに定義前にいちど void 0 で先行初期化するコードを吐くのを削除するものです。たいてい要らない。
複数の置換を行うときは、; で並べます。

# ; で並べる
browserify src/index.js -o build/bundle.js \
    -t [ browserify-sed "s/foo/FOO/g; s/bar/BAR/g;" ] 

# たぶん下記でも OK
browserify src/index.js -o build/bundle.js \
    -t [ browserify-sed "s/foo/FOO/g" "s/bar/BAR/g" ] 

browserify src/index.js -o build/bundle.js \
    -t [ browserify-sed "s/foo/FOO/g" ] 
    -t [ browserify-sed "s/bar/BAR/g;" ] 

事前に browserify 本体と browserify-sed を準備して下さい。

npm install browserify browserify-sed

20行くらいの短いコード なので、特定のファイルのみを置換対象に絞るとかの細かなオプションは、実装していません。

macOS の sed は GNU でないので -i に対応していなかったり、
Alpine など Docker の軽量イメージでは perl が入っていなかったり、
ときどき面倒なことがあった。
browserify-sed を使えば node だけでビルドが完結できて便利になりそう。

なお s/foo/bar/ の文字列置換処理(置換関数へのコンパイル)の実装は別モジュール sed-lite.ts です。

browserify.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?