質問するログイン新規登録
npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

2回答

4081閲覧

npm環境にて複数JSファイルを連結し1つのファイルに出力する方法について

Yui_note

総合スコア15

npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2021/09/10 01:53

編集2021/09/10 02:48

0

0

npm環境に複数のjsファイルがあり、1つのファイルにまとめて出力したいと思っていますが、
調べてもGulp環境での結合方法を説明したサイトが多く、参考サイトを見つけることができません。

例えば、scssファイルの結合ですと「@use」を使って1つのファイルにまとめて出力することができると思いますが、
そういったことをJSファイルでも行いたいと思っています。

rollupの様に結合時にコンパイルする等の動きは必要なく、プラグインも使用せず単純に1つのファイルにまとめるだけということがしたいです。
お知恵をお貸しいただけないでしょうか。どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

technocore

2021/09/11 00:15

ソースを連結する目的は何でしょうか? まさかそれを実行する訳では無いですよね?
Yui_note

2021/09/11 02:02

1つのファイルにまとめるのが目的です。
technocore

2021/09/11 05:11

でしたら、OSのファイル操作の話なので、npmもgulpもなんら関係ないです。
Yui_note

2021/09/11 05:29

その後別の方から、jsでできるとお話をお聞きできたのですが、今度はその書き方がわからずという感じでした。OSファイルの操作のお話なんですね。そちらの方向で解決できないかも調べてみます。 ありがとうございます。
technocore

2021/09/11 07:14

そもそも一つにまとめる目的はなんですか?
guest

回答2

0

例えば、scssファイルの結合ですと「@use」を使って1つのファイルにまとめて出力することができると思いますが、
そういったことをJSファイルでも行いたいと思っています。

SCSSの@useはネームスペースを借りる等のかなり高度な作業をやっています。
これはNode.js流儀のrequireをふんだんに使ったシステムを構築し、
ブラウザのJavaScriptにはrequireは無いからWebpackbundle.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 },

bash

1$ npm run concat-js

投稿2021/09/11 07:28

編集2021/09/11 07:55
miyabi-sun

総合スコア21482

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

無理にNode.jsでやらずに、シェルスクリプトでcatする、ぐらいのシンプルな手段でもいいのではないでしょうか?

投稿2021/09/10 02:20

maisumakun

総合スコア146704

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yui_note

2021/09/11 02:03

catを使うやり方があるんですね。初めて知りました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問