如果想要执行这个 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’]
}
}
},
jshint: {
all: [‘./global.js’]
},
watch: {
scripts: {
files: [‘./src/plugin.js’,‘./src/plugin2.js’],
tasks: [‘concat’,‘jshint’,‘uglify’]
},
sass: {
files: [‘./scss/style.scss’],
tasks: [‘sass’]
},
livereload: {
options: {
livereload: ‘<%= connect.options.livereload %>’
},
files: [
‘index.html’,
‘style.css’,
‘js/global.min.js’
]
}
},
connect: {
options: {
port: 9000,
open: true,
livereload: 35729,
// Change this to ‘0.0.0.0’ to access the server from outside
hostname: ‘localhost’
},
server: {
options: {
port: 9001,
base: ‘./’
}
}
}
});
grunt.loadNpmTasks(‘grunt-contrib-sass’);
grunt.loadNpmTasks(‘grunt-contrib-concat’);
grunt.loadNpmTasks(‘grunt-contrib-jshint’);
grunt.loadNpmTasks(‘grunt-contrib-uglify’);
grunt.loadNpmTasks(‘grunt-contrib-watch’);
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
最后
小编综合了阿里的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
1710596521940)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-Hx2hHs01-1710596521940)]
最后
小编综合了阿里的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
虽只说了一个公司的面试,但我们可以知道大厂关注的东西并举一反三,通过一个知识点延伸到另一个知识点,这是我们要掌握的学习方法,小伙伴们在这篇有学到的请评论点赞转发告诉小编哦,谢谢大家的支持!