Gulp + WebpackまたはJUST Webpack?


161

webpackでgulpを使用している人がいます。しかし、私はwebpackを読んでgulpを置き換えることができますか?私はここで完全に混乱しています...誰かが説明できますか?

更新

結局、gulpから始めました。私はモダンなフロントエンドに不慣れで、すぐに立ち上げて実行したいと思っていました。1年以上たって足がかなり濡れたので、webpackに移動する準備ができました。同じ靴で始める人には同じルートを勧めます。あなたがwebpackを試すことができないと言っているのではなく、それが複雑であると思われる場合は、最初にgulpから始めてください...

gulpが不要な場合は、うんざりしますが、package.jsonでコマンドを指定し、最初に起動して実行するだけのタスクランナーなしでコマンドラインからそれらを呼び出すこともできます。例えば:

"scripts": {
      "babel": "babel src -d build",
      "browserify": "browserify build/client/app.js -o dist/client/scripts/app.bundle.js",
      "build": "npm run clean && npm run babel && npm run prepare && npm run browserify",
      "clean": "rm -rf build && rm -rf dist",
      "copy:server": "cp build/server.js dist/server.js",
      "copy:index": "cp src/client/index.html dist/client/index.html",
      "copy": "npm run copy:server && npm run copy:index",
      "prepare": "mkdir -p dist/client/scripts/ && npm run copy",
      "start": "node dist/server"
    },

3
これは、Webpackのドキュメントや他の記事よりもWebpackをよく理解するのに役立ちました:github.com/petehunt/webpack-howto
George Ananda


私の単純明快な例は、webpack-dev-serverでjsをHMRで処理することですが、静的サイトジェネレーターとwebpack devサーバーを使用できないという問題が発生しています。複雑な構成でこれを実現できますが、簡単に実行できます。したがって、主な違いは時間と学習曲線です。
dewwwald 2017


あなたのアップデートは答えでなければなりません、+ 1
Z. Khullah

回答:


82

この答えが役立つかもしれません。 タスクランナー(Gulp、Gruntなど)およびBundlers(Webpack、Browserify)。なぜ一緒に使うの?

...そしてここにgulpタスク内からwebpackを使用する例があります。これはさらに一歩進んで、webpack設定がes6で記述されていることを前提としています。

var gulp = require('gulp');
var webpack = require('webpack');
var gutil = require('gutil');
var babel = require('babel/register');
var config = require(path.join('../..', 'webpack.config.es6.js'));

gulp.task('webpack-es6-test', function(done){
   webpack(config).run(onBuild(done));
});

function onBuild(done) {
    return function(err, stats) {
        if (err) {
            gutil.log('Error', err);
            if (done) {
                done();
            }
        } else {
            Object.keys(stats.compilation.assets).forEach(function(key) {
                gutil.log('Webpack: output ', gutil.colors.green(key));
            });
            gutil.log('Webpack: ', gutil.colors.blue('finished ', stats.compilation.name));
            if (done) {
                done();
            }
        }
    }
}

アプリが複雑になるにつれて、上記の例のように、webpackタスクでgulpを使用したくなるかもしれません。これにより、ビルドでWebpackローダーとプラグインが実際に実行しないいくつかの興味深いことを実行できます。出力ディレクトリの作成、サーバーの起動など。まあ、簡潔に言うと、webpackは実際にこれらのことを実行できますが、長期的なニーズのために制限される場合があります。gulp-> webpackから得られる最大の利点の1つは、さまざまな環境に合わせてwebpack構成をカスタマイズし、gulpに適切なタイミングで適切なタスクを実行できることです。それは本当にあなた次第ですが、gulpからwebpackを実行することには何の問題もありません。実際、それを行う方法のかなり興味深い例がいくつかあります。


私のwebpackプロジェクトは非常に大きいので、コマンドラインコマンドstackoverflow.com/questions/34727743/…を使用してノードメモリを増やす必要があります。webpackを直接使用する方法はありますか?
Abhinav Singi

これら2つを確認してください。nodeまたはwebpackを実行する前に、v8メモリーを設定する必要があります。 stackoverflow.com/questions/7193959/…およびwebpack.github.io/docs/build-performance.html
4m1r

