🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

gulp

gulpは、Node.jsをベースとしたタスク自動化ツールの一つ。ストリームでファイルを処理することが特徴です。CSSプリプロセッサの使用時のコンパイルや、CSS・JavaScriptファイルの圧縮・結合などを自動的に行うことができます。

Q&A

解決済

1回答

3070閲覧

gulpfile で変更のあったファイル名を取得したい

NAOPI-05

総合スコア132

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

gulp

gulpは、Node.jsをベースとしたタスク自動化ツールの一つ。ストリームでファイルを処理することが特徴です。CSSプリプロセッサの使用時のコンパイルや、CSS・JavaScriptファイルの圧縮・結合などを自動的に行うことができます。

0グッド

1クリップ

投稿2019/10/06 19:32

編集2019/10/07 00:41

監視対象の中で、変更のあったファイル名を取得したいです。
引数にはオブジェクトを渡しており、その中身はパターンで指定しているため、
ファイルの名前を取得してそのあとの処理に渡していきたいです。

js

1// 監視するファイルのパス 2const path = { 3 html: "./*.html", 4 js: "js/*.js", 5 sass: "sass/**/*.scss", 6}; 7 8// Sass のコンパイル 9function compileSass(done) { 10 11 src(path["sass"]) 12 .pipe(sass({outputStyle: "expanded"})) // この後に処理をつなげて取得したファイル名を渡したいです 13 .pipe(dest("css")); 14 15 done(); 16} 17 18// ブラウザの更新 19function reload(done) { 20 browserSync.reload(); 21 done(); 22} 23 24// 標準で実行されるタスク 25exports.default = () => { 26 27 browserSync.init({ 28 browser: 'Google Chrome', 29 server: { 30 baseDir: './', 31 index: './index.html', 32 }, 33 }); 34 35 // Sass に変更があったらコンパイル 36 watch(path['sass'], compileSass); 37 38 // 監視対象のファイルに変更があったらブラウザの更新 39 watch(Object.keys(path).map(key => path[key]), reload); 40}; 41 42exports.build = series(compileSass, reload);

ちなみに最新では関数 task は非推奨になっているため、↑の書き方に適合した解決策でお願いします。
調べると event.path でファイル名を取得できるみたいな記事が見つかりますが、今の私の書き方で pipe の中の
処理にこれを引数として渡したら undefined になってしまいました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

gulp では、ファイルの監視に glob-watcher を使用しています。そして、 glob-watcher のドキュメントによれば、 pathstats の取得には未加工の chokidar インスタンスを使用する必要があります。この内容は gulp のドキュメントにも記載されています。

Chokidar instance

The watch() method returns the underlying instance of [chokidar][chokidar-external], providing fine-grained control over your watch setup. Most commonly used to register individual event handlers that provide the path or stats of the changed files.

When using the chokidar instance directly, you will not have access to the task system integrations, including async completion, queueing, and delay.

これを使用すると、質問文のコードは以下のようになります。

JavaScript

1const { 2 dest, 3 series, 4 src, 5 watch, 6} = require("gulp"); 7const sass = require("gulp-sass"); 8const browserSync = require("browser-sync"); 9const path = { 10 html: "./*.html", 11 js: "js/*.js", 12 sass: "sass/**/*.scss", 13}; 14 15function compileSass(filePath) { 16 return src(path["sass"]) 17 .pipe(sass({outputStyle: "expanded"})) 18 .on("end", _ => { 19 if (typeof filePath === "string") console.log(`Compiled '${filePath}'`); 20 }) 21 .pipe(dest("css")) 22} 23 24function reload(done) { 25 browserSync.reload(); 26 done(); 27} 28 29exports.default = () => { 30 browserSync.init({ 31 browser: 'Google Chrome', 32 server: { 33 baseDir: './', 34 index: './index.html', 35 }, 36 }); 37 watch(path['sass']).on("change", (path) => { 38 compileSass(path); 39 }); 40 watch(Object.keys(path).map(key => path[key]), reload); 41}; 42 43exports.build = series(compileSass, reload);

追記

JavaScript

1exports.default = () => { 2 browserSync.init({ 3 browser: 'Google Chrome', 4 server: { 5 baseDir: './', 6 index: './index.html', 7 }, 8 }); 9 watch(path['sass']).on("change", (path) => series(compileSass.bind(this, path), reload)()); 10 watch(Object.values(path).filter(value => value !== path["sass"]), reload); 11};

投稿2019/10/20 21:15

編集2019/10/29 00:56
s8_chu

総合スコア14731

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

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

NAOPI-05

2019/10/25 11:33

ご回答ありがとうございます。 確かにこれで変更のあったファイル名を取得することはできましたが、 ファイルを保存すると `compileSass` と `reload` が逐次処理されず、 Sassのコンパイルが終了する前にブラウザが更新されてしまいます。 ファイル名を取得できる状態で、なおかつSassをコンパイルしてからブラウザを更新する方法はお分かりでしょうか?
s8_chu

2019/10/29 01:04 編集

> ファイルを保存すると `compileSass` と `reload` が逐次処理されず、 恐らく、追記したように「Scss ファイルのコンパイルとページのリロード」に `series` 関数を用いることで、その問題は解決すると思います。
NAOPI-05

2019/11/14 14:03

追記のコードを見させてもらいました。こういった書き方もできるんですね。 自分も gulpfile をもっとカスタマイズできるように知識を吸収する必要があると感じました。 遅くなり申し訳ありません。ご教授ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問