比较grunt,npm,gulp

随着前端工程化的趋势,产生了越来越多的构建工具,而其中比较优秀的就是grunt,npm,gulp,今天我来说说这三者间的区别以及他们的优缺点.



相信一般前端开发者选择构建工具的时候,更多的是看个人习惯以及团队的情况.相信这三个构建工具总有一个会适合你的,我们先来看看grunt.

Grunt

grunt是目前社区最成熟,插件支持最多的一个构建工具,不过它的配置项之多也常常被人诟病.下面就一个简单的例子来说说它的用法.

grunt运行之前需要全局安装命令行工具,本地安装grunt插件

npm install -g grunt-cli

// 包装函数
module.exports = function(grunt) {

  // 任务配置
  grunt.initConfig({
      concat: {
          foo: {
              files:{
                  'dist/main.js': 'source/*.js'
              }
          }
      }
  });

  // 加载编译JSDOC文档插件
  grunt.loadNpmTasks('grunt-contrib-concat');

  // 测试合并任务
  grunt.registerTask('concatdemo', ['concat:foo']);

};

上面就是一个合并文件的例子,假如任务内的操作比较多的话,配置文件就非常多,grunt适合对nodejs不是非常熟悉的情况下使用,而且自定义插件也非常方便,这个可以看我之前写的文章.

grunt在处理多个子功能的时候会频繁的调用io来读取文件,而且不支持任务模块的重用,也就是说不能添加任务的依赖.不过入门非常容易,这些只是我自己的一些看法,也许最适合你的才是最好的,下面我们再来看看npm.

NPM

也许有些人会说npm不是包管理工具吗?怎么又成了构建工具了,其实它是可以当成构建工具来用的,奥秘就在package.json文件里的scripts属性上.这里是可以定义当前模块的一些构建功能的,比如当你开发一个有点规模的模块的时候,开发与发布引用的文件其实是不一样的,一般发布的时候都会提供压缩版或者一些测试用例,下面以一个简单的例子来说明

  {
    "scripts": {
        "test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true",
        "build": "uglifyjs underscore.js -c \"evaluate=false\" --comments \"/    .*/\" -m --source-map underscore-min.map -o underscore-min.js",
        "doc": "docco underscore.js"
    },
    "devDependencies": {
        "docco": "0.6.x",
        "phantomjs": "1.9.0-1",
        "uglify-js": "2.4.x"
    },
  }

上面的这个配置片段是underscore类库的配置,可以看出上面的构建属性有test,build,doc,这三个分别代表三个任务,运行命令如下

npm run

npm run后跟任务名就可以,任务内容支持bash脚本,也支持npm模块本身提供的命令行命令,像上面的uglifyjs本身就提供有命令行压缩命令,运行npm run命令之前要保证devDependencies里的依赖模块已经安装到本地,没有的话可以使用npm install命令安装.

最后要说的是,任务的内容了可以是自定义模块,比如可以像这样的

    "scripts": {
        "demo": "./demo.js"
    }

demo.js

#!/usr/bin/env node

console.log(__dirname);
console.log(process.cwd());

注意运行命令之前需要确保系统有执行demo.js的权限,可以使用

chmod 777 demo.js

打开访问权限,然后我们运行

npm run demo

就会看到输出当前运行根目录内容,而且这里的js文件可以写很多自定义的东西.

最后要说明下,npm最适用于类linux系统,因为这些系统对命令支持非常友好,windows的话得安装模拟*inux的命令行工具

npm一般用在个人项目里,对于团队项目则不适用.最后说下gulp.

Gulp

gulpgrunt一样支持跨平台,不同于grunt需要Gruntfile.js,gulp需要Gulpfile.js,最核心的不同之处在于,gulp是以流为核心的,而grunt是以配置加上文件io为核心的.

gulp是流为核心然后通过管道来输入输出各个子功能的内容以方便后续操作,这样可以提高io访问效率,自定义插件方面要比grunt要求要高点,下面以一个简单的例子看看它的用法.

运行gulp的系统要求

touch Gulpfile.js

npm install -g gulp

npm install gulp

var gulp    = require('gulp'),
    uglify  = require('gulp-uglify'),
    size    = require('gulp-size');

gulp.task('jsmin', function(){
    return gulp
        .src('./app.js')
        .pipe(size())
        .pipe(uglify())
        .pipe(size())
        .pipe(gulp.dest('dist/main'));
});

gulp是以src为开始,里面传递任务需要的源文件,文件格式跟grunt相同,后面都是以pipe来传输前一步的输出内容,最后可以输出到一个目标文件内通过dest方法.

gulp-size是一个统计管道里面内容的大小的,上面是用它来显示出压缩前后的大小用来对比用的.

gulpgrunt一样也支持任务里包含多个子任务,像这样的

    gulp.task('build', ['jshint', 'jsmin']);
    // 以 gulp build 命令来运行

不过跟grunt不一样的是,上面的多个子运任务是异步执行的,而grunt是同步执行的.

gulp也支持像模块里的依赖注入,而且运行自己的任务之前它会保证依赖都运行完毕,像下面这样的

gulp.task('test', ['jsmin'], function(){
    return gulp
        .src('dist/main/*.js')
        .pipe(gulp.dest('build'));
});

上面的代码功能是当压缩完js之后,把压缩之后的文件内容重新copy到一个新的地方.

也许gulp唯一的缺点就是社区插件没grunt丰富,但是随着越来越多的人进入gulp,相信这个也不是问题.

