Gulp + Webpack veya SADECE Webpack?


162

Webpack ile gulp kullanan insanlar görüyorum. Ama sonra webpack okumak yutmak değiştirebilirsiniz? Burada tamamen kafam karıştı ... biri açıklayabilir mi?

GÜNCELLEME

sonunda gulp ile başladım. Modern ön uçta yeniydim ve çabucak kalkmak istedim. Artık bir yıldan fazla bir süre sonra ayaklarımı ıslattığım için, webpack'e taşınmaya hazırım. Aynı ayakkabıyla başlayan insanlar için aynı yolu öneririm. Webpack'i deneyemeyeceğinizi söylemiyorum ama sadece önce gulp ile karmaşık görünüyorsa söylüyorum ... bu konuda yanlış bir şey yok.

Eğer yutmak istemiyorsanız, evet homurdanıyor ama aynı zamanda paketinizde komutları da belirtebilirsiniz. Örneğin:

"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
Bu, Webpack'i Webpack'in kendi dokümanlarından veya herhangi bir makalesinden daha iyi kavramamı sağladı: github.com/petehunt/webpack-howto
George Ananda Eman


Benim sade ve basit bir örnek, webpack-dev-server'ın js'imi HMR ile işlemesini isteyeceğim, ancak statik site jeneratörlerini ve webpack dev sunucusunu kullanamayacağım sorunlar yaşıyorum. Karmaşık konfigürasyonla bunu başarabilirim, ama düz ileri yudum da yapabilirim. Temel fark zaman ve öğrenme eğrisidir.
dewwwald

2 yıl sonra hala benzer konularda mücadele ediyorum ...
Frank Nocke

güncellemeniz bir cevap olmalı, +1
Z. Khullah

Yanıtlar:


82

Bu cevap yardımcı olabilir. Görev İkincisi (Gulp, Grunt, vb.) Ve Paketleyenler (Webpack, Browserify). Neden birlikte kullanılır?

... ve işte yutturma görevinden webpack kullanmaya bir örnek. Bu bir adım daha ileri gider ve webpack yapılandırmanızın es6'da yazılmış olduğunu varsayar.

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();
            }
        }
    }
}

Uygulamanız daha karmaşık hale geldikçe, yukarıdaki örnekte olduğu gibi bir web paketi göreviyle gulp kullanmak isteyebileceğinizi düşünüyorum. Bu, derlemenizde webpack yükleyicilerinin ve eklentilerinin gerçekten yapmadığı birkaç ilginç şey yapmanıza olanak tanır, yani. çıktı dizinleri oluşturma, sunucuları başlatma, vb. Eh, özlü olmak için, webpack aslında bunları yapabilir, ancak bunları uzun vadeli ihtiyaçlarınız için sınırlı bulabilirsiniz. Gulp -> webpack'ten aldığınız en büyük avantajlardan biri, webpack yapılandırmanızı farklı ortamlar için özelleştirebilmeniz ve gulp'in doğru görevi doğru zamanda yapmasını sağlamasıdır. Gerçekten size kalmış, ancak web paketini yudumdan çalıştırmanın yanlış bir yanı yok, aslında nasıl yapılacağına dair bazı ilginç örnekler var..


Benim webpack projem oldukça büyük - bu yüzden komut hafızası komutuyla da düğüm belleğini artırmam gerekiyor stackoverflow.com/questions/34727743/… Webpack üzerinden doğrudan yapmanın herhangi bir yolu var mı?
Abhinav Singi

Bu ikisine bir göz atın. Düğümü veya web paketini çalıştırmadan önce v8 belleğini ayarlamanız gerekir. stackoverflow.com/questions/7193959/… ve webpack.github.io/docs/build-performance.html
4m1r

Bunu neden cevap olarak kabul ettiğimden emin değilim. Sanırım muhtemelen paylaştığınız ilk bağlantıdan kaynaklanıyor. Ama yudumdan webpack mi kullanıyorsunuz? şimdi bana sorarsan bu daha da berbat :). Böyle bir şeye başvurmayı bile denemezdim.
PositiveGuy

