Gulp + Webpack або JUST Webpack?


161

Я бачу людей, які використовують gulp з webpack. Але тоді я читаю, що веб-пакет може замінити глот? Я тут абсолютно розгублений ... може хтось пояснить?

ОНОВЛЕННЯ

врешті-решт я почав із глоткою. Я був новим у сучасному фронті, і просто хотів швидко встати та працювати. Тепер, коли я перестала мочити ноги після більш ніж року, я готова перейти до вебпакету. Я пропоную той самий маршрут для людей, які починають в одному взутті. Не кажучи, що ви не можете спробувати webpack, а просто скажіть, якщо це здається складним, почніть спочатку із глоткою ... нічого поганого в цьому немає.

Якщо ви не хочете, щоб глотнути, так, буркне, але ви також можете просто вказати команди у своєму пакеті.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
Джордж Ананда Еман

blog.andrewray.me/webpack-when-to-use-and-для чого не потрібно використовувати глоток з webpack
Енді Рей

Моїм простим і простим прикладом є те, що я хочу, щоб webpack-dev-сервер обробляв мій js за допомогою HMR, але у мене виникають проблеми, коли я не можу використовувати генератори статичних сайтів та сервер розробників webpack. За допомогою складної конфігурації я можу досягти цього, але прямий глотком я також можу це зробити. Тож основна відмінність - це крива часу та навчання.
dewwwald


ваше оновлення має бути відповіддю, +1
З. Хулла

Відповіді:


82

Ця відповідь може допомогти. Робочі завдань (Gulp, Grunt тощо) та Bundlers (Webpack, Browserify). Навіщо використовувати разом?

... і ось приклад використання webpack із задачі gulp. Це піде на крок далі і передбачає, що конфігурація вашого веб-пакета написана в 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();
            }
        }
    }
}

Я думаю, що ви побачите, що ваш додаток ускладнюється, ви можете використовувати gulp із завданням webpack, як показано вище. Це дозволяє зробити ще кілька цікавих речей у вашій збірці, які завантажувачі веб-пакетів та плагіни насправді не роблять, тобто. створення вихідних каталогів, запуск серверів тощо. Ну, щоб бути лаконічним, webpack насправді може робити це, але ви можете вважати їх обмеженими для своїх довгострокових потреб. Однією з найбільших переваг, яку ви отримуєте від gulp -> webpack, є те, що ви можете налаштувати конфігурацію веб-пакета для різних середовищ і змусити gulp виконати правильне завдання в потрібний час. Це насправді залежить від вас, але немає нічого поганого в запуску webpack від gulp, насправді є досить цікаві приклади того, як це зробити..


Мій проект webpack досить великий - тому мені потрібно збільшити пам'ять вузлів також за допомогою команди командного рядка stackoverflow.com/questions/34727743/… Чи є спосіб зробити це безпосередньо через webpack?
Абхінав Сінгі

Перевірте ці два. Можливо, вам доведеться встановити пам'ять v8 перед запуском вузла або веб-пакета. stackoverflow.com/questions/7193959 / ... і webpack.github.io/docs/build-performance.html
4m1r

Я не впевнений, чому я прийняв це як відповідь. Я припускаю, що це, мабуть, було пов’язано з першим посиланням, яким ви поділилися. Але використовуєте webpack від gulp? це ще більше безладдя, якщо ви запитаєте мене зараз :). Я б навіть не намагався вдатися до чогось подібного.
PositiveGuy

80

Сценарії NPM можуть робити те саме, що і gulp, але приблизно в 50 разів менше коду. Насправді, без коду, лише аргументи командного рядка.

Наприклад, ви описали випадок використання, який ви описали там, де ви хочете мати різний код для різних середовищ.

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

Тепер ви просто підтримувати два WebPack конфігурації скриптів, один для режиму розробки, webpack.development.jsі один для режиму виробництва, webpack.production.js. Я також використовую webpack.common.jsконфігурацію вебпакету, що використовується в усіх середовищах, і використовую webpackMerge для їх об'єднання.

