Grunt 新手一日入门,阿里内部资料,2024前端大厂面试集合

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’);

};

执行 grunt concatjs 之后,就会发现根目录多了一个 global.js 文件,里面是两个文件合并起来的。然后类似的继续看 uglify 和 jshint 的文档,我们就可以根据需求写出下面任务:

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’,

},

},

uglify: {

compressjs: {

files: {

‘./global.min.js’: [‘./global.js’]

}

}

},

jshint: {

all: [‘./global.js’]

}

});

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

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

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

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

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

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

grunt.registerTask(‘compressjs’,[‘concat’,‘jshint’,‘uglify’]);

grunt.registerTask(‘default’);

};

其中注册了一个 compressjs 任务 grunt.registerTask('compressjs',['concat','jshint','uglify']); 意思就是依次执行 合并、检查、压缩 任务。我们把刚生成的 global.js 文件删掉,在命令行执行 grunt compressjs 任务,结果 jshint 报错了:

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

grunt 遇到错误就退出了,就没法继续执行下面的任务。通过错误提示可以发现,是因为 concat 里面设置的参数——在两个文件合并间插入一个“;”——这本来是为了防止两个文件之间相互干扰设置的,结果无法被 jshint 验证通过,我们可以删掉这个参数,或者设置 jshint 验证这两个文件,然后再进行合并。

为了方便,我删掉了这个参数。再执行一下,成功了,项目目录里面多了 global.js 和 global.min.js 文件。

小明看到这里,痛哭流泪,自己每次打开好几个网站,辛苦挨个粘贴复制新建,没想到输入一条命令就可以了。不过让他更伤心的还在后面,连这些命令都不用重复输入。

我们可以通过 watch 来监听文件变动,当文件变化了(我们编写保存了),自动执行某些任务。此处为了节约版面,我连自动刷新的任务一块写上去。根据 grunt-contrib-watch 和 grunt-contrib-connect 这俩文档,我们可以写出下面的任务:

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: {

dist: {

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

dest: ‘./global.js’,

},

},

uglify: {

compressjs: {

files: {

‘./global.min.js’: [‘./global.js’]

}

}

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

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

img
img
img
img

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

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

最后

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

大厂面试问深度,小厂面试问广度,如果有同学想进大厂深造一定要有一个方向精通的惊艳到面试官,还要平时遇到问题后思考一下问题的本质,找方法解决是一个方面,看到问题本质是另一个方面。还有大家一定要有目标,我在很久之前就想着以后一定要去大厂,然后默默努力,每天看一些大佬们的文章,总是觉得只有再学深入一点才有机会,所以才有恒心一直学下去。

K2OP5uwL-1710819270687)]

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

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-ufNEcKo0-1710819270688)]

最后

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

大厂面试问深度,小厂面试问广度,如果有同学想进大厂深造一定要有一个方向精通的惊艳到面试官,还要平时遇到问题后思考一下问题的本质,找方法解决是一个方面,看到问题本质是另一个方面。还有大家一定要有目标,我在很久之前就想着以后一定要去大厂,然后默默努力,每天看一些大佬们的文章,总是觉得只有再学深入一点才有机会,所以才有恒心一直学下去。

  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值