module.exports = function (grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), copy: { main: { files: [] } } }); var build = function (module, type, callback) { var config = { compile: { options: type === 'js' ? { optimizeCss: "standard", optimize: "none", //可使用uglify|closure|none preserveLicenseComments: true, removeCombined: false, baseUrl: "./public/assets/js/", //JS文件所在的基础目录 name: "require-" + module, //来源文件,不包含后缀 out: "./public/assets/js/require-" + module + ".min.js" //目标文件 } : { optimizeCss: "default", optimize: "uglify", //可使用uglify|closure|none cssIn: "./public/assets/css/" + module + ".css", //JS文件所在的基础目录 out: "./public/assets/css/" + module + ".min.css" //目标文件 } } }; var content = grunt.file.read("./public/assets/js/require-" + module + ".js"), pattern = /^require\.config\(\{[\r\n]?[\n]?(.*?)[\r\n]?[\n]?}\);/is; var matches = content.match(pattern); if (matches) { if (type === 'js') { var data = matches[1].replaceAll(/(urlArgs|baseUrl):(.*)\n/gi, ''); const parse = require('parse-config-file'), fs = require('fs'); require('jsonminify'); data = JSON.minify("{\n" + data + "\n}"); let options = parse(data); options.paths.tableexport = "empty:"; Object.assign(config.compile.options, options); } let requirejs = require("./application/admin/command/Min/r"); try { requirejs.optimize(config.compile.options, function (buildResponse) { // var contents = require('fs').readFileSync(config.compile.options.out, 'utf8'); callback(); }, function (err) { console.error(err); callback(); }); } catch (err) { console.error(err); callback(); } } }; // 加载 "copy" 插件 grunt.loadNpmTasks('grunt-contrib-copy'); grunt.registerTask('frontend:js', 'build frontend js', function () { var done = this.async(); build('frontend', 'js', done); }); grunt.registerTask('backend:js', 'build backend js', function () { var done = this.async(); build('backend', 'js', done); }); grunt.registerTask('frontend:css', 'build frontend css', function () { var done = this.async(); build('frontend', 'css', done); }); grunt.registerTask('backend:css', 'build frontend css', function () { var done = this.async(); build('backend', 'css', done); }); // 注册部署JS和CSS任务 grunt.registerTask('deploy', 'deploy', function () { const fs = require('fs'); const path = require("path") const nodeModulesDir = path.resolve(__dirname, "./node_modules"); const getAllFiles = function (dirPath, arrayOfFiles) { files = fs.readdirSync(dirPath) arrayOfFiles = arrayOfFiles || [] files.forEach(function (file) { if (fs.statSync(dirPath + "/" + file).isDirectory()) { arrayOfFiles = getAllFiles(dirPath + "/" + file, arrayOfFiles) } else { arrayOfFiles.push(path.join(__dirname, dirPath, "/", file)) } }); return arrayOfFiles }; const mainPackage = grunt.config.get('pkg'); let dists = mainPackage.dists || []; let files = []; Object.keys(dists).forEach(key => { let src = ["**/*LICENSE*", "**/*license*"]; src = src.concat(Array.isArray(dists[key]) ? dists[key] : [dists[key]]); files.push({expand: true, cwd: nodeModulesDir + "/" + key, src: src, dest: 'public/assets/libs/' + key + "/"}); }); grunt.config.set('copy.main.files', files); grunt.task.run("copy:main"); }); // 注册默认任务 grunt.registerTask('default', ['deploy', 'frontend:js', 'backend:js', 'frontend:css', 'backend:css']); };