80

NPM betikleri yutkuyla aynı şeyi yapabilir, ancak yaklaşık 50 kat daha az kodda. Aslında, hiç kod olmadan, sadece komut satırı argümanları.

Örneğin, farklı ortamlar için farklı kodlara sahip olmak istediğiniz yerde açıkladığınız kullanım durumu.

Webpack + NPM Scripts ile bu kolay:

"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/*\"",

Şimdi, biri geliştirme modu, webpack.development.jsdiğeri üretim modu için olmak üzere iki web paketi yapılandırma komut dosyası bulundurmanız yeterlidir webpack.production.js. Ayrıca webpack.common.js, tüm ortamlarda paylaşılan bir webpack yapılandırmasını kullanır ve bunları birleştirmek için webpackMerge kullanırım.

NPM betiklerinin serinliğinden dolayı, yırtılma akışları / boruları gibi kolay zincirleme sağlar.

Yukarıdaki örnekte, geliştirme amacıyla oluşturmak için komut satırınıza gidin ve çalıştırın npm run build:dev.

  1. NPM ilk önce prebuild:dev,
  2. Sonra build:dev,
  3. Ve son olarak postbuild:dev.

preVe postön ekler de yürütmek için hangi sırayla UÖM'yi söyle.

Dikkat ederseniz, Webpack + NPM komut dosyalarıyla, yerel bir program rimrafiçin yudum sarmalayıcı yerine yerel bir program çalıştırabilirsiniz gulp-rimraf. Ayrıca burada yaptığım gibi yerel Windows .exe dosyalarını elevate.exeveya Linux veya Mac'te yerel * nix dosyalarını da çalıştırabilirsiniz .

Aynı şeyi yudumla yapmayı deneyin. Birinin gelmesini beklemek ve kullanmak istediğiniz yerel program için bir yudum sarmalayıcısı yazmak zorunda kalacaksınız. Buna ek olarak, muhtemelen şöyle kıvrımlı kod yazmanız gerekecektir: (doğrudan açısal2-tohum deposundan alınır )

Gulp Geliştirme kodu

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 Üretim kodu

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));
};

Gerçek küfür kodu, bundan daha karmaşıktır, çünkü bu, repodaki birkaç düzine gulp dosyasından sadece 2 tanesidir.

Peki hangisi senin için daha kolay?

Kanımca, NPM betikleri hem etkinlik hem de kullanım kolaylığı açısından yutkunluğu ve homurdanmayı çok aşıyor ve tüm ön uç geliştiricileri bunu iş akışlarında kullanmayı düşünmeli, çünkü bu büyük bir zaman tasarrufu.

GÜNCELLEME

Gulp'i NPM komut dosyaları ve Webpack ile birlikte kullanmak istediğim yerde karşılaştığım bir senaryo var.

Yapmam gereken zaman ayıklama uzaktan örneğin bir iPad veya Android cihazı, ekstra sunucularını başlamak gerekir. Geçmişte tüm sunucuları, "Bileşik" Çalıştırma Yapılandırması ile kolay olan IntelliJ IDEA (Veya Webstorm) içinden ayrı işlemler olarak çalıştırdım. Ancak bunları durdurup yeniden başlatmam gerekirse, 5 farklı sunucu sekmesini kapatmak sıkıcıydı, ayrıca çıktı farklı pencerelere yayıldı.

Yutmanın faydalarından biri, tüm bağımsız sunucuların tüm çıktılarını, tüm alt sunucuların üst öğesi olan tek bir konsol penceresine zincirleyebilmesidir.

Bu yüzden, sadece NPM komut dosyalarımı veya komutlarımı doğrudan çalıştıran çok basit bir yutkunma görevi yarattım, böylece tüm çıktı bir pencerede görünür ve yutmak görev penceresini kapatarak 5 sunucunun hepsini bir kerede kolayca bitirebilirim.

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'));

