grunt 配置文件
module.exports = function (grunt) { pkg: grunt.file.readJSON('package.json'), var sourceDir = "dev";// 源码目录 var buildDir = ".build";// 构建中间目录 var finalDir = "release";// 最终打包目录 var static_url = ""; var transport = require('grunt-cmd-transport'); var style = transport.style.init(grunt); var script = transport.script.init(grunt); grunt.initConfig({ watch: { css: { files: ['' + sourceDir + '/**/*.css'], tasks: ['css_combo', 'css_url_replace', 'clean', 'copy:build'], options: {livereload: true} }, js: { files: ['' + sourceDir + '/**/*.js'], tasks: ['transport', 'concat', 'uglify', 'clean', 'copy:build', 'copy:base'], options: {livereload: true} }, images: { files: ['' + sourceDir + '/images/**/*'], tasks: ['copy:image'], options: {livereload: true} } }, // 检测js依赖 transport: { options: { paths: [sourceDir], parsers: { '.js': [script.jsParser], '.css': [style.css2jsParser] }, alias: { //lib-flexible 'flexible': static_url + '/lib/flexible/0.3.2/flexible', // jquery 'jquery': static_url + '/lib/jquery/1.8.2/jquery', // iscroll 'iscroll': static_url + '/lib/iscroll/4.2.5/iscroll', // iscroll5 'iscroll5': static_url + '/lib/iscroll/5.0/iscroll-probe.js', // jquery的base64库 'base64': static_url + '/lib/base64/0.0.3/base64', // validForm验证库 'validForm': static_url + '/lib/validForm/5.3.2/validForm', // artDialog弹出库 'dialog': static_url + '/lib/artDialog/4.1.7/artDialog', // artTemplate的js模版引擎库 'template': static_url + '/lib/artTemplate/0.0.1/artTemplate', // swiper 'swiper': static_url + '/lib/swiper/3.1.0/swiper.min', //qrcode 'qrcode': static_url + "/lib/qrcode/0.0.1/qrcode.min.js", //sweetAlert 'sweetAlert': static_url + "/lib/sweetAlert/0.0.1/sweetalert.min.js", //echarts 'echarts': static_url + "/lib/echarts/3.7.1/echarts.min.js", //jsencrypt 'jsencrypt': static_url + "/lib/echarts/2.3.1/jsencrypt.js", //laydate日历插件 'laydate': static_url + "/lib/laydate/laydate.js", 'select2': static_url + "/lib/select/select2.js", //laydate粘贴板插件 'clipboard': static_url + "/lib/clipboard/1.0.0/clipboard.js" } }, build: { files: [ { cwd: sourceDir, src: ['module/**/*.js'], dest: buildDir } ] } }, // 合并js concat: { options: { paths: [buildDir], include: 'all' }, build: { files: [ { expand: true, cwd: buildDir, src: ['**/**/*.js', '!lib/*', '!**/**/*-debug.js'], dest: finalDir } ] } }, // 压缩js uglify: { //banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'//添加banner options: { mangle: true, //不混淆变量名 //preserveComments: 'all', //不删除注释,还可以为 false(删除全部注释),some(保留@preserve @license @cc_on等注释) footer: '\n/*! 最后修改于: <%= grunt.template.today("yyyy-mm-dd") %> */', //添加footer compress: { drop_console: true } }, build: { files: [ { expand: true, cwd: sourceDir, src: ['**/**/*.js', 'base/js/*.js', '!**/**/*-debug.js', '!**/lib/**/*.js'], dest: finalDir } ] } }, //压缩css css_combo: { options: { debug: false, compress: true }, build: { files: [{ expand: true, cwd: sourceDir, src: ['**/*.css', 'base/css/*.css', '!**/tmpcommon/*.css', '!**/tmpcommon/*.js'], dest: finalDir }] } }, css_url_replace: { options: { staticRoot: sourceDir }, replace: { files: [{ expand: true, cwd: finalDir, src: ['**/*.css', '!**/tmpcommon/*.css', '!**/tmpcommon/*.js'], dest: finalDir }] } }, // 删除临时目录 clean: { build: [buildDir], removeCommon: [finalDir + '/module/tmpcommon', finalDir + '/css/tmpcommon'] }, //复制文件 copy: { build: { expand: true, flatten: false, cwd: sourceDir, src: ['!module/tmpcommon/*.js', 'lib/**/*.js', 'lib/**/*.woff'], dest: finalDir, filter: 'isFile' }, image: { expand: true, flatten: false, cwd: sourceDir, src: ['images/**/*'], dest: finalDir, filter: 'isFile' }, lib: { expand: true, flatten: false, cwd: sourceDir, src: ['lib/**/*'], dest: finalDir, filter: 'isFile' }, configJs: { expand: true, flatten: false, cwd: sourceDir, src: ['public/config.js'], dest: finalDir, filter: 'isFile' } } }); grunt.loadNpmTasks('grunt-css-combo'); grunt.loadNpmTasks('grunt-css-url-replace'); grunt.loadNpmTasks('grunt-cmd-transport'); grunt.loadNpmTasks('grunt-cmd-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-livereload'); grunt.loadNpmTasks('grunt-contrib-watch'); // 监听 grunt.registerTask('dev', ['watch']); // 处理全部 grunt.registerTask('init', ['transport', 'concat', 'uglify', 'css_combo', 'css_url_replace', 'copy', 'clean']); };
帮助文档:
https://www.cnblogs.com/well-nice/p/4801408.html
https://www.cnblogs.com/mangoniki/p/5383240.html