なぜこれを答えとして受け入れたのかわかりません。おそらくあなたが最初に共有したリンクが原因だったと思います。しかし、gulpのwebpackを使用していますか?あなたが今私に尋ねるなら、それはさらに混乱です:)。私はそのようなものに頼ろうともしません。
PositiveGuy

80

NPMスクリプトはgulpと同じことができますが、コードは約50分の1です。実際、コードはまったくなく、コマンドライン引数のみです。

たとえば、さまざまな環境でさまざまなコードが必要な場合に説明したユースケース。

Webpack + NPMスクリプトを使用すると、これは簡単です。

"prebuild:dev": "npm run clean:wwwroot",
"build:dev": "cross-env NODE_ENV=development webpack --config config/webpack.development.js --hot --profile --progress --colors --display-cached",
"postbuild:dev": "npm run copy:index.html && npm run rename:index.html",

"prebuild:production": "npm run clean:wwwroot",
"build:production": "cross-env NODE_ENV=production webpack --config config/webpack.production.js --profile --progress --colors --display-cached --bail",
"postbuild:production": "npm run copy:index.html && npm run rename:index.html",

"clean:wwwroot": "rimraf -- wwwroot/*",
"copy:index.html": "ncp wwwroot/index.html Views/Shared",
"rename:index.html": "cd ../PowerShell && elevate.exe -c renamer --find \"index.html\" --replace \"_Layout.cshtml\" \"../MyProject/Views/Shared/*\"",

これで、2つのwebpack構成スクリプト(1つは開発モード用、もうwebpack.development.js1つは本番モード用)を保守するだけwebpack.production.jsです。またwebpack.common.js、すべての環境で共有されるwebpack構成を格納するを利用し、webpackMergeを使用してそれらをマージします。

NPMスクリプトのクールさのために、gulpがStreams / pipesを実行する方法と同様に、簡単にチェーンできます。

上記の例では、開発用にビルドするには、コマンドラインに移動してを実行するだけnpm run build:devです。

  1. NPMが最初に実行されprebuild:dev
  2. その後build:dev
  3. そして最後にpostbuild:dev

プレフィックスがで実行するためにどの順番NPMを教えてください。prepost

気付いた場合は、Webpack + NPMスクリプトを使用して、などのネイティブプログラムのgulp rimraf-wrapperの代わりに、などのネイティブプログラムを実行できますgulp-rimraf。ここで私がやったように、ネイティブのWindows .exeファイルを実行することもできますelevate.exeまたはLinuxまたはMac上のネイティブの* nixファイルをます。

