Grunt、Gulp和Webpack區別


1、Grunt

  Grunt 的出現早於 Gulp,Gulp 是后起之秀。他們本質都是通過 JavaScript 語法實現了 shell script 命令的一些功能。比如利用 jshint 插件實現 JavaScript 代碼格式檢查這一功能。早期需要手動在命令行中輸入  jshint test.js,而 Grunt 則通過 Gruntfile.js 進行配置

// Gruntfile.js
module.exports = function(grunt) {
  grunt.initConfig({
    // js格式檢查任務
    jshint: {
      src: 'src/test.js'
    }
    //  代碼壓縮打包任務
    uglify: {}
  });
  // 導入任務插件
  grunt.loadnpmTasks('grunt-contrib-uglify');
  // 注冊自定義任務, 如果有多個任務可以添加到數組中
  grunt.regusterTask('default', ['jshint'])
}

2、Gulp

  Gulp 吸取了 Grunt 的優點,擁有更簡便的寫法,通過流(stream)的概念來簡化多任務之間的配置和輸出,讓任務更加簡潔和容易上手。Gulp 還是工具鏈、構建工具,可以配合各種插件做js壓縮,css壓縮,less編譯,替代手工實現自動化工作。通過配置 gulpfile.js 文件來實現,一個簡單的 gulpfile.js 配置如下

// gulpfile.js
var gulp = require('gulp');
var jshint = require('gulp-jshint');
var uglify = require('gulp-uglify');

// 代碼檢查任務 gulp 采取了pipe 方法,用流的方法直接往下傳遞
gulp.task('lint', function() {
  return gulp.src('src/test.js')
    .pipe(jshint())
    .pipe(jshint.reporter('default'));
});

// 壓縮代碼任務
gulp.task('compress', function() {
  return gulp.src('src/test.js')
    .pipe(uglify())
    .pipe(gulp.dest('build'));
});

// 將代碼檢查和壓縮組合,新建一個任務
gulp.task('default', ['lint', 'compress']);

  好多人覺得,規則和結構都比較像,其實 gulp 本身就是借鑒了grunt 的經驗進行升級和加入一些新特性。正因為流管理多任務配置輸出方式的提高,人們逐漸選擇使用 gulp 而放棄 grunt

3、browserify

  browserify 是早期的模塊打包工具,是先驅者,踏實的瀏覽器端使用 CommonJS 規范的格式組織代碼成為可能。在這之前,因為 CommonJS 與瀏覽器特性的不兼容問題,更多使用的是 AMD 規范,當然后來又發展了ES6模塊規范

  假設有如下模塊 add.js 和文件 test.js,test.js 使用 CommonJS 規范導入了模塊 add.js

// add.js
module.exports = function(a, b) {
  return a + b
};

// test.js
var add = require('./add.js');
console.log(add(1, 2));  // 3

 

  我們知道,如果直接執行是執行不成功的,因為瀏覽器無法識別 CommonJS 語法,而 browserify就是用來處理這個問題的,他將 CommonJS 語法進行裝換,在命令行執行如下

browserify test.js > bundle.js

  生成的 bundle.js 就是已經處理完畢,可供瀏覽器執行使用的文件,只需要將它插入到<script>中即可。

4、webpack

  webpack 是后起之秀,它支持了 AMD 和 CommonJS 類型,通過 loader 機制也可以使用 ES6 模塊格式。還有強大的 code splitting 。webpack 還是文件打包工具,可以把項目的各種js文、css文件等打包合並成一個或多個文件,主要用於模塊化方案,預編譯模塊的方案。webpack 是一個十分強大的工具,它正在向一個全能型的構建工具發展。

  webpack 通過配置文件 webpack.config.js 進行功能配置,一個配置案例如下:

'use strict'
const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const merge = require('webpack-merge')
const utils = require('./utils')

var config = {
  // 入口
  entry: {
    app: './src/main.js'
  },
  // 出口
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  // 加載器配置(需要加載器轉化的模塊類型)
  module: {
    rules: [
      {
        test: '/\.css$/',
        use: [ 'style-loader', 'css-loader' ]
      }
    ]
  }
  // 插件
  plugins: [
    new webpack.DefinePlugin({
      'process.env': require('../config/dev.env')
    }),
    new webpack.HotModuleReplacementPlugin(),
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'index.html',
      inject: true
    }),
  ]

}

module.exports = config

 

  一個相對比較全面的配置主要包含五個部分:入口、出口、加載器、插件、模式、分別指定了開始讀取文件的位置,編譯后輸出文件的路徑,ES6語法轉化加載器,更復雜功能的插件及指定執行的環境變量。

區別:

  Gulp 應該和 Grunt比較,他們的區別我就不說了,說說用處吧。Gulp / Grunt 是一種工具,能夠優化前端工作流程。比如自動刷新頁面、combo、壓縮css、js、編譯less等等。簡單來說,就是使用Gulp/Grunt,然后配置你需要的插件,就可以把以前需要手工做的事情讓它幫你做了。

  說到 browserify / webpack ,那還要說到 seajs / requirejs 。這四個都是JS模塊化的方案。其中seajs / require 是一種類型,browserify / webpack 是另一種類型。

  seajs / requirejs:是一種在線“編譯”模塊的方案,相當於在頁面加載一個 CMD/AMD 解釋器。這樣瀏覽器就認識了 define、exports、module 這些東西,也就實現了模塊化。

  browserify / webpack:是一種預編譯模塊的方案,相比較上面,這個方案更加智能。沒用過 browserify,這里以 webpack 為例。首先,它是預編譯的,不需要在瀏覽器中加載解釋器。另外,你在本地直接寫 JS ,不管是 AMD/CMD/ES6 風格的模塊化,它都能認識並且編譯成瀏覽器認識的 JS。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM