谈谈Grunt,NPM,Gulp

2024-08-27 13:48
文章标签 npm 谈谈 gulp grunt

本文主要是介绍谈谈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

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要高,不过还是那句老话,适合自己的才是最好的.

这篇关于谈谈Grunt,NPM,Gulp的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111845

相关文章

[vue小白]npm run运行以后无法关闭

开启vue任务后,关闭git bash窗口发现端口仍然被占用,程序没有关闭 通过查询资料,大部分都说ctrl+c就可以了,但是经过实践发现并不可行,目测大部分都是复制粘贴的答案。 经过尝试,最终发现可能只能暴力关闭了 1.在cmd中输入netstat -ano查询占用端口号的pid 2. 然后在任务管理器中查询对应的任务并关闭 3. 在linux系统中更简单,直接kill -9 pid即可

浅谈NODE的NPM命令和合约测试开发工具HARDHAT

$ npm install yarn -g  # 将模块yarn全局安装 $ npm install moduleName # 安装模块到项目目录下 默认跟加参数 --save 一样 会在package文件的dependencies节点写入依赖。   $ npm install -g moduleName # -g 的意思是将模块安装到全局,具体安装到磁盘哪个位置,要看 npm root -g

【解决bug之路】npm install node-sass(^4.14.1)连环报错解决!!!(Windows)

有关node-sass的深入分析可参考:又报gyp ERR!为什么有那么多人被node-sass 坑过? 主要有如下三方面错误,请自查: 1.node,npm版本需与node-sass版本匹配,像node-sass(^4.14.1)就得node 14.x版本才可以,node 16不行 gyp ERR! build error15 gyp ERR! stack Error: `

谈谈我的8年编程自学辛酸史

2008年:第一个脚印 2008年的一个周末,我一如既往读着最爱的《电脑迷》和《电脑爱好者》,不经意间看见一篇文章,教读者如何自己制作一个exe来说生日快乐,于是,或许是我一生的道路就从这里开始了。 当时已经痴迷于电脑软件,但是身为初中生的我并没有机会玩电脑,只能苦苦地看着杂志记录好玩的软件,并没有想过真的要自己去制作软件。直到去新华书店买辅导书的一次契机,我看见了一本《Java语言教程》

作为面试官的一点点感悟,谈谈技术人的成长之路

因为工作上的原因,做过几次面试官,面试的同学有应届生,也有工作3-5年的老技术人。最近也频繁作为面试官帮助筛选候选人,中间有很多值得深思的东西,我记录了下来分享给大家。 以下观点仅为个人观点,不代表任何公司的立场。        01 面试不是简单的你问我答 一般来讲,作为面试官和候选人进行沟通的第一个问题是一般是自我介绍,整个自我介绍的情况应该控制在2分钟左右,阐述自己的教育背景,项目经历

谈谈经典限流方法—漏桶、令牌桶与Guava RateLimiter的实现

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 高并发的业务系统经常要接受大流量的考验,为了保证系统的响应度和稳定性,往往都需要对有风险的接口实施限流(rate limiting),更高大上的说法则是“流量整形”(traffic shaping)。限流的思想最初来源于计算机网络,有两种经典的方法:漏桶和令牌桶。本文先来稍微研究一下它们。

uni-app 扫码优化:谈谈我是如何提升安卓 App 扫码准确率的

一. 前言 之前的一个项目遭到用户吐槽:“你们这个 App 扫码的正确率太低了,尤其是安卓的设备。经常性的扫码扫不出来,就算是扫出来了,也是错误的结果!” 由于之前是扫描二维码的需求,所以没有对扫描条形码做严格的测试,客户提示说是条形码扫描效率低下。随即,我用自己的手机测试了一下,在安卓手机上确实有这样的问题,扫码准确率确实是低,尤其是条形码,扫码效率慢且不准确。扫描二维码的的效率还算可以

谈谈singelton单例模式

 单例模式是一种常用设计模式。该类只有一个实例,而且该类自行创建实例。         很多时候,服务器都只需要一个全局对象,这样方便协调系统的整体行为。比如系统的配置文件,系统只需要一个单例对象读取加载,其他对象只需要通过该单例对象获取配置信息。这样方便在复杂模式下对系统配置的管理。          java中常用单例模式: public class Singleton(

rust 命令行工具rsup管理前端npm依赖

学习了一年的 rust 了,但是不知道用来做些什么,也没能赋能到工作中,现在前端基建都已经开始全面进入 rust 领域了,rust 的前端生态是越来越好。但是自己奈何水平不够,想贡献点什么,无从下手。 遂想自己捣鼓个什么东西,可以帮助到日常工作的。 记录一下在完成功能时遇到的一些问题,以及是怎么解决的。 解决的需求 公司有很多项目,都是依赖公司技术部门的一个框架,虽然说不行,但还是要用,里

谈谈函数返回值为什么不能重载

一、函数的定义:       函数将有效的输入值变换为唯一的输出值,同一输入总是对应同一输出。       计算机本质是对抽象数学公式的具体实现,并以此具体实现来解决现实生活中的实际问题。 注:wiki百科对 “函数” 的定义如图,图比较大,请点击打开详情,左右拖动查看 全部内容。 二、悖论      反过来设想一下,如果返回值的类型 能用来 重载,那么对于相同的输入值,程序怎么决定