gulpでも同じことを試してください。誰かがやって来るのを待って、使用したいネイティブプログラムのgulp-wrapperを書く必要があります。さらに、おそらく次のような複雑なコードを記述する必要があります:(angular2-seedリポジトリから直接取得

Gulp開発コード

import * as gulp from 'gulp';
import * as gulpLoadPlugins from 'gulp-load-plugins';
import * as merge from 'merge-stream';
import * as util from 'gulp-util';
import { join/*, sep, relative*/ } from 'path';

import { APP_DEST, APP_SRC, /*PROJECT_ROOT, */TOOLS_DIR, TYPED_COMPILE_INTERVAL } from '../../config';
import { makeTsProject, templateLocals } from '../../utils';

const plugins = <any>gulpLoadPlugins();

let typedBuildCounter = TYPED_COMPILE_INTERVAL; // Always start with the typed build.

/**
 * Executes the build process, transpiling the TypeScript files (except the spec and e2e-spec files) for the development
 * environment.
 */
export = () => {
  let tsProject: any;
  let typings = gulp.src([
    'typings/index.d.ts',
    TOOLS_DIR + '/manual_typings/**/*.d.ts'
  ]);
  let src = [
    join(APP_SRC, '**/*.ts'),
    '!' + join(APP_SRC, '**/*.spec.ts'),
    '!' + join(APP_SRC, '**/*.e2e-spec.ts')
  ];

  let projectFiles = gulp.src(src);
  let result: any;
  let isFullCompile = true;

  // Only do a typed build every X builds, otherwise do a typeless build to speed things up
  if (typedBuildCounter < TYPED_COMPILE_INTERVAL) {
    isFullCompile = false;
    tsProject = makeTsProject({isolatedModules: true});
    projectFiles = projectFiles.pipe(plugins.cached());
    util.log('Performing typeless TypeScript compile.');
  } else {
    tsProject = makeTsProject();
    projectFiles = merge(typings, projectFiles);
  }

  result = projectFiles
    .pipe(plugins.plumber())
    .pipe(plugins.sourcemaps.init())
    .pipe(plugins.typescript(tsProject))
    .on('error', () => {
      typedBuildCounter = TYPED_COMPILE_INTERVAL;
    });

  if (isFullCompile) {
    typedBuildCounter = 0;
  } else {
    typedBuildCounter++;
  }

  return result.js
    .pipe(plugins.sourcemaps.write())
// Use for debugging with Webstorm/IntelliJ
// https://github.com/mgechev/angular2-seed/issues/1220
//    .pipe(plugins.sourcemaps.write('.', {
//      includeContent: false,
//      sourceRoot: (file: any) =>
//        relative(file.path, PROJECT_ROOT + '/' + APP_SRC).replace(sep, '/') + '/' + APP_SRC
//    }))
    .pipe(plugins.template(templateLocals()))
    .pipe(gulp.dest(APP_DEST));
};

Gulp Production code

import * as gulp from 'gulp';
import * as gulpLoadPlugins from 'gulp-load-plugins';
import { join } from 'path';

import { TMP_DIR, TOOLS_DIR } from '../../config';
import { makeTsProject, templateLocals } from '../../utils';

const plugins = <any>gulpLoadPlugins();

const INLINE_OPTIONS = {
  base: TMP_DIR,
  useRelativePaths: true,
  removeLineBreaks: true
};

/**
 * Executes the build process, transpiling the TypeScript files for the production environment.
 */

export = () => {
  let tsProject = makeTsProject();
  let src = [
    'typings/index.d.ts',
    TOOLS_DIR + '/manual_typings/**/*.d.ts',
    join(TMP_DIR, '**/*.ts')
  ];
  let result = gulp.src(src)
    .pipe(plugins.plumber())
    .pipe(plugins.inlineNg2Template(INLINE_OPTIONS))
    .pipe(plugins.typescript(tsProject))
    .once('error', function () {
      this.once('finish', () => process.exit(1));
    });


  return result.js
    .pipe(plugins.template(templateLocals()))
    .pipe(gulp.dest(TMP_DIR));
};

実際のgulpコードはこれよりもはるかに複雑です。これは、リポジトリ内の数十のgulpファイルのうちの2つにすぎないためです。

それで、あなたにとってどちらがより簡単ですか?

私の意見では、NPMスクリプトは、有効性と使いやすさの両方において、大げさで不満をはるかに超えており、主要な時間の節約になるため、すべてのフロントエンド開発者はワークフローでの使用を検討する必要があります。

更新

GPMをNPMスクリプトおよびWebpackと組み合わせて使用​​したいというシナリオが1つあります。

たとえば、iPadまたはAndroidデバイスでリモートデバッグを行う必要がある場合、追加のサーバーを起動する必要があります。以前は、「複合」実行構成で簡単なIntelliJ IDEA(またはWebstorm)内から、すべてのサーバーを個別のプロセスとして実行していました。しかし、それらを停止して再起動する必要がある場合、5つの異なるサーバータブを閉じる必要があり、さらに、出力がさまざまなウィンドウに分散されていました。

gulpの利点の1つは、個別の独立したプロセスからのすべての出力を1つのコンソールウィンドウにチェーンして、すべての子サーバーの親にすることができることです。

そこで、NPMスクリプトまたはコマンドを直接実行するだけの非常に単純なgulpタスクを作成しました。これにより、すべての出力が1つのウィンドウに表示され、gulpタスクウィンドウを閉じることで5つのサーバーすべてを一度に簡単に終了できます。

Gulp.js

/**
 * Gulp / Node utilities
 */
var gulp = require('gulp-help')(require('gulp'));
var utils = require('gulp-util');
var log = utils.log;
var con = utils.colors;

/**
 * Basic workflow plugins
 */
var shell = require('gulp-shell'); // run command line from shell
var browserSync = require('browser-sync');

/**
 * Performance testing plugins
 */
var ngrok = require('ngrok');

// Variables
var serverToProxy1 = "localhost:5000";
var finalPort1 = 8000;


// When the user enters "gulp" on the command line, the default task will automatically be called. This default task below, will run all other tasks automatically.

// Default task
gulp.task('default', function (cb) {
   console.log('Starting dev servers!...');
   gulp.start(
      'devserver:jit',
      'nodemon',
      'browsersync',
      'ios_webkit_debug_proxy'
      'ngrok-url',
      // 'vorlon',
      // 'remotedebug_ios_webkit_adapter'
   );
});

gulp.task('nodemon', shell.task('cd ../backend-nodejs && npm run nodemon'));
gulp.task('devserver:jit', shell.task('npm run devserver:jit'));
gulp.task('ios_webkit_debug_proxy', shell.task('npm run ios-webkit-debug-proxy'));
gulp.task('browsersync', shell.task(`browser-sync start --proxy ${serverToProxy1} --port ${finalPort1} --no-open`));
gulp.task('ngrok-url', function (cb) {
   return ngrok.connect(finalPort1, function (err, url) {
      site = url;
      log(con.cyan('ngrok'), '- serving your site from', con.yellow(site));
      cb();
   });
});
// gulp.task('vorlon', shell.task('vorlon'));
// gulp.task('remotedebug_ios_webkit_adapter', shell.task('remotedebug_ios_webkit_adapter'));

私の意見では、5つのタスクを実行するだけのコードはまだかなりありますが、目的のために機能します。1つの注意点はgulp-shell、などの一部のコマンドが正しく実行されていないように見えることですios-webkit-debug-proxy。そのため、同じコマンドを実行するだけのNPMスクリプトを作成する必要があり、それが機能しました。

したがって、私は主にすべてのタスクにNPMスクリプトを使用しますが、一度に多数のサーバーを実行する必要がある場合は、Gulpタスクを起動して支援します。適切な仕事に適したツールを選択してください。

アップデート2

私は今と呼ばれるスクリプトを使用、同時に上記の一気のタスクと同じことを行います。複数のCLIスクリプトを並行して実行し、それらをすべて同じコンソールウィンドウにパイプします。使用方法は非常に簡単です。もう一度、コードは必要ありません(まあ、コードは同時にnode_module内にありますが、それについて心配する必要はありません)。

// NOTE: If you need to run a command with spaces in it, you need to use 
// double quotes, and they must be escaped (at least on windows).
// It doesn't seem to work with single quotes.

"run:all": "concurrently \"npm run devserver\" nodemon browsersync ios_webkit_debug_proxy ngrok-url"

これにより、5つのスクリプトすべてが1つの端末にパイプで並列に実行されます。驚くばかり!このため、コードなしで同じタスクを実行する非常に多くのcliスクリプトがあるため、gulpを使用することはほとんどありません。

これらを深く比較するこれらの記事を読むことをお勧めします。


14
それはあなたの仕事が比較的簡単な原因です。シェルを使用した複雑なビルドのスクリプト作成:-)
Filip Sobczak

