Grunt 新手一日入门(1),JavaScript的算数运算符与比较运算符

本文介绍了如何在项目中安装和配置Grunt,包括安装Grunt及其常用任务插件,如语法检查、文件合并、压缩和服务器监控。作者详细解释了如何编写Gruntfile.js,配置任务和加载插件,以实现项目自动化。
摘要由CSDN通过智能技术生成

最后我生成的代码如下:

{

“name”: “gruntxx”,

“version”: “0.0.1”,

“description”: “学习 grunt”,

“repository”: {

“type”: “git”,

“url”: “https://github.com/yujiangshui/gruntxx.git”

},

“author”: “Jiangshui”,

“license”: “MIT”,

“bugs”: {

“url”: “https://github.com/yujiangshui/gruntxx/issues”

},

“homepage”: “https://github.com/yujiangshui/gruntxx”

}

但这时我们还没有在项目文件中安装 Grunt 以及相关任务插件。

安装 Grunt 和所需要的插件

就现在的这个示例项目而言,我打算让 Grunt 帮忙实现下面几个功能:检查每个 JS 文件语法、合并两个 JS 文件、将合并后的 JS 文件压缩、将 SCSS 文件编译、新建一个本地服务器监听文件变动自动刷新 HTML 文件。

差不多就是这些,根据这些任务需求,需要用到:

它们的命名和文档都很规范,因为这些是官方提供的比较常用的插件。这些插件同时都是 NPM 管理的包,比如grunt-contrib-concat - npm 你也可以在这上面看到用法等。

下面我们就要在这个项目中安装这些插件,执行命令:

npm install grunt --save-dev

表示通过 npm 安装了 grunt 到当前项目,同时加上了 —save-dev 参数,表示会把刚安装的东西添加到 package.json 文件中。不信你打开 package.json 文件看下,是不是多了

“devDependencies”: {

“grunt”: “^0.4.5”

}

没错,这个的意思就是当前项目依赖 grunt,后面是它的版本,咱们不用管。如果安装的时候没有添加 —save-dev 参数,这里就不会出现了,你需要自行添加上去。

下面我们来安装 Grunt 的插件,当然,不需要一个个的安装,太麻烦了,我们可以:

npm install --save-dev grunt-contrib-concat grunt-contrib-jshint grunt-contrib-sass grunt-contrib-uglify grunt-contrib-watch grunt-contrib-connect

等待一大串乱七八糟的下载状态,我们把 grunt 和相关插件都安装好了,不信看下是不是多了一个 node_modules 文件夹?打开看下,里面就是咱们刚安装的插件。

配置 Gruntfile.js 的语法

插件也装好了,开始写任务吧!既然是要程序来读取执行,必要要有一定的语法规范,下面来简单的说一下:

首先要明白,这是一个 JS 文件,你可以写任意的 JS 代码,比如声明一个 对象 来存储一会要写任务的参数,或者是一个变量当作开关等等。

然后,所有的代码要包裹在

module.exports = function(grunt) {

};

里面。没有为什么。

在这里面的代码,除去你自己写的乱七八糟的 JS,与 Grunt 有关的主要有三块代码:任务配置代码、插件加载代码、任务注册代码。

顾名思义,这三块代码,任务配置代码就是调用插件配置一下要执行的任务和实现的功能,插件加载代码就是把需要用到的插件加载进来,任务注册代码就是注册一个 task,里面包含刚在前面编写的任务配置代码。

这样,就可以用 grunt 来执行注册的一个 task 从而根据任务配置代码调用需要的插件来执行相应的操作。

下面来分别看一下这三块代码的写法。

任务配置代码

例如下面代码:

grunt.initConfig({

pkg: grunt.file.readJSON(‘package.json’),

uglify: {

options: {

banner: ‘/*! <%= pkg.name %> <%= grunt.template.today(“yyyy-mm-dd”) %> */\n’

},

build: {

src: ‘src/<%= pkg.name %>.js’,

dest: ‘build/<%= pkg.name %>.min.js’

}

}

});