Bence, sadece 5 görev için biraz kod, bence, ama bu amaç için çalışıyor. Bir uyarı, gulp-shellbazı komutları doğru çalıştırmak gibi görünmüyor ios-webkit-debug-proxy. Bu yüzden sadece aynı komutu yürüten bir NPM Script oluşturmak zorunda kaldım ve sonra çalışıyor.

Bu yüzden öncelikle tüm görevlerim için NPM Komut Dosyalarını kullanıyorum, ancak bazen bir seferde bir grup sunucu çalıştırmam gerektiğinde, yardım etmek için Gulp görevimi ateşleyeceğim. Doğru iş için doğru aracı seçin.

GÜNCELLEME 2

Şimdi yukarıdaki yudum görevi ile aynı şeyi yapan eşzamanlı olarak adlandırılan bir komut dosyası kullanıyorum . Birden fazla CLI komut dosyasını paralel olarak çalıştırır ve hepsini aynı konsol penceresine bağlar ve kullanımı çok basittir. Bir kez daha, kod gerekmez (peki, eşzamanlı olarak kod node_module içinde bulunur, ancak kendinizi bununla ilgilenmeniz gerekmez)

// 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"

Bu, 5 komut dosyasının tümünü bir terminale paralel olarak bağlanır. Müthiş! Bu noktada, nadiren gulp kullanıyorum, çünkü aynı görevleri kod olmadan yapmak için çok fazla cli komut dosyası var.

Derinlemesine karşılaştıran bu makaleleri okumanızı tavsiye ederim.


14
Çünkü görevleriniz nispeten kolay. İyi şanslar komut dosyası karmaşık kabuk ile inşa :-)
Filip Sobczak

5
Bunlar sadece örnektir. Yapım çok karmaşık ve kabuk üzerinde çalışan birçok komut dosyası var, kusursuz çalışıyor ve bakımı kolaydır. Ve, NPM betikleri benim için ne yapmaz, webpack, uglify, sıkıştır gzip, dönüştürme, vb gibi yapar. Teşekkürler. Yutkunmak için bu kadar karmaşık olan nedir?
TetraDev

2
(bir yıldan fazla lol): çok teşekkürler, mükemmel yanıt !!
PositiveGuy

1
@ user108471 Elbette webpack, orada ilişkili kimliklerle derlenmiş tüm modülleri listeleyen bir varlık.json oluşturabilir. Doğru eklentilerle JSON dosyaları daha birçok tür oluşturma zamanı bilgisi oluşturulabilir. Bu yiğitlikten ne tür bahsediyorsunuz?
TetraDev

1
@GiannosCharalambous Bu ipucu için teşekkürler. Aslında npm-run-allbirkaç aydır kullanıyorum , ama -pparalel bayrağı kullanmayı düşünmedim bile ! Bunu bu hafta deneyeceğim
TetraDev

8

Her iki seçeneği de farklı projelerimde kullandım.

İşte - https://github.com/iroy2000/react-reflux-boilerplate-with-webpackgulp ile bir araya getirdiğim bir kazan plakası . webpack

Sadece webpackbirlikte kullanılan başka bir projem var npm tasks.

Ve ikisi de tamamen iyi çalışıyor. Ve bence bu, görevinizin ne kadar karmaşık olduğu ve yapılandırmanızda ne kadar kontrol sahibi olmak istediğinizdir.

Diyelim sen görevleri basitse Örneğin, izin dev, build, test... vb (ki çok standarttır), sadece basit ile tamamen iyi webpackile npm tasks.

Ancak çok karmaşık bir iş akışınız varsa ve yapılandırmanız üzerinde daha fazla kontrole sahip olmak istiyorsanız (kodlama olduğu için), yol güzergahına gidebilirsiniz.

