【问题标题】:Switching from Gulp to Webpack从 Gulp 切换到 Webpack
【发布时间】:2017-02-06 19:06:22
【问题描述】:

更新 30.04.20

[Moving to Webpack]

我的第一个问题是,对于简单项目(仅用于 Pre-Process/Concat/Minify)如何推荐此开关?

了解这个未来的“标准”,比如 Webpack 和 PostCss-NextCss-Autoprefixer 等,就像让我着迷......

所以这引出了我的下一个问题,是否有任何教程可以指导我在第一个问题中所说的简单任务?

或者是将我的gulpfile.js 更改为webpack-config.js 的简单方法

我在 gulp 中的正常任务不是最佳实践,但效果很好:

//load plugins
var gulp    = require('gulp'),
runSequence = require('run-sequence'),
sass        = require('gulp-ruby-sass'),
compass     = require('gulp-compass'),
rev         = require('gulp-rev'),
revDel      = require('rev-del'),
del         = require('del'),
minifycss   = require('gulp-minify-css'),
uglify      = require('gulp-uglify'),
rename      = require('gulp-rename'),
concat      = require('gulp-concat'),
notify      = require('gulp-notify'),
plumber     = require('gulp-plumber'),
watch       = require('gulp-watch'),
path        = require('path');


  //the title and icon that will be used for the Grunt notifications
  var notifyInfo = {
    title: 'Gulp',
    icon: path.join(__dirname, 'gulp.png')
  };

  //error notification settings for plumber
  var plumberErrorHandler = { errorHandler: notify.onError({
    title: notifyInfo.title,
    icon: notifyInfo.icon,
    message: "Error: <%= error.message %>"
  })
};

//patches
var paths = {
  scriptsAbs : '_coffeescript/',
  stylesAbs: '_scss/',
  scriptsCom : '_coffeescript/' + '**/*.js',
  stylesCom :'_scss/' + '**/*.scss',
  cssCom : 'resources/css',
  jsCom : 'resources/js',
  imgCom : 'resources/img'
};

gulp.task('clean',
  function (cb) {
    del([
      paths.cssCom + '/*',
      paths.jsCom + '/*'
      ], cb);
  });

//styles
gulp.task('styles',
  function() {
    return gulp.src(paths.stylesCom)
    .pipe(plumber(plumberErrorHandler))
    .pipe(compass({
      sass: '_scss',
      css: paths.cssCom,
      image: paths.imgCom,
      style: 'expanded',
      relative: true,
      require: ['normalize-scss', 'susy']
    }))
    .pipe(gulp.dest(paths.cssCom))
    .pipe(rename({ suffix: '.min' }))
    .pipe(minifycss())
    .pipe(gulp.dest(paths.cssCom))
    .pipe(rev())
    .pipe(gulp.dest(paths.cssCom))
    .pipe(rev.manifest())
    .pipe(revDel({ dest: paths.cssCom }))
    .pipe(gulp.dest(paths.cssCom))
    .pipe(notify({ message: 'Styles task completed' }))
  });

//scripts
gulp.task('scripts',
  function() {
    return gulp.src(paths.scriptsCom)
    .pipe(plumber(plumberErrorHandler))
    .pipe(concat('main.js'))
    .pipe(gulp.dest(paths.jsCom))
    .pipe(rename({ suffix: '.min' }))
    .pipe(uglify())
    .pipe(gulp.dest(paths.jsCom))
    .pipe(rev())
    .pipe(gulp.dest(paths.jsCom))
    .pipe(rev.manifest())
    .pipe(revDel({ dest: paths.jsCom }))
    .pipe(gulp.dest(paths.jsCom))
    .pipe(notify({ message: 'Scripts Concatenated completed' }))
  // .pipe(reload({stream:true}));

});


gulp.task('default', ['clean','styles','scripts'], function(){
  gulp.watch(paths.stylesCom, ['styles'])
  gulp.watch(paths.scriptsCom, ['scripts'])

//watch .php files
// gulp.watch(['*.php'], ['bs-reload'])
});