5
これらは単なる例です。私のビルドは非常に複雑で、シェルで実行する多くのスクリプトがあり、問題なく動作し、メンテナンスも簡単です。そして、NPMスクリプトが私のためにしないこと、webpackは、uglify、gzipの圧縮、変換などを行います。ありがとう。あなたが一口を必要とするほど複雑なものは何ですか?
TetraDev 2016年

2
(1年以上後lol):ありがとう、素晴らしい応答!!
PositiveGuy

1
@ user108471確かにwebpackはできます。関連付けられたIDでコンパイルされたすべてのモジュールをリストするassets.jsonを作成できます。適切なプラグインを使用して、より多くのタイプのビルド時情報JSONファイルを作成できます。具体的にどのようなことを言っているのですか
TetraDev 2017年

1
@GiannosCharalambousそのヒントをありがとう。私は実際にnpm-run-all数か月間使用していますが、-p並列フラグを使用することさえ考えていませんでした!私は今週それを試します
TetraDev

8

異なるプロジェクトで両方のオプションを使用しました。

ここで私が使用して一緒に置くことを1つの定型であるgulpwebpack- https://github.com/iroy2000/react-reflux-boilerplate-with-webpack

でのみ使用される他のプロジェクトwebpackがありnpm tasksます。

そして、どちらも完全に問題なく動作します。そして、それはあなたのタスクがどれほど複雑で、あなたがあなたの設定でどれだけ多くのコントロールを持ちたいかということになると思います。

