例えば、scssファイルの結合ですと「@use」を使って1つのファイルにまとめて出力することができると思いますが、
そういったことをJSファイルでも行いたいと思っています。
SCSSの@use
はネームスペースを借りる等のかなり高度な作業をやっています。
これはNode.js流儀のrequire
をふんだんに使ったシステムを構築し、
ブラウザのJavaScriptにはrequire
は無いからWebpackでbundle.js
ファイルにコンパイルして使おうかと言ってるようなものです。
rollupの様に結合時にコンパイルする等の動きは必要なく、プラグインも使用せず単純に1つのファイルにまとめるだけということがしたいです。
この前提があるので、!?!?となってしまいます。
モダンなフロントエンドのJavaScript開発は
前述のWebpackを使うのが半ば当然みたいになっているので
覚えて使いましょう。
rollupの様に結合時にコンパイルする等の動きは必要なく、プラグインも使用せず単純に1つのファイルにまとめるだけということがしたいです。
この用途ならば自分でNode.jsのコードを組めば良いんじゃないですか?
Node.jsはRubyやPythonと対等に張り合える汎用スクリプト言語ですからね。
とりまプロジェクトルートに実行ファイル置き場を冠するbin
ディレクトリを作成して、
結合を意味するconcat
みたいなファイルを作りましょうか。
bash
1$ cd [プロジェクトルートのパス]
2
3# bin/concatの作成
4$ mkdir bin
5$ touch bin/concat
6$ chmod +x bin/concat
7
8# 固めたいJSファイル群はココに設置するものとする
9$ mkdir -p assets/scripts
10$ touch assets/scripts/a.js
11$ touch assets/scripts/b.js
12
13# くっついたJSファイルの吐き出し先
14$ mkdir -p output
bin/concatの中身
拡張子がないファイルに実行権限を付与して実行した場合
スクリプト言語ならば1行目にこのように記述すればNode.js越しの実行になります。
こういうのをシバン等と呼びます。
js
1#!/usr/bin/env node
2
3const fs = require("fs");
4
5// __dirnameはこのスクリプトファイルのディレクトリの絶対パスを示す
6const assetsDir = `${__dirname}/../assets/scripts`;
7
8let output = "";
9for (let it on fs.readdirSync(assetsDir)) {
10 // 拡張子を見てJSファイルでなきゃ捨てる
11 if (!/\w.js$/.test(it)) continue;
12
13 // バイナリオブジェクトで取れる事があるので.toStringメソッドを叩いてStringにしておくこと
14 const file = fs.readFileSync(`${__dirname}/../assets/scripts/${it}`).toString();
15 if (js != "") js += "\n";
16 js += file;
17}
18
19fs.writeFileSync(`${__dirname}/../output/bundle.js`, js);
Gulp使ってもこれと似たようなコードは記述しないといけないですからね。
因みにメソッドチェーンを駆使するとこんな感じ
コード量的にも許容範囲って感じですね。
まぁストリームで処理するGulpはメモリの問題で死ぬ可能性がぐっと下がりますが、
私の回答は馬鹿でかいファイルを読み込むと死にます。
まぁMB超えるようなファイルは作らないと思うので大丈夫ですかね。
js
1#!/usr/bin/env node
2
3const fs = require("fs");
4const assetsDir = `${__dirname}/../assets/scripts`;
5const output = fs.readdirSync(assetsDir)
6 .filter(it => /\w.js$/.test(it))
7 .map(it => fs.readFileSync(`${assetsDir}/${it}`).toString())
8 .join("\n");
9fs.writeFileSync(`${__dirname}/../output/bundle.js`, output);
【おまけ】ちょっと戻ってBashの力で解決する
ITで働くならシス管系女子は読みましょう。
そのくらいオススメ。
先程Node.jsでシコシココードを書きましたが、
CLIのコマンドの力があればわずか1行で解決します。
特定のディレクトリ配下のファイルなんてのはワイルドカードが使えるので文字通り一撃です。
bash
1$ cat assets/scripts/*.js > output/bundle.js
うまく動作したらpackage.jsonに登録
json
1 "scripts": {
2 "concat-js": "cat assets/scripts/*.js > output/bundle.js",
3 },