我开始使用 postcss,这让我的工作流程变得更好……有时更轻松。

你对这一切有什么看法?正确的起点在哪里?

编辑 // 2017 年 6 月 28 日

到目前为止,我们在 Webpack 1 方面的进展非常令人满意且非常成功,我们的工作流程要快得多,并且我们对这个工具的依赖是不可改变的。

这是我们每天使用的webpack.config.js

"use strict";

var webpack = require('webpack');
var glob = require('glob-all');
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var BrowserSyncPlugin = require('browser-sync-webpack-plugin');

let start = {

    entry: {
        scripts: glob.sync(
            [
            './_javascript/*.js',
            './_cssnext/*.pcss'
            ]
        )},

    output: {
        path: './resources/js',
        filename: 'bundle--[name].js'
    },
    watchOptions: {
        poll: true
    },

    postcss: function (webpack) {
        return [
            require("postcss-import")({addDependencyTo: webpack}),
            require("postcss-url")(),
            require("precss")(),
            require("postcss-cssnext")(),
            require('postcss-font-magician')(),
            require("postcss-reporter")(),
            require("postcss-browser-reporter")(),
            require('postcss-inline-svg')(),
            require('postcss-urlrev')(),
            require('postcss-fontpath')(),
            require('postcss-object-fit-images')()
        ]
    },

    module: {
        loaders: [
            {
                test: /\.jsx?$/,
                loader: 'babel-loader'
            },
            {
                test: /\.p?css$/,
                loader: ExtractTextPlugin.extract(
                    'style-loader',
                    'css-loader!postcss-loader'
                )
            }
        ]
    },


    plugins: [
        new webpack.optimize.CommonsChunkPlugin({name: 'scripts', filename: 'bundle--[name].js'}),
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            }
        }),
        new ExtractTextPlugin("../css/bundle--styles.css"),
        new BrowserSyncPlugin({
            host: 'localhost',
            port: 3000,
            proxy: 'localhost:8002',
            browser: 'google chrome',
            ghostMode: false
        })
    ]

};

module.exports = start;

但是时代已经变了,是时候进化到 Webpack 3 了,现在我们正在将这个webpack.config.js更改为第 3 版