可以看出,具体的任务配置代码以对象格式放在 grunt.initConfig 函数里面,其中先写了一句 pkg: grunt.file.readJSON('package.json') 功能是读取 package.json 文件,并把里面的信息获取出来,方便在后面任务中应用(例如下面就用了 <%= pkg.name %> 来输出项目名称),这样可以提高灵活性。之后就是 uglify 对象,这个名字是固定的,表示下面任务是调用 uglify 插件的,首先先配置了一些全局的 options 然后新建了一个 build 任务。

也就是说,在 Uglify 插件下面,有一个 build 任务,内容是把 XX.js 压缩输出到 xx.min.js 里面。如果你需要更多压缩任务,也可以参照 build 多写几个任务。

至于怎么写出来 options 里面的参数和 build 里面的参数内容,这才是 grunt 学习的难点,你需要查看每个插件的用法,根据用法来编写任务,可以看下 grunt-contrib-uglify 的官方文档,往下面拉你就可以看到参数和使用方法了。

这样,我们就新建了一个基于 uglify 的任务 build,功能是把 src/<%= pkg.name %>.js 压缩输出 build/<%= pkg.name %>.min.js

插件加载代码

这个就超级简单了,由于上面任务需要用到 grunt-contrib-uglify,当 grunt-contrib-uglify 安装到我们的项目之后,写下下面代码即可加载:

grunt.loadNpmTasks(‘grunt-contrib-uglify’);

任务注册代码

插件也加载了,任务也布置了,下面我们得注册一下任务,使用

grunt.registerTask(‘default’, [‘uglify’]);

来注册一个任务。上面代码意思是,你在 default 上面注册了一个 Uglify 任务,default 就是别名,它是默认的 task,当你在项目目录执行 grunt 的时候,它会执行注册到 default 上面的任务。

也就是说,当我们执行 grunt 命令的时候,uglify 的所有代码将会执行。我们也可以注册别的 task,例如:

grunt.registerTask(‘compress’, [‘uglify:build’]);

如果想要执行这个 task,我们就不能只输入 grunt 命令了,我们需要输入 grunt compress 命令来执行这条 task,而这条 task 的任务是 uglify 下面的 build 任务,也就是说,我们只会执行 uglify 里面 build 定义的任务,而不会执行 uglify 里面定义的其他任务。

这里需要注意的是,task 的命名不能与后面的任务配置同名,也就是说这里的 compress 不能命名成 uglify,这样会报错或者产生意外情况

OK,加上这三块代码,我们的示例 Gruntfile.js 就是这样子的:

module.exports = function(grunt) {

// Project configuration.

grunt.initConfig({

pkg: grunt.file.readJSON(‘package.json’),

uglify: {

options: {

banner: ‘/*! <%= pkg.name %> <%= grunt.template.today(“yyyy-mm-dd”) %> */\n’

},

build: {

src: ‘src/<%= pkg.name %>.js’,

dest: ‘build/<%= pkg.name %>.min.js’

}

}

});

// Load the plugin that provides the “uglify” task.

grunt.loadNpmTasks(‘grunt-contrib-uglify’);

// Default task(s).

grunt.registerTask(‘default’, [‘uglify’]);

};

这就是官方那个坑爹示例,貌似 uglify 的参数好像不对,反正我之前学习的时候,没法运行这个配置,下面我们来根据示例项目和我们的需求配置一下。

配置 Gruntfile.js

先从简单的入手,我们先来配置一下编译 Scss 文件的 task。先新建一个 Gruntfile.js 文件,把大体的配置结构复制进去:

module.exports = function(grunt) {

var sassStyle = ‘expanded’;

grunt.initConfig({

pkg: grunt.file.readJSON(‘package.json’),

sass: {

}

});

grunt.loadNpmTasks(‘grunt-contrib-sass’);

grunt.registerTask(‘outputcss’,[‘sass’]);

grunt.registerTask(‘default’);

};