Через прохолоду сценаріїв NPM це дозволяє легко ланцюг, подібний до того, як глотка робить Streams / pipe.

У наведеному вище прикладі, щоб побудувати для розробки, ви просто переходите до свого командного рядка та виконуєте npm run build:dev.

  1. NPM спочатку запустився prebuild:dev,
  2. тоді build:dev,
  3. І нарешті postbuild:dev.

preІ postпрефікси сказати НПМ , які для того , щоб виконати в.

Якщо ви помітили, за допомогою скриптів Webpack + NPM, ви можете запускати нативну програму, наприклад rimraf, замість gulp-обгортки для рідної програми, такої як gulp-rimraf. Ви також можете запускати вбудовані файли Windows .exe, як я це робив тут, elevate.exeабо рідні * nix файли на Linux або Mac.

Спробуйте зробити те ж саме із глоткою. Вам доведеться почекати, коли хтось прийде, і напишіть ковтанку для рідної програми, яку ви хочете використовувати. Крім того, вам, ймовірно, потрібно буде написати такий складний код: (взято прямо з repo 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

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 набагато складніше, ніж це, оскільки це лише 2 із кількох десятків файлів gulp у репо.

Отже, який вам легший?

На мою думку, сценарії NPM набагато перевершують залп та грухт, як за ефективністю, так і за простотою використання, і всі розробники на передньому кінці повинні розглянути можливість його використання у своєму робочому процесі, оскільки це головна економія часу.

ОНОВЛЕННЯ

Є один сценарій, з яким я стикався, коли хотів використовувати Gulp у поєднанні зі сценаріями NPM та Webpack.

Коли мені потрібно, наприклад, зробити віддалену налагодження на пристрої iPad або Android, мені потрібно запустити додаткові сервери. Раніше я запускав усі сервери як окремі процеси, з IntelliJ IDEA (або Webstorm), що легко за допомогою конфігурації запуску "Compound". Але якщо мені потрібно зупинити і перезапустити їх, було втомлено закривати 5 різних вкладок сервера, плюс вихід був розповсюджений у різних вікнах.

Однією з переваг gulp є те, що можна ланцюжок усіх результатів з окремих незалежних процесів в одне вікно консолі, яке стає батьківським для всіх дочірніх серверів.

Тож я створив дуже просту задачу gulp, яка просто запускає мої сценарії NPM або команди безпосередньо, тому весь результат з’являється в одному вікні, і я можу легко закінчити всі 5 серверів одразу, закривши вікно завдань gulp.

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 завдань, на мою думку, але це працює за цією метою. Один caveate є те , що , gulp-shellздається, не запускати деякі команди правильно, наприклад ios-webkit-debug-proxy. Тому мені довелося створити сценарій NPM, який просто виконує ту саму команду, і тоді вона працює.

Тому я в першу чергу використовую сценарії NPM для всіх своїх завдань, але іноді, коли мені потрібно запустити купу серверів відразу, я запускаю своє завдання Gulp, щоб допомогти. Підберіть правильний інструмент для правильної роботи.

ОНОВЛЕННЯ 2

Зараз я використовую скрипт, який називається одночасно, який робить те саме, що і завдання gulp вище. Він запускає паралельно декілька сценаріїв 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 сценаріїв паралельно передаються на один термінал. Дивовижно! Так що в цій точці я рідко використовую gulp, оскільки існує стільки сценаріїв кліпів, щоб виконувати ті самі завдання без коду.

Я пропоную прочитати ці статті, які поглиблюють їх.


14
Ось чому ваша задача відносно проста. Успіх сценаріїв складання складових з оболонкою :-)
Філіп Собчак

5
Це лише приклади. Моя збірка дуже складна і має безліч сценаріїв, виконаних на оболонці, працює бездоганно і легко обслуговується. І те, що сценарії NPM не роблять для мене, робить webpack, такий як uglify, сжатие gzip, перетворення тощо. Дякую. Що настільки складного, що вам потрібно ковтати?
TetraDev