【问题讨论】:

    标签: gulp webpack postcss


    【解决方案1】:

    对于简单的项目,我根本不推荐切换。最后,我认为这是个人喜好,我更喜欢通过易于理解的 javascript (gulp) 进行后处理。

    正如您在问题中所说,您当前的设置运行良好:那么为什么要修复没有损坏的东西呢?我将专注于重构您的 gulp 代码以使其更具可读性,将长函数拆分为较小的 gulp 任务。

    最后,使用 webpack 需要学习很多与 webpack 相关的特定配置选项,而使用 gulp 时,您大多只是管道 vanilla js 命令。

    【讨论】:

    • 感谢您的观点,但是我不得不说,我们的工作流程在 Webpack 中比在 Gulp 中要快。
    • 好的,感谢您使用 webpack 配置更新您的答案!
    【解决方案2】:

    好的,感谢this tutorial

    我的第一个方法是这样的:

    webpack-config.js

    'use strict';
    
    const webpack    = require('webpack'),
        path         = require('path'),
        autoprefixer = require('autoprefixer'),
        glob         = require('glob');
    
    let script = {
        entry: {
             'scripts': glob.sync('./_javascript/*.js'),
        },
        module: {
            loaders: [
                // Javascript: js, jsx
                {
                    test: /\.jsx?$/,
                    loader: 'babel-loader'
                },
                // CSS: scss, css
                {
                    test: /\.s?css$/,
                    loaders: ['style', 'css', 'sass', 'postcss-loader']
                },
                // SVGs: svg, svg?something
                {
                    test: /\.svg(\?.*$|$)/,
                    loader: 'file-loader?name=/img/[name].[ext]'
                },
                // Images: png, gif, jpg, jpeg
                {
                    test: /\.(png|gif|jpe?g)$/,
                    loader: 'file?name=/img/[name].[ext]'
                },
                // HTML: htm, html
                {
                    test: /\.html?$/,
                    loader: "file?name=[name].[ext]"
                },
                // Font files: eot, ttf, woff, woff2
                {
                    test: /\.(eot|ttf|woff2?)(\?.*$|$)/,
                    loader: 'file?name=/fonts/[name].[ext]'
                }
            ]
        },
        output: {
            path: './resources/js',
            filename: 'bundle--[name].js'
        },
        plugins: [
            new webpack.optimize.CommonsChunkPlugin(['scripts'], 'bundle--[name].js'),
            new webpack.optimize.UglifyJsPlugin({
          compress: {
            warnings: false
        }
    })
    ]
    };
    
    let style = {
        entry: {
            'styles': glob.sync('./_nextcss/*.css'),
        },
        module: {
            loaders: [
                {
                    test: /\.s?css$/,
                    loaders: ['style', 'css', 'sass', 'postcss-loader']
                },
            ]
        },
        postcss: function (webpack) {
            return [
                require("postcss-import")({
                    addDependencyTo: webpack
                }),
                require("postcss-url")(),
                require("postcss-cssnext")(),
                require("postcss-browser-reporter")(),
                require("postcss-reporter")(),
            ]
        },
        output: {
            path: './resources/css',
            filename: 'bundle--[name].css'
        },
    };
    
    module.exports = [
        script,
        style,
    ];
    

    这会成功生成bundle--script.js,但我在 css 部分遇到了一些问题。

    它不会预处理任何东西:/

    如果我在此期间开始工作,我会在这里更新,如果有人可以指导我,我将非常感激。

    【讨论】:

      【解决方案3】:

      Gulp 和 Webpack 的概念完全不同:你告诉 Gulp如何 一步一步地把前端代码放在一起,但你告诉 Webpack 什么 你想通过一个配置文件。因此,如果您正在切换,则没有简单的一对一映射。

      我们公司在过去一年从 Gulp 迁移到了 Webpack。我发现了解这两种工具的差异对过渡非常有帮助。这是我写的一篇简短的文章(阅读 5 分钟),解释了心态的改变:https://medium.com/@Maokai/compile-the-front-end-from-gulp-to-webpack-c45671ad87fe

      虽然我们的过渡需要一些时间,但我们想出了如何将我们在 Gulp 中所做的一切转移到 Webpack 中。所以对我们来说,我们在 Gulp 中所做的所有事情都可以通过 Webpack 完成,但反之则不行。

      【讨论】:

        【解决方案4】:

        我认为您不需要 postcss 加载程序。我的意思是,暂时。你只是从一个工具转移到另一个工具,所以你应该尽可能保持精益。

        { 
          test: /(\.css|\.scss)$/, 
          include: path.join(__dirname, 'src'), 
          loaders: ['style-loader', 'css-loader', 'sass-loader'] 
        }
        

        请注意,我的代码中的 include 取决于您的配置。在那之后,我会考虑摆脱你在 gulp 中的“相对”路径。如果您想维护 developmentproduction 环境,它可能会破坏您的东西。只是个人经验。

        【讨论】:

          【解决方案5】:

          这取决于问题的答案:您是否认为将 css 作为 webpack 包的一部分加载有什么好处。如果您打算使用 &lt;link&gt; 将 css 加载到浏览器,那么 webpack 可能不会给您带来任何优势。

          “只有一个工具”除外。但不是一种配置 - 不要忘记您仍然需要特定的 webpack 配置,它只编译 css 以加快开发速度(编译 js 非常慢)而且实现起来并不容易(当前的 webpack 4 编译时有一些副作用只有CSS)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-05
            • 1970-01-01
            • 2018-07-03
            • 2018-02-19
            • 2018-06-03
            • 2017-02-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多