펄프 + 웹팩 또는 그냥 웹팩?


161

사람들이 webpack과 함께 gulp를 사용하는 것을 봅니다. 그러나 나는 웹팩이 꿀꺽 꿀꺽 꿀 수 있다고 읽었습니까? 나는 여기에 완전히 혼란 스럽습니다 ... 누군가가 설명 할 수 있습니까?

최신 정보

결국 나는 꿀꺽 꿀꺽 시작했다. 나는 현대 프론트 엔드를 처음 접했고 빨리 일어 서고 싶었습니다. 1 년이 지난 후 발이 완전히 젖었으므로 이제 웹팩으로 이동할 준비가되었습니다. 같은 신발을 신는 사람들에게 같은 길을 제안합니다. webpack을 시도 할 수는 없지만 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 Eman

blog.andrewray.me/webpack-when-to-use-and-and-webpack 과 함께 gulp를 사용할 필요가없는 이유
Andy Ray

내 평범하고 간단한 예는 webpack-dev-server가 HMR로 js를 처리하기를 원하지만 정적 사이트 생성기와 webpack dev 서버를 사용할 수없는 문제가 발생한다는 것입니다. 복잡한 구성 으로이 작업을 수행 할 수는 있지만 곧은 꿀꺽 꿀꺽입니다. 가장 큰 차이점은 시간과 학습 곡선입니다.
dewwwald


당신의 업데이트는 답이되어야합니다, +1
Z. Khullah

답변:


82

이 답변이 도움이 될 수 있습니다. 작업 러너 (Gulp, Grunt 등) 및 Bundler (Webpack, Browserify). 왜 함께 사용합니까?

... 그리고 gulp 작업 내에서 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();
            }
        }
    }
}

앱이 더 복잡 해짐에 따라 위의 예제와 같이 웹팩 작업에 꿀꺽 꿀꺽 사용하는 것이 좋습니다. 이를 통해 빌드에서 웹팩 로더와 플러그인이 실제로하지 않는 몇 가지 흥미로운 작업을 수행 할 수 있습니다. 간결하게, 출력 디렉토리 만들기, 서버 시작 등. 웹팩은 실제로 그러한 작업을 수행 할 수 있지만 장기적인 요구에 따라 제한 될 수 있습니다. gulp-> webpack에서 얻을 수있는 가장 큰 장점 중 하나는 다양한 환경에 맞게 webpack 구성을 사용자 정의하고 gulp가 적시에 올바른 작업을 수행 할 수 있다는 것입니다. 그것은 당신에게 달려 있지만, gulp에서 webpack을 실행하는 데 아무런 문제가 없습니다. 실제로 그것을 수행하는 방법에 대한 흥미로운 흥미로운 예가 있습니다..


내 웹팩 프로젝트는 상당히 커서 명령 행 명령 stackoverflow.com/questions/34727743/을 통해 노드 메모리를 늘려야합니다. 웹팩을 통해 직접 그렇게 할 수있는 방법이 있습니까?
Abhinav Singi

이 두 가지를 확인하십시오. 노드 또는 웹팩을 실행하기 전에 v8 메모리를 설정해야합니다. stackoverflow.com/questions/7193959/…webpack.github.io/docs/build-performance.html
4m1r

왜 이것을 대답으로 받아들 였는지 잘 모르겠습니다. 아마 당신이 공유 한 첫 번째 링크 때문일 것입니다. 그러나 gulp에서 webpack을 사용합니까? 당신이 지금 나에게 묻는다면 그것은 더 혼란입니다 :). 나는 그런 것에 의지하려고 시도조차하지 않을 것입니다.
PositiveGuy

80

NPM 스크립트 는 꿀꺽 꿀꺽과 동일하게 수행 할 수 있지만 코드는 약 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.development.js 프로덕션 모드 용) 됩니다 webpack.production.js. 또한 webpack.common.js모든 환경에서 공유되는 webpack 구성을 포함하고 webpackMerge를 사용하여 병합합니다.

NPM 스크립트의 차가움으로 인해 gulp가 스트림 / 파이프와 비슷한 방식으로 체인을 쉽게 연결할 수 있습니다.

위의 예에서 개발을 위해 빌드하려면 간단히 명령 줄로 이동하여 실행하십시오. npm run build:dev .

  1. NPM이 먼저 실행됩니다 prebuild:dev ,
  2. 그때 build:dev ,
  3. 그리고 마지막으로 postbuild:dev .

그만큼 prepost접두사에서 실행되는 순서 NPM을 말한다.

Webpack + NPM 스크립트를 사용하면 다음과 같은 기본 프로그램 rimraf에 대한 gulp-wrapper 대신 과 같은 기본 프로그램을 실행할 수 있습니다.gulp-rimraf . 여기에서 한 것처럼 기본 Windows .exe 파일을 실행 elevate.exe하거나 Linux 또는 Mac에서 기본 * nix 파일을 실행할 수도 있습니다.

꿀꺽 꿀꺽 같은 일을 해보십시오. 누군가가 와서 사용하려는 기본 프로그램에 대한 꿀꺽 꿀꺽 래퍼를 작성해야합니다. 또한 다음과 같은 복잡한 코드를 작성해야 할 수도 있습니다. ( 각도 2 종 리포 에서 직접 가져옴 )

펄프 개발 코드

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

꿀꺽 꿀꺽 생산 코드

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 코드는 repo에있는 수십 개의 gulp 파일 중 2 개에 불과하므로 훨씬 복잡합니다.

어느 쪽이 더 쉬운가요?

필자의 의견으로는 NPM 스크립트는 효과와 사용 편의성 측면에서 괄목 할만한 수준을 넘어 설뿐 아니라 모든 프론트 엔드 개발자는 작업 시간을 크게 단축해야하므로 워크 플로에서이를 고려해야합니다.

