谈谈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'
}
}
}
});
// 加载连接文件插件
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
gulp
跟grunt
一样支持跨平台,不同于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
是一个统计管道里面内容的大小的,上面是用它来显示出压缩前后的大小用来对比用的.
gulp
跟grunt
一样也支持任务里包含多个子任务,像这样的
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
要高,不过还是那句老话,适合自己的才是最好的
.
谈谈Grunt,NPM,Gulp的更多相关文章
- JavaScript构建(编绎)系统大比拼:Grunt vs. Gulp vs. NPM
Nicolas Bevacqua进行了一个比较JavaScript构建(编绎)系统的任务.他对三巨头: Grunt, Gulp and NPM进行了比较,并讨论了每种的优缺点. By Nicolas ...
- 前端构建工具的用法—grunt、gulp、browserify、webpack
随着前端项目的飞速发展,项目越来越大.文件越来越多,前端工程化的工具也越来越多.下面介绍目前最流行的四种构建工具——grunt.gulp.browserify.webpack 所有的构建工具都是基于N ...
- gulp系列文章一 fis vs grunt vs gulp,为什么要是gulp呢?
gulp是最近火起来的前端构建工具,大有赶超grunt之势,它和grunt这种构建工具比较像. grunt是写一个Gruntfile.js来写配置代码,gulp则是写一个gulpfile.js来写配置 ...
- 前端开发自动化工作流工具,JavaScript自动化构建工具grunt、gulp、webpack介绍
前端开发自动化工作流工具,JavaScript自动化构建工具grunt.gulp.webpack介绍 前端自动化,这样的一个名词听起来非常的有吸引力,向往力.当今时代,前端工程师需要维护的代码变得及为 ...
- Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用
Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用 Grunt和Gulp是Javascript世界里的用来做自动压缩.Typescript编译.代码质量lint工具.cs ...
- JavaScript自动化构建工具入门----grunt、gulp、webpack
蛮荒时代的程序员: 做项目的时候,会有大量的js 大量的css 需要合并压缩,大量时间需要用到合并压缩 在前端开发中会出现很多重复性无意义的劳动 自动化时代的程序员: 希望一切都可以自动完成 ...
- ASP.NET5之客户端开发:Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用
Grunt和Gulp是Javascript世界里的用来做自动压缩.Typescript编译.代码质量lint工具.css预处理器的构建工具,它帮助开发者处理客户端开发中的一些烦操重复性的工作.Grun ...
- Grunt、gulp、webpack、不要听着高大上你就上,试试Codekit?
下载地址:https://incident57.com/codekit/ 官方网站了解更多 要编译Less.Sass.Stylus, CoffeeScript, Typescript, Jade, H ...
- JavaScript自动化构建工具grunt、gulp、webpack介绍
前端开发自动化工作流工具,JavaScript自动化构建工具grunt.gulp.webpack介绍 前端自动化,这样的一个名词听起来非常的有吸引力,向往力.当今时代,前端工程师需要维护的代码变得及为 ...
随机推荐
- JavaScript类型比较
JavaScript的类型 原始类型: number string boolean null undefined 对象类型: Object function Array Date ... 隐式转换 + ...
- Visual Studio 2017 : client version 1.22 is too old
使用Vs2017 编译 eShopOnContainers-ServicesAndWebApps 时,报了错误: Microsoft.DotNet.Docker.CommandLineClientEx ...
- 每周.NET前沿技术文章摘要(2017-06-07)
汇总国外.NET社区相关文章,覆盖.NET ,ASP.NET等内容: .NET .NET Core and .NET Framework Working Together, Or: The Magic ...
- ADODB.Connection、ADODB.RecordSet
1.数据库连接对象(ADODB. Connection)该对象用于与ODBC数据库建立连接,所有对数据库的操作均通过该连接进行.数据库连接对象ADODB. Connection的作用象Delphi中的 ...
- Wincc flexable的IO域组态
1.题目 2.新建三个变量 3.组态画面,添加IO域1 1)常规设置 2)属性设置 4.组态IO域2 1)常规项 2)属性设置 5.组态第三个IO域 1)常规设置 2)属性设置 6.此外可以设置动画 ...
- python方法的延迟加载
数据挖掘的过程中,数据进行处理是一重要的环节,我们往往会将其封装成一个方法,而有的时候这一个方法可能会被反复调用,每一次都对数据进行处理这将是一个很耗时耗资源的操纵,那么有没有办法将计算后的结果缓存起 ...
- 树链剖分X2
1.ZJOI树的统计 板子题 因为初始化没打改了几个小时 改到双腿软着出的机房(身体素质感人 #include<iostream> #include<cstdio> #incl ...
- UWP 使用OneDrive云存储2.x api(二)【全网首发】
接上一篇 http://www.cnblogs.com/hupo376787/p/8032146.html 上一篇提到为了给用户打造一个完全无缝衔接的最佳体验,UWP开发者最好也要实现App设置和数据 ...
- 摄像头脸部识别 (1)opencv 抓取视频数据并保存
摄像头脸部识别 (1)opencv 抓取视频数据并保存 基于python 和 opencv 3.4.0 (兼容 opencv 2.X 参考注释),详细如代码 import numpy as np im ...
- RBAC__权限设计__结构化表的输出(不知道怎么描述标题,反正就是设计表) 难点重点 必须掌握🤖
RBAC 反正就是很厉害. 干就完事了,不BB 直接进入正题 本文写的就是如何设计表,以及设计表的思路. 用户和角色 : 多对多字段放在哪张表更好点? 用户找角色,角色找权限. 放在user表中,是正 ...