Ama tecrübelerime göre, webpack ekosistemi ihtiyacım olandan fazla eklenti ve yükleyici sağlıyor ve bu yüzden sadece yudumda yapabileceğiniz bir şey olmadıkça çıplak minimum yaklaşımı kullanmayı seviyorum. Ayrıca, sisteminizde daha az bir şey varsa yapılandırmanızı kolaylaştıracaktır.

Ve çoğu zaman, günümüzde, insanların aslında tek başına gulp and browsifyikame ettiklerini görüyorum webpack.


5
Evet ama Webpack, anlamak için aşırı karmaşık olduğu konusunda kötü bir üne sahipti. İlk olarak gultteri browserify ile kullanmaya çalışıyorum, henüz Webpack'i almaya hazır değilim ve kısmen ön uçta Browserify veya düğüm ile çok fazla şey yapmadım, bu yüzden herkesin gulp ile nasıl yaptığını öğrenmek istiyorum ve browserify ilk olarak deneyim açısından bu geçmişe sahibim
PositiveGuy

1
Webpack, sadece yudum, homurdanma, browserify, daktilo ve başka herhangi bir şey gibi üzerinde çalışmadıysanız karmaşıktır. Yapılandırma dosyasını nasıl kuracağınızı ve yükleyicilerle nasıl çalışacağınızı anladıktan sonra Webpack'in kullanımı son derece kolaydır. Aslında, yapılandırma dosyaları çalışan bir webpack derlemesi için 20-30 satırlık kod kadar kısa olabilir ve ihtiyacınız olduğu kadar sağlam olabilir. Webpack Hot Module Değiştirme'den bahsetmemek kesinlikle şaşırtıcı. Bakınız: andrewhfarmer.com/understanding-hmr ve andrewhfarmer.com/webpack-hmr-tutorial and medium.com/@dabit3/beginner-s-guide-to-webpack-b1f1a3638460
TetraDev

2

Gulp ve Webpack kavramları oldukça farklıdır. Sen lokmada söyle nasıl ön uç kod birlikte adım adım koymak, ancak WebPack anlatmak Ne sen bir yapılandırma dosyası üzerinden istiyorum.

İşte kısa bir makale (5 dk okuma) Farklılıkları anladığımı açıklayan bir yazı yazdım: https://medium.com/@Maokai/compile-the-front-end-from-gulp-to-webpack-c45671ad87fe

Şirketimiz geçtiğimiz yıl Gulp'ten Webpack'e geçti. Biraz zaman almasına rağmen, Gulp'te yaptığımız her şeyin Webpack'e nasıl taşınacağını anladık. Bize göre Gulp'te yaptığımız her şey Webpack üzerinden de yapabiliriz, ama tam tersi değil.

Bugün itibariyle, sadece Webpack'i kullanmanızı ve Gulp ve Webpack'in karışımından kaçınmanızı öneririm, böylece sizin ve ekibinizin her ikisini de öğrenmesi ve sürdürmesi gerekmez, özellikle de çok farklı zihniyetlere ihtiyaç duydukları için.


2

Dürüst olmak gerekirse en iyi ikisini de kullanmak olduğunu düşünüyorum.

  • İlgili tüm javascript için Webpack .
  • İlgili tüm css için Gulp .

Hala webpack ile css ambalaj için iyi bir çözüm bulmak zorundayım ve şimdiye kadar css için gulp ve javascript için webpack kullanarak mutluyum.

Ayrıca npmbetikleri açıklandığı gibi @Tetradev olarak da kullanıyorum . Expecially kullandığım Visual Studiove NPM Task runneroldukça güvenilir iken Webpack Task Runneroldukça adamcağız .


NPM Görev Koşucusu + Gulp anahtarını kullanarak buldum. Webpack komutlarını packange.json dosyasına ve gulp dosyasına ilişkin CSS'ye (SASS) koyun. Ayrıca package.json'u, üretim sürümünün bir parçası olarak yutkunma görevini çağıran bir yapı adımına sahip olacak şekilde ayarlayın
Nico
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.