自分用のWeb作成ボイラープレートである「
Ususama」は
gulpを使っているのですが、JSファイルを機能ごとに分離したくなってきました。
そこでモジュールバンドラを考えたのですが、既にScssやejsのコンパイル、画像の圧縮などの機能は盛り込んであるので、
Webpackは機能多過と感じました。
今更
Browserifyというのもちょっと(そもそもgulpの時点で、というのはありますが)、と思い、すわ
Rollupかとも思ったのですが、
Babelと合わせる際のプラグインでわりとごちゃごちゃしそう……と感じていたところに、そういえば
Parcelはどうだろうか、と思い立ちました。
少し検索してみると、ファイル出力先が調整できるようになっていたり、だいぶ使えそうな感じになっていたので、設定ファイルの煩わしさもなくなれば……と期待を込めて取り掛かってみました。
gulpがベースにあるので、gulp用のプラグインはないかと
npmを探してみたところ、
gulp-parcelというものが見付かりました。
個人開発なので今後がどうなるか分かりませんが、とりあえずこれで試してみることにします。
試すのは以下のJSファイル。
app.js
import pageTop from './_pageTop'
$(() => {
//略
//スクロール対象を取得
const screlm = scrollElm()
pageTop(screlm)
//略
}
//略
_pageTop.js
export default (screlm) => {
//略
}
どちらも
src/js/
ディレクトリに置いてあるものとし、gulp-parcelによる中間出力は
src/js/parcel/
以下に行うものとします。
なので、上記の変更に対応するJSをトランスパイルする順番と条件を以下のようにします(もっとバリバリモジュールバンドラでまとめても良いのですが、ひとまずできるかどうかの実験のため最小限の変更とします)。
- jQueryなどのライブラリをまとめて
src/js/concat/lib.js
に出力(js.concatというタスク名) - 今回の本題。Parcelで
src/js/
以下のJSファイルをエントリポイントにしてバンドルする- ただし、以下のファイルは除く
- 先頭が
_
で始まるjsファイル(Scssと同じルールとする) src/js/concat/
以下のファイル(既にバンドルされているので)src/js/parcel/
以下のファイル(無限ループになってしまうので)
- 1.,2.が完了したら、今までと同様にgulp-uglify-esでminifyする
以上を満たすようにしたJSのタスクが以下。
_.gulp.task('js.concat', () => {
//略。今まで通り
})
_.gulp.task('js.parcel', () => {
return _.gulp.src([`${dir.src.js}/**/*.js`, `!${dir.src.js}/**/_*.js`, `!${dir.src.js}/concat/**/*.js`, `!${dir.src.js}/parcel/**/*.js`], { read:false }) //2.の条件を満たすようにsrcを列挙。read:falseは付けないと動かないとのこと
.pipe(_.plumber())
.pipe(_.parcel({ //parcelのオプション
cache: false,
minify: false,
hmr: false
}))
.pipe(_.gulp.dest(`${dir.src.js}/parcel/`)) //parcelディレクトリ下に出力
})
_.gulp.task('js.uglify', _.gulp.series(_.gulp.parallel('js.concat', 'js.parcel'), () => { //1.2.3.の順番を満たすようにgulp.seriesとgulp.parallelを使用
return _.gulp.src([`${dir.src.js}/parcel/**/*.js`, `${dir.src.js}/concat/**/*.js`]) //uglifyしたいファイルはparcelとconcatの下にしかないのでsrcを調整
.pipe(_.plumber()) //後は今まで通り
.pipe(_.uglify({output: {comments: 'some'}}))
.pipe(_.rename((path) => {
path.dirname = dir.dist.js
path.basename += '.min'
path.extname = '.js'
}))
.pipe(_.gulp.dest('./'))
}))
こんな感じになりました。複数ファイルの際に動くかどうかまでは未検証ですが、とりあえずgulpとparcelを組み合わせてバンドルされ、ブラウザで今までと同じ動作になったことを確認しました。
参考