質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Babel

Babelは、JavaScriptの次世代仕様であるECMAScriptのコンパイラ。次世代の標準機能を用いて記述されたコードを、それらの機能に対応していないブラウザでも動作するコードに変換することができます。

gulp

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

Q&A

解決済

1回答

3289閲覧

gulpでprettierとbabel

tomo77777

総合スコア15

Babel

Babelは、JavaScriptの次世代仕様であるECMAScriptのコンパイラ。次世代の標準機能を用いて記述されたコードを、それらの機能に対応していないブラウザでも動作するコードに変換することができます。

gulp

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

0グッド

0クリップ

投稿2019/01/22 03:26

gulpで次のようなタスクを自動化したいと考えています。
・ブラウザのリロード
・ES6->ES5
・自動整形
・ベンダープレフィックスの自動化

そこで次のgulpfile.jsを書きました。

packagejson

1{ 2 "name": "gulp-tutorial", 3 "version": "1.0.0", 4 "description": "", 5 "main": "index.js", 6 "scripts": { 7 "test": "echo \"Error: no test specified\" && exit 1" 8 }, 9 "keywords": [], 10 "author": "", 11 "license": "ISC", 12 "devDependencies": { 13 "@babel/core": "^7.2.2", 14 "@babel/preset-env": "^7.3.0", 15 "browser-sync": "^2.26.3", 16 "gulp": "^4.0.0", 17 "gulp-babel": "^8.0.0-beta.2", 18 "gulp-postcss": "^8.0.0", 19 "gulp-prettier-eslint": "^1.1.0", 20 "gulp-sass": "^4.0.2", 21 "postcss-cssnext": "^3.1.0" 22 } 23} 24

gulpfile

1const gulp = require('gulp') 2const browserSync = require('browser-sync').create(); 3 4gulp.task('sass', () => { 5 const cssnext = require('postcss-cssnext') 6 const postcss = require('gulp-postcss') 7 const sass = require('gulp-sass') 8 const processors = [ 9 cssnext({ browsers: ['last 2 version'] }) 10 ]; 11 12 return gulp.src('./src/**/*.scss') 13 .pipe(sass()) 14 .pipe(postcss(processors)) 15 .pipe(gulp.dest('./dist/css')) 16}) 17 18gulp.task('babel', ()=> { 19 const babel = require('gulp-babel') 20 return gulp.src('./src/**/*.js') 21 .pipe(babel()) 22 .pipe(gulp.dest('./dist/js')) 23}) 24 25gulp.task('serve',(done)=>{ 26 browserSync.init({ 27 server: { 28 baseDir: "./dist", 29 index: "index.html" 30 } 31 }) 32 done() 33}) 34 35gulp.task('prettier', (done)=>{ 36 const prettierEslint = require('gulp-prettier-eslint'); 37 return gulp.src('./src/**/*.js') 38 .pipe(prettierEslint()) 39 .pipe(gulp.dest('./src')); 40}) 41 42gulp.task('watch', ()=>{ 43 const browserReload = (done) => { 44 browserSync.reload() 45 done() 46 } 47 48 gulp.watch('./dist/**/*', browserReload) 49 gulp.watch('./src/scss/*.scss', gulp.series('sass')) 50 gulp.watch('./src/js/*.js', gulp.series('prettier')) 51 gulp.watch('./src/js/*.js', gulp.series('babel')) 52}) 53 54gulp.task('default', gulp.series('serve', 'watch')) 55

src/js配下のファイルをdist/jsにトランスパイルして書き出しています。

問題点
src/js/index.jsをgulp-prettier-eslintで自動整形し、src/js/index.jsに書き出すという風にするのかと思っているのですが、整形後に書き出すとbabelの監視が働いて、次に自動整形が働いて、・・・・という無限ループに陥ります。

質問
・書き出し方法に問題点があるのか
・そもそも考えに誤りがあるのか

当方、趣味でやっているもので、見当違いな質問をしているかも知れませんが、何かアドバイスを頂きたいです。
よろしくお願いします。