2
(більше року пізніше кохана): велике спасибі, відмінна відповідь !!
PositiveGuy

1
@ user108471 Звичайно, веб-пакет може, він може створити asset.json, в якому перераховані всі модулі, зібрані з відповідними ідентифікаторами. Ще багато типів інформації про час побудови файлів JSON можна створити за допомогою правильних плагінів. Що конкретно ви маєте на увазі, що може зробити ковт?
TetraDev

1
@GiannosCharalambous Дякую за цю пораду. Я фактично використовую npm-run-allвже кілька місяців, але я навіть не думав використовувати -pпаралельний прапор! Я спробую це на цьому тижні
TetraDev

8

Я використовував обидва варіанти у своїх різних проектах.

Ось одна плита котла, яку я зібрав за gulpдопомогою webpack- https://github.com/iroy2000/react-reflux-boilerplate-with-webpack .

У мене є якийсь інший проект, який використовується тільки webpackз npm tasks.

І вони обидва працюють цілком чудово. І я думаю, що це згоряє в тому, наскільки складною є ваша задача та наскільки контроль ви хочете мати у своїй конфігурації.

Наприклад, якщо ви просто завдання, скажімо dev, build, test... і т.д. (що дуже стандарт), ви абсолютно нормально тільки з простим webpackз npm tasks.

Але якщо у вас дуже складний робочий процес і ви хочете мати більше контролю над своєю конфігурацією (адже це кодування), ви можете піти за маршрутом глоткою.

Але, з мого досвіду, екосистема webpack надає більш ніж достатньо плагінів і завантажувачів, які мені знадобляться, і тому я люблю використовувати мінімальний підхід, якщо не існує чогось, що ви можете зробити лише за допомогою глотання. А також, це полегшить вашу конфігурацію, якщо у вас є одна річ менше у вашій системі.

І багато разів, в наш час, я бачу людей, які насправді замінюють gulp and browsifyусіх разом webpackсамими.


5
Так, але Webpack мав погану репутацію надто складної для розуміння. Я схильний намагатися використовувати gulp спочатку за допомогою перегляду веб-переглядачів, але ще не готовий брати участь у Webpack. Частково я не робив багато чого з Browrify або вузлом на передній панелі, тому хочу дізнатися, як це все роблять за допомогою gulp і перегляньте спочатку просто так, що я маю цю історію з точки зору досвіду
PositiveGuy

1
Вебпак є складним лише тоді, коли ви з ним не працювали, як, наприклад, gulp, grunt, перегляньте, машинопис і все інше. Вебпак надзвичайно простий у використанні, коли ви зрозумієте, як налаштувати конфігураційний файл та працювати з завантажувачами. Насправді, конфігураційні файли можуть містити 20-30 рядків коду для роботи робочого веб-пакету і можуть бути настільки ж надійними, як вам потрібно. Не кажучи вже про заміну гарячого модуля Webpack абсолютно дивовижно. Дивіться: andrewhfarmer.com/understanding-hmr та andrewhfarmer.com/webpack-hmr-tutorial and medium.com/@dabit3/beginner-s-guide-to-webpack-b1f1a3638460
TetraDev

2

Поняття Gulp та Webpack досить різні. Ви розповідаєте Gulp, як поетапно поєднувати перехідний код, але ви повідомляєте 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 .
  • Gulp для всіх пов'язаних css .

Мені все-таки доведеться знайти гідне рішення для упаковки CSS з webpack, і поки що я радий використовувати gulp для css та webpack для javascript.

Я також використовую npmсценарії як @Tetradev, як описано. Особливо, оскільки я використовую Visual Studio, і хоча NPM Task runnerце досить надійно, Webpack Task Runner це досить баггі .


Я знайшов за допомогою NPM Task Runner + Gulp ключ. Помістіть команди webpack у файл packange.json і CSS (SASS), пов'язані у файл gulp. Крім того, встановіть package.json, щоб він створив крок збирання, який викликає завдання gulp як частина випуску
Ніко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.