总结

看了上面三个构建工具的分析,大家都喜欢用哪一个呢,个人推荐用gulp,因为它代码量少而且效率比grunt要高,不过还是那句老话,适合自己的才是最好的.

时间: 2024-09-16 00:48:40

比较grunt,npm,gulp的相关文章

使用npm+gulp+browserify网页前端开发

本文的目的在于使用npm进行js类库依赖管理,同时精简html中繁杂的<script>导入. 目前类库加载器(如requirejs/seajs等)可以解决script加载的问题.但对依赖处理不好,还需要开发者一个一个去下载js库,根据个人喜好把js堆砌在项目中. nodejs中的npm等工具可以很好的处理依赖,但它是为nodejs服务的,它的模块打包格式是CMD,而requirejs是AMD.seajs官方倒是推荐了spm,据说该项目已经终止维护了. 在一定程度上,nodejs的bower插件

gulp的学习

Gulp Tutorial Gulp: The streaming build system gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器: 她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成: 使用她,不仅可以很愉快的编写代码,而且大大提高我们的工作效率. 项目构建是指项目上线之前对项目源代码进行一系列处理,使其以最佳的形式运行于线上服务器. 常见处理任包括以下几方面: 模块化开发可以实现功能的复用并解决模块间的依赖关系,但带来好处

gulp:入门简介

本文是gulp的入门级介绍,主要内容包括什么是gulp,gulp与grunt有什么区别,gulp可以解决grunt存在的哪些问题,以及一个简单的说明例子. 什么是gulp gulp的官方定义非常简洁:基于文件流的构建系统.这里强调了 streaming,也就是gulp与grunt的在构建流程上的主要区别.具体区别在哪里,后面会简单介绍. The streaming build system. 另一个grunt? 相信很多前端的同学对grunt都不陌生,grunt的出现可以说是前端的福音,之前很多

bower 和 npm 的区别

http://www.tuicool.com/articles/rqeQJfA 前端技术和工程实践真的是突飞猛进啊,想当年,我这个半业余前端吭哧吭哧做页面的时候,哪有这么多东西可以用啊,现在先进到我都完全看不懂了.本文主要讲一下同是包管理器的bower和npm的差别. 主要也是在stackoverflow看来的,翻译加一部分自己的理解. npm 是伴随Node.js 出现的一个包管理器,最开始只能支持 Node.js 的模块管理,但是后来, npm 官网经过一次改版,打出的口号是,javascr

bower 和 npm 的区别详细介绍

简单的说,npm是进行后端开发中,使用的模块安装工具,而bower,是前端的模块安装工具. 比如,在安装express,socket.io时,当然使用的是npm,那么比如bootstrap,jquery等前端框架,需要使用bower 前端技术和工程实践真的是突飞猛进啊,想当年,我这个半业余前端吭哧吭哧做页面的时候,哪有这么多东西可以用啊,现在先进到我都完全看不懂了.本文主要讲一下同是包管理器的bower和npm的差别. 主要也是在stackoverflow看来的,翻译加一部分自己的理解. npm

ASP.NET 5系列教程 (五):在Visual Studio 2015中使用Grunt、Bower开发Web程序

基于Visual Studio 2015,你可以: 方便的管理前端包,如jQuery, Bootstrap, 或Angular. 自动运行任务,如LESS.JavaScript压缩.JSLint.JavaScript单元测试等. 方便的获得Web开发者生态圈的工具包. 为了实现这些场景,Visual Studio 2015已经内置了一些流行的第三方工具包: Bower:Web包管理器,Bower可以帮你安装前端包,包括JavaScript.CSS类库.对于服务器端包,请通过NuGet包管理. G

在Grunt task中集成Protractor

Protractor是专为AngularJS应用程序编写的UI自动化测试框架.前端构建有很多构建工具,比如Grunt.Gulp等.一般我们会把这些构建工具作为集成集成的脚本执行工具.所以如果把Protractor的执行也集成进去,则可以达到自动验证UI功能的效果. 本文将介绍如何将Protractor命令集成到Grunt task中. 首先需要为Grunt安装一个插件,grunt-protractor-runner.这个插件会帮你在Grunt中运行Protractor. 1 npm instal

grunt从入门到自定义项目模板

文章还可在我的github上找到,排版更友好一点:grunt从入门到自定义项目模板 一.Grunt入门介绍 1. Grunt是神马 基于任务的命令行构建工具(针对JavaScript项目) 链接:http://gruntjs.com/ 2. 使用Grunt的理由 前端的工具算得上是五花八门,在介绍如何Grunt之前,首先我们得反问自己: Grunt能够帮我们解决什么问题? 是否有其他更合适的替代方案? 3. Grunt能够帮我们解决什么问题? 作为一名开发人员,我们见过了不少功能胡里花哨但并不实

Grunt基本使用-V1.0

第一步:Grunt 依赖 Node.js 所以在安装之前确保你安装了 Node.js.然后开始安装 Grunt. 实际上,安装的并不是 Grunt,而是 Grunt-cli,也就是命令行的 Grunt,这样你就可以使用 grunt 命令来执行某个项目中的 Gruntfile.js 中定义的 task .但是要注意,Grunt-cli 只是一个命令行工具,用来执行,而不是 Grunt 这个工具本身. 安装 Grunt-cli 需要使用 NPM,使用下面一行即可在全局范围安装 Grunt-cli ,