[12:15:45] Starting 'browserReload'...
[12:15:45] Finished 'browserReload' after 542 μs
[12:15:45] Starting 'prettier'...
[12:15:45] Starting 'babel'...
[12:15:45] Finished 'prettier' after 30 ms
[12:15:45] Finished 'babel' after 31 ms
[12:15:45] Starting 'browserReload'...
[12:15:45] Starting 'prettier'...
[12:15:45] Starting 'babel'...
[12:15:45] Finished 'browserReload' after 948 μs
[12:15:45] Finished 'prettier' after 24 ms
[12:15:45] Finished 'babel' after 24 ms
[12:15:46] Starting 'browserReload'...
[12:15:46] Starting 'prettier'...
[12:15:46] Starting 'babel'...
[12:15:46] Finished 'browserReload' after 597 μs
[12:15:46] Finished 'babel' after 58 ms
[12:15:46] Finished 'prettier' after 59 ms

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/01/22 09:34

この辺全然理解してないので、間違ったことを言っていたらごめんなさい。 入力ファイルと出力ファイルを同じにするのはいけません。 今回のように、prettierとbabelにタスクが別れていて、順番にやるのであれば、srcとdist以外にディレクトリが必要です。例えばsrc→[prettier]→tmp→[babel]→distのように。もちろん入力側になるファイルにはwatchも必要です。 また、以下のようにpipeで繋げてタスクを1つにする方法も考えられます。 const babel = require('gulp-babel') const prettierEslint = require('gulp-prettier-eslint'); return gulp.src('./src/*.js') .pipe(prettierEslint()) .pipe(babel()) .pipe(gulp.dest('./dist')); ご参考までに。
tomo77777

2019/01/22 14:03

回答ありがとうございます。 prettierのような自動整形は、自分で整形するのが面倒だから代わりにやってくれる、という認識なんですが別ファイルに書き出してしまうと、自分がコードを書くファイルについては自分で整形するということ何でしょうか?
wwbQzhMkhhgEmhU

2019/01/22 14:09

いいえ。上の例(例えばsrc→[prettier]→tmp→[babel]→distのように)で言えば、 srcディレクトリ配下の.jsファイルを元にprettierを使って整形したものがtmpディレクトリに tmpディレクトリ配下の.jsファイルを元にbabelを使ってES5にしたものがdistディレクトリに 生成されるよう、ターゲットを記述する、ということです。 あと回答ではありません。参考情報です。
tomo77777

2019/01/22 14:21

なんども聞いてしまってすみません。 src->tmp->distという流れは理解しました。しかしそれだと、srcで書いているjsファイルのインデントがバラバラでも、distには整形後のものが生成されるが、srcはバラバラなのではないでしょうか?
wwbQzhMkhhgEmhU

2019/01/22 14:30

バラバラになりますね。 build用の仕組みの中で入力となるもの、つまりsrcは書き換えてはいけません。 srcの中は人間が編集するものなので、本来はエディタなどで適宜整形しておくべきものです。
tomo77777

2019/01/22 14:35

もう一点教えてください。 エディタで整形、例えばVSCODEのプラグインのPrettierで整形してしまえば、gulpのタスク内でprettierを通す必要が無い気がしています。srcも整形されますし、distも整形されると思います。エディタでの整形とbuild時の整形は何か使い分けがあるのでしょうか?
wwbQzhMkhhgEmhU

2019/01/22 14:44

用途は別に使いたい人が考えるものなので、知りません。今回はあなたが使いたいと考えているようだったので合わせました。 例えばコーディング規約などでこれで整形するように、などと言われたら、担当の全ファイルが一律整形されてるかどうかチェックする目的で、ターゲット指定してprettier単品で使うとかになると思います。 仮定の話をする場所でもありませんが。。。
guest

回答1

0

ベストアンサー

package.jsonscripts に gulp を起動する設定をする必要があると思いますー。

diff

1 2... 3 4 "scripts": { 5+ "dev": "gulp", 6 "test": "echo \"Error: no test specified\" && exit 1" 7 }, 8

後は、$ npm run dev で起動できると思いますー。

投稿2019/08/31 04:14

kkeeth

総合スコア51

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問