たとえば、タスクがシンプルであれば、LETの言うdevbuildtest...など(非常に標準です)、あなただけのシンプルで完全に罰金ですwebpacknpm tasks

しかし、非常に複雑なワークフローがあり、構成をより詳細に制御したい場合は(コーディングのため)、gulpルートを使用できます。

しかし、私の経験から、webpackエコシステムは必要なプラグインとローダーを十分に提供しているので、gulpでしかできないことがない限り、最小限のアプローチを使用するのが好きです。また、システムに必要なものが1つ少ない場合は、構成が簡単になります。

そして、多くの場合、今日では、実際にgulp and browsifyすべてを1人で置き換えるwebpack人がいます。


5
そうですが、Webpackは理解するのが非常に複雑であるという評判が悪かったです。私は最初にbrowserifyでgulpを使用する傾向がありますが、まだWebpackを使用する準備ができていませんが、一部にはフロントエンドのBrowserifyまたはノードで多くのことを行っていないため、誰もがgulpを使用してどのように実行しているかを知りたいと思います最初にbrowserifyを実行することで、経験の点でその歴史を知ることができます
PositiveGuy

1
Webpackは、gulp、grunt、browserify、typescriptなど、Webpackを使用していない場合にのみ複雑になります。設定ファイルを設定してローダーを操作する方法を理解すれば、Webpackは非常に使いやすくなります。実際、設定ファイルは、実際に機能するWebpackビルドの場合は20行から30行の短いコードにすることができ、必要に応じて堅牢にすることができます。言うまでもなく、Webpack Hot Module Replacementは本当に素晴らしいです。参照:andrewhfarmer.com/understanding-hmrおよびandrewhfarmer.com/webpack-hmr-tutorialおよびmedium.com/@dabit3/beginner-s-guide-to-webpack-b1f1a3638460
TetraDev

2

GulpとWebpackの概念はかなり異なります。あなたはガルプを伝える方法をフロントエンドコード一緒にステップ・バイ・ステップを置くことができますが、WebPACKのを教えて何をあなたが設定ファイルを介して欲しいです。

これが短い記事(5分の読み取り)です。違いの理解について説明しました:https : //medium.com/@Maokai/compile-the-front-end-from-gulp-to-webpack-c45671ad87fe

昨年、当社はGulpからWebpackに移行しました。少し時間がかかりましたが、Gulpで行ったすべての作業をWebpackに移行する方法を見つけました。私たちにとって、Gulpで行ったすべてのことはWebpackを通じても実行できますが、その逆はできません。

本日現在、私はWebpackのみを使用し、GulpとWebpackの混合を回避することをお勧めします。これにより、あなたとあなたのチームは両方を学び、維持する必要がなくなります。特に、非常に異なる考え方を必要としているためです。


2

正直なところ、両方を使うのが一番だと思います。

  • すべてのJavaScript関連のWebpack
  • ガルプすべてのためのCSS関連。

私はまだwebpackでcssをパッケージ化するためのまともな解決策を見つける必要があります。今のところ、cssにgulpを、javascriptにwebpackを使用して満足しています。

npm説明したように、@ Tetradevとしてスクリプトも使用します。特に私が使用しているVisual Studioので、NPM Task runnerかなり信頼できます Webpack Task Runnerがかなりバグがあります。


NPMタスクランナー+ Gulpキーの使用を発見しました。webpackコマンドをpackange.jsonファイルに入れ、CSS(SASS)をgulpファイルに入れます。また、package.jsonをセットアップして、本番リリースの一部としてgulpタスクを呼び出すビルドステップを作成します
Nico
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.