应该可以看懂把?这里不再赘述了,我们来根据 Sass 文档,编写一个 Sass 任务 output :

module.exports = function(grunt) {

var sassStyle = ‘expanded’;

grunt.initConfig({

pkg: grunt.file.readJSON(‘package.json’),

sass: {

output : {

options: {

style: sassStyle

},

files: {

‘./style.css’: ‘./scss/style.scss’

}

}

}

});

grunt.loadNpmTasks(‘grunt-contrib-sass’);

grunt.registerTask(‘outputcss’,[‘sass’]);

grunt.registerTask(‘default’);

};

意思就是将 ./scss/style.scss 这个文件以 sassStyle 变量存储的方式编译成 根目录下面的 style.css 文件。

下面拿起命令行,cd 到当前文档目录,执行一下 grunt 命令,结果报错 undefined,没错,因为我们的 default task 里面没有定义任何任务,然后执行 grunt outputcss 命令,提示编译 Scss 文件成功,当然前提是你的 Scss 语法正确,如果有问题就不会成功。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面我们打算先把 src 目录下面的两个 JS 文件合并起来,然后再用 jshint 检测一下是否有语法问题,如果正确,再用 uglify 对合并起来的文件进行压缩。

参照 grunt-contrib-concat 的官方文档,我们可以写出下面的任务:

module.exports = function(grunt) {

var sassStyle = ‘expanded’;

grunt.initConfig({

pkg: grunt.file.readJSON(‘package.json’),

sass: {

output : {

options: {

style: sassStyle

},

files: {

‘./style.css’: ‘./scss/style.scss’

}

}

},

concat: {

options: {

separator: ‘;’,

},

dist: {

src: [‘./src/plugin.js’, ‘./src/plugin2.js’],

dest: ‘./global.js’,

},

}

});

grunt.loadNpmTasks(‘grunt-contrib-sass’);

grunt.loadNpmTasks(‘grunt-contrib-concat’);

grunt.registerTask(‘outputcss’,[‘sass’]);

grunt.registerTask(‘concatjs’,[‘concat’]);

grunt.registerTask(‘default’);

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

HTTP

  • HTTP 报文结构是怎样的?

  • HTTP有哪些请求方法?

  • GET 和 POST 有什么区别?

  • 如何理解 URI?

  • 如何理解 HTTP 状态码?

  • 简要概括一下 HTTP 的特点?HTTP 有哪些缺点?

  • 对 Accept 系列字段了解多少?

  • 对于定长和不定长的数据,HTTP 是怎么传输的?

  • HTTP 如何处理大文件的传输?

  • HTTP 中如何处理表单数据的提交?

  • HTTP1.1 如何解决 HTTP 的队头阻塞问题?

  • 对 Cookie 了解多少?

  • 如何理解 HTTP 代理?

  • 如何理解 HTTP 缓存及缓存代理?

  • 为什么产生代理缓存?

  • 源服务器的缓存控制

  • 客户端的缓存控制

  • 什么是跨域?浏览器如何拦截响应?如何解决?

    开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】


转存中…(img-0idR6vqc-1710596495942)]

HTTP

  • HTTP 报文结构是怎样的?

  • HTTP有哪些请求方法?

  • GET 和 POST 有什么区别?

  • 如何理解 URI?

  • 如何理解 HTTP 状态码?

  • 简要概括一下 HTTP 的特点?HTTP 有哪些缺点?

  • 对 Accept 系列字段了解多少?

  • 对于定长和不定长的数据,HTTP 是怎么传输的?

  • HTTP 如何处理大文件的传输?

  • HTTP 中如何处理表单数据的提交?

  • HTTP1.1 如何解决 HTTP 的队头阻塞问题?

  • 对 Cookie 了解多少?

  • 如何理解 HTTP 代理?

  • 如何理解 HTTP 缓存及缓存代理?

  • 为什么产生代理缓存?

  • 源服务器的缓存控制

  • 客户端的缓存控制

  • 什么是跨域?浏览器如何拦截响应?如何解决?

    开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值