ChatGPT解决这个技术问题 Extra ChatGPT

Gulp + Webpack 还是只是 Webpack?

我看到人们使用 gulp 和 webpack。但是后来我看了webpack可以代替gulp?我在这里完全困惑......有人可以解释吗?

更新

最后我从 gulp 开始。我是现代前端的新手,只想快速启动和运行。一年多后,我的脚已经湿透了,我准备转向 webpack。我建议那些从同一双鞋开始的人走同样的路线。不是说你不能尝试 webpack,而是说如果它看起来很复杂,首先从 gulp 开始......这没有错。

如果您不想要 gulp,是的,有 grunt,但您也可以在 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"
    },
这比 Webpack 自己的文档或任何文章都帮助我更好地掌握了 Webpack:github.com/petehunt/webpack-howto
blog.andrewray.me/webpack-when-to-use-and-why 无需在 webpack 中使用 gulp
我的简单示例是我希望 webpack-dev-server 使用 HMR 处理我的 js,但是我遇到了无法使用静态站点生成器和 webpack 开发服务器的问题。通过复杂的配置,我可以做到这一点,但直接吞咽我也可以做到。所以主要区别在于时间和学习曲线。
2 年后,我仍然struggle on similar issues...
你的更新应该是一个答案,+1

C
Community

这个答案可能会有所帮助。 Task Runners (Gulp, Grunt, etc) and Bundlers (Webpack, Browserify). Why use together?

...这是一个在 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();
            }
        }
    }
}

我想您会发现,随着您的应用程序变得越来越复杂,您可能希望按照上面的示例将 gulp 与 webpack 任务一起使用。这允许你在你的构建中做一些 webpack 加载器和插件真正不做的更有趣的事情,即。创建输出目录、启动服务器等。好吧,简而言之,webpack 实际上可以做这些事情,但你可能会发现它们对于你的长期需求是有限的。您从 gulp 获得的最大优势之一 -> webpack 是您可以为不同的环境自定义 webpack 配置,并让 gulp 在正确的时间完成正确的任务。这完全取决于您,但从 gulp 运行 webpack 并没有错,实际上有一些漂亮的 interesting 示例说明了如何做到这一点。上面的例子基本上来自jlongster


我的 webpack 项目非常大 - 所以我还需要通过命令行命令增加节点内存 stackoverflow.com/questions/34727743/… 有没有办法直接通过 webpack 这样做?
检查这两个。您可能必须在运行 node 或 webpack 之前设置 v8 内存。 stackoverflow.com/questions/7193959/…webpack.github.io/docs/build-performance.html
我不确定为什么我接受这个作为答案。我想这可能是由于您共享的第一个链接。但是从 gulp 使用 webpack?如果你现在问我,那就更糟了:)。我什至不会尝试诉诸类似的东西。
T
TetraDev

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,其中包含在所有环境中共享的 webpack 配置,并使用 webpackMerge 合并它们。

由于 NPM 脚本很酷,它允许轻松链接,类似于 gulp 处理 Streams/pipes 的方式。

在上面的示例中,要为开发而构建,您只需转到命令行并执行 npm run build:dev

NPM 将首先运行 prebuild:dev,然后是 build:dev,最后是 postbuild:dev。

prepost 前缀告诉 NPM 执行的顺序。

如果您注意到,使用 Webpack + NPM 脚本,您可以运行原生程序(例如 rimraf),而不是运行原生程序(例如 gulp-rimraf)的 gulp-wrapper。您还可以像我在此处使用 elevate.exe 所做的那样运行本机 Windows .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 生产代码

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 文件中的两个。

那么,哪一个对你来说更容易?

在我看来,NPM 脚本在有效性和易用性方面都远远超过 gulp 和 grunt,所有前端开发人员都应该考虑在他们的工作流程中使用它,因为它可以节省大量时间。

更新

我遇到过一种场景,我想将 Gulp 与 NPM 脚本和 Webpack 结合使用。

例如,当我需要在 iPad 或 Android 设备上进行远程调试时,我需要启动额外的服务器。过去,我从 IntelliJ IDEA(或 Webstorm)中将所有服务器作为单独的进程运行,这很容易使用“复合”运行配置。但是如果我需要停止并重新启动它们,必须关闭 5 个不同的服务器选项卡是很乏味的,而且输出分布在不同的窗口中。

gulp 的好处之一是可以将来自不同独立进程的所有输出链接到一个控制台窗口中,该控制台窗口成为所有子服务器的父级。