최신 정보

NPM 스크립트 및 Webpack과 함께 Gulp를 사용하려는 시나리오가 하나 있습니다.

예를 들어 iPad 또는 Android 장치에서 원격 디버깅 을 수행 해야 할 경우 추가 서버를 시작해야합니다. 과거에는 "컴파운드"실행 구성으로 쉽게 IntelliJ IDEA (또는 Webstorm) 내에서 모든 서버를 별도의 프로세스로 실행했습니다. 그러나 중지하고 다시 시작 해야하는 경우 5 개의 다른 서버 탭을 닫아야하고 출력이 다른 창에 분산되어 지루했습니다.

gulp의 장점 중 하나는 별도의 독립적 인 프로세스의 모든 출력을 하나의 콘솔 창에 연결하여 모든 자식 서버의 부모가 될 수 있다는 것입니다.

따라서 NPM 스크립트 또는 명령을 직접 실행하는 매우 간단한 gulp 작업을 만들었으므로 모든 출력이 하나의 창에 표시되며 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 개의 작업을 실행하는 코드가 있지만 목적을 위해 작동합니다. 한 가지주의 할 점 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 개의 스크립트를 모두 병렬로 한 터미널에 파이프로 실행합니다. 대박! 따라서이 코드는 코드없이 동일한 작업을 수행하는 cli 스크립트가 너무 많기 때문에 gulp를 거의 사용하지 않습니다.

자세한 내용을 비교할 수있는이 기사를 읽으십시오.


14
그것은 당신의 작업이 비교적 쉬운 원인입니다. 행운을 빕니다 스크립팅 복잡한 :-) 쉘 빌드
필립 Sobczak에게

5
이것들은 단지 예일뿐입니다. 내 빌드는 매우 복잡하며 셸에서 실행되는 많은 스크립트가 있으며 완벽하게 작동하며 유지 관리가 쉽습니다. 그리고 NPM 스크립트가 나를 위해하지 않는 것, 웹팩은 uglify, gzip 압축, 변환 등과 같은 기능을 수행합니다. 감사합니다. 너무 복잡해서 꿀꺽 꿀꺽해야 할 것은 무엇입니까?
TetraDev

2
(1 년 이상 후의 lol) : 감사합니다.
PositiveGuy

1
@ user108471 물론 웹팩은 관련 ID로 컴파일 된 모든 모듈을 나열하는 asset.json을 만들 수 있습니다. 올바른 플러그인으로 더 많은 유형의 빌드 시간 정보 JSON 파일을 작성할 수 있습니다. 그 꿀꺽 꿀꺽 할 수있는 일을 구체적으로 언급하고 있습니까?
TetraDev 2016 년

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... 등 (이 매우 표준), 당신은 단지 간단한과 완전히 괜찮 webpacknpm tasks.

그러나 워크 플로가 매우 복잡하고 구성을 더 많이 제어하려면 (코딩이므로) 꿀꺽 꿀꺽 길을 갈 수 있습니다.

그러나 내 경험상, 웹팩 생태계는 필요한 플러그인과 로더를 충분히 제공하기 때문에 꿀꺽 꿀꺽에서만 할 수있는 일이 없다면 최소한의 접근 방식을 사용하는 것을 좋아합니다. 또한 시스템에 적은 것이 있으면 구성이 더 쉬워집니다.

그리고 요즘 많은 사람들이 실제로 gulp and browsify모든 것을 webpack혼자로 대체 하는 것을 봅니다 .


5
그러나 Webpack은 이해하기가 너무 복잡하다는 평판이 나빴습니다. 먼저 browserify를 사용하지 않고 browserify를 사용하여 gulp를 먼저 사용하려고하는 경향이 있으며 부분적으로 프론트 엔드의 Browserify 또는 node로 많은 작업을 수행하지 않았으므로 모든 사람이 gulp로 작업을 수행하는 방법을 배우고 싶습니다. 내가 경험의 관점에서 그 역사를 가지고 단지 있도록 먼저 browserify
PositiveGuy

1
Webpack은 gulp, grunt, browserify, typescript 등으로 작업하지 않은 경우에만 복잡합니다. 구성 파일을 설정하고 로더 작업을 수행하는 방법을 이해하면 Webpack을 매우 쉽게 사용할 수 있습니다. 실제로, 구성 파일은 작동하는 웹팩 빌드를 위해 20-30 줄의 코드로 짧을 수 있으며 필요한만큼 강력 할 수 있습니다. 물론 Webpack Hot Module Replacement는 놀랍습니다. 참조 : andrewhfarmer.com/understanding-hmrandrewhfarmer.com/webpack-hmr-tutorialmedium.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

솔직히 가장 좋은 방법은 둘 다 사용하는 것입니다.

  • 모든 자바 스크립트 관련 웹팩 .
  • 모든 CSS 관련 펄프 .

나는 여전히 webpack으로 CSS를 패키징하기위한 적절한 해결책을 찾아야하며, 지금까지 CSS 용 gulp와 javascript 용 webpack을 사용하여 기쁘다.

또한 npm설명대로 @Tetradev로 스크립트를 사용 합니다. 내가 사용 Visual Studio하고 있기 때문에 Expecially , 그리고 NPM Task runner신뢰할 수 있지만 Webpack Task Runner버그가 있습니다.


NPM Task Runner + Gulp를 사용하여 키를 발견했습니다. webpack 명령을 packange.json 파일에 넣고 CSS (SASS)를 gulp 파일에 넣으십시오. 또한 프로덕션 릴리스의 일부로 꿀꺽 꿀꺽 작업을 호출하는 빌드 단계를 갖도록 package.json을 설정하십시오.
Nico
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.