所以我创建了一个非常简单的 gulp 任务,它直接运行我的 NPM 脚本或命令,所以所有输出都出现在一个窗口中,我可以通过关闭 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

我现在使用一个名为 concurrently 的脚本,它与上面的 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,因为有很多 cli 脚本可以在没有代码的情况下执行相同的任务。

我建议你阅读这些深入比较它们的文章。

如何使用 NPM 作为构建工具

为什么我们应该停止使用 Grunt & Gulp

为什么我离开 Gulp 和 Grunt 来使用 NPM 脚本


那是因为你的任务相对容易。祝你好运用 shell 编写复杂的脚本:-)
这些只是例子。我的构建非常复杂,并且在 shell 上执行了许多脚本,可以完美运行并且易于维护。而且,NPM 脚本不适合我,webpack 可以,例如 uglify、压缩 gzip、transform 等。谢谢。什么如此复杂以至于你需要 gulp 呢?
(一年多后大声笑):非常感谢,很好的回应!
@user108471 当然,webpack 可以,它可以创建一个 assets.json 列出使用相关 ID 编译的所有模块。可以使用正确的插件创建更多类型的构建时信息 JSON 文件。您具体指的是 gulp 可以做什么?
@GiannosCharalambous 感谢您的提示。我实际上已经使用 npm-run-all 几个月了,但我什至没有想到使用 -p 并行标志!这周我会试试看
R
R.R

我在不同的项目中使用了这两个选项。

这是我使用 gulpwebpack - https://github.com/iroy2000/react-reflux-boilerplate-with-webpack 组合起来的一个样板。

我有一些其他项目仅与 npm tasks 一起使用 webpack

他们都工作得很好。而且我认为它归结为您的任务有多复杂,以及您希望在配置中拥有多少控制权。

例如,如果您的任务很简单,比如说 devbuildtest ... 等(这是非常标准的),那么只需简单的 webpacknpm tasks 就可以了。

但是如果你有非常复杂的工作流程并且你想更好地控制你的配置(因为它是编码),你可以选择 gulp 路线。

但根据我的经验,webpack 生态系统提供了我需要的足够多的插件和加载器,所以我喜欢使用最低限度的方法,除非你只能在 gulp 中做一些事情。而且,如果您的系统中少了一件东西,它将使您的配置更容易。

很多时候,如今,我看到人们实际上将 gulp and browsify 全部替换为 webpack 单独。


是的,但是 Webpack 因过于复杂而难以理解而臭名昭著。我倾向于先尝试将 gulp 与 browserify 一起使用,但还没有准备好使用 Webpack,部分原因是我在前端的 Browserify 或 node 上没有做太多事情,所以我想了解每个人是如何使用 gulp 和首先浏览器化,这样我就有了经验方面的历史
Webpack 只有在你没有使用过它时才会变得复杂,就像 gulp、grunt、browserify、typescript 和其他任何东西一样。一旦你了解了如何设置配置文件和使用加载器,Webpack 就非常容易使用。事实上,配置文件可以短至 20 到 30 行代码来构建一个工作的 webpack,并且可以根据您的需要保持健壮。更不用说 Webpack 热模块替换绝对是惊人的。请参阅:andrewhfarmer.com/understanding-hmrandrewhfarmer.com/webpack-hmr-tutorialmedium.com/@dabit3/beginner-s-guide-to-webpack-b1f1a3638460
M
Maokai

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,这样您和您的团队就不需要学习和维护两者,尤其是因为它们需要非常不同的思维方式。


M
Max Favilli

老实说,我认为最好的办法是两者都用。

用于所有与 javascript 相关的 Webpack。

Gulp 用于所有与 css 相关的内容。

我仍然需要找到一个不错的解决方案来使用 webpack 打包 css,到目前为止,我很高兴将 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 任务的构建步骤作为生产版本的一部分
你完全切换到 webpack 了吗?我对 webpack 有同样的问题。它的 css 处理太奇怪了。整个 webpack 似乎以 is 为中心,所以其他一切都是额外的。我只想像往常一样构建我的css,并且我想将它们放在我想要的文件夹中(与Js分开)。使用 webpack 似乎非常复杂。我现在坚持 gulp 来完成这个简单的任务。
@mr1031011 这些天我正在使用 netcore 包和缩小编译 css docs.microsoft.com/en-us/aspnet/core/client-side/…

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