这段代码来自javascript
http://stackoverflow.com/questions/20583812/grunt-requirejs-optimizer-for-a-multi-app-projectcss
通常状况下,大部分项目都是多页面不多有项目是单页面应用程序html
而 r.js 默认打包支持两种状况java
1 全部js文件打包到1个文件jquery
2 在1的基础上能够给js按照模块分组,支持多个模块在1个js文件中git
BUT 都是最终归结为1个js文件。。。。。。github
可是这不是我想要的,我就想要一个页面相关的js打包成一个js文件包,每一个页面都有本身的js文件包web
方法很简单 基于grunt+grunt-contrib-requirejsjson
具体配置在这里https://github.com/qqqzhch/webfans/blob/master/Gruntfile.jssass
module.exports = function(grunt) { // r.js 打包 准备 var files = grunt.file.expand('js/app/*/main.js'); //读取要打包的js入口 通常都为 main的js var requirejsOptions = {}; //用来存储 打包配置的对象 //遍历文件 files.forEach(function(file) { var filenamelist = file.split('/'); var num = filenamelist.length; var filename = filenamelist[num - 2]; //获取目录名称,由于这里的文件名都是main的js requirejsOptions[filename] = { options: { baseUrl: "js/", paths: { "text": 'lib/text', "jquery": 'lib/jquery', "backbone": 'lib/backbone', "underscore": 'lib/underscore', "Highcharts": 'lib/highcharts/highcharts', "select2": 'lib/select2/select2', "moment": 'lib/moment', "jquery-ui": 'lib/jquery-ui/jquery-ui', "jquery.cookie": 'lib/jquery.cookie', "validate": 'lib/jquery.validate', "metadata": 'lib/jquery.metadata', "jsplumb": "lib/jquery.jsPlumb", "qtip": 'lib/qtip/jquery.qtip', "nicescroll": "lib/jquery.nicescroll", "Htheme": 'lib/highcharts/theme', 'jquery.mousewheel': 'lib/jquery.mousewheel' }, optimizeAllPluginResources: true, name: 'app/' + filename + '/main', out: 'js/appbuild/' + filename + '/main.js' } }; }); // grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), // requirejs: requirejsOptions connect: { //这里为插件子刷新方式 options: { port: 9000, hostname: 'localhost', //默认就是这个值,可配置为本机某个 IP,localhost 或域名 livereload: 35729 //声明给 watch 监听的端口 }, server: { options: { open: true, //自动打开网页 http:// base: [ '.' //主目录 ] } } }, watch: { sass: { files: ['sass/**/*.{scss,sass}', 'sass/_partials/**/*.{scss,sass}'], tasks: ['compass:dist'] }, livereload: { options: { livereload: '<%=connect.options.livereload%>' //监听前面声明的端口 35729 }, files: [ //下面文件的改变就会实时刷新网页 'app/*.html', 'stylesheets/{,*/}*.css', 'javascripts/{,*/}*.js', 'images/{,*/}*.{png,jpg}' ] } }, compass: { dist: { options: { config: 'config.rb' } } }, jst: { options: { amd: true, // define()的方法包裹生成的内容 namespace: false, // prettify: true, // 生成的内容在一行 templateSettings: { evaluate: /{%([\s\S]+?)%}/g, interpolate: /{{([\s\S]+?)}}/g, escape: /{%-([\s\S]+?)%}/g } }, // files: { // src: 'js/app/*/tpl/*.html', // dest: 'js/app/$1/tpljs/$2.js' // } files: { expand: true, // 开启构建动态文件对象 cwd: 'js/app/', // 模板目录(源文件) src: ['**/*.html'], // 能匹配到模板的二级目录 dest: 'js/app/', // 目标文件目录 rename: function(dest, src) { var path = require('path'); var filename = path.basename(src); var dirname = path.dirname(src); dirname = dirname.replace('tpl', 'tpljs') var finalPath = path.resolve(dest, dirname, 'js', filename); console.log(dirname); console.log(finalPath); return finalPath; }, ext: '.js' // 目标文件的后缀名 } }, jshint: { options: { curly: true, eqeqeq: false, eqnull: true, browser: true, es3: true, latedef: true, newcap: true, noarg: true, noempty: true, //quotmark: true, undef: true, strict: true, maxdepth: 3, maxstatements: 50, maxlen: 255, globals: { jQuery: true, $: true, require: true, define: true, Blueware: true, _: true, Backbone: true, ATM: true, console: true, }, }, files: { expand: true, // 开启构建动态文件对象 cwd: 'js/app/', // 模板目录(源文件) src: ['*/*.js'], // 能匹配到模板的二级目录 } } }); grunt.loadNpmTasks('grunt-contrib-compass'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-connect'); grunt.registerTask('default', ['compass:dist', 'connect:server', 'watch']); };
经过观察咱们能够发现,配置和r.js 的build.js 是一致的,而后按照文件名存贮到对象中,
对与和grunt的配置则简单多了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//*****省略其余代码
requirejs: requirejsOptions
});
// Default task(s).
grunt.registerTask(
'dev'
, [
'compass:force'
,
'connect:server'
,
'watch'
]);
grunt.registerTask(
'dist'
, [
'compass:force'
]);
grunt.registerTask(
'js'
, [
'requirejs'
]);
|
运行结果以下
观察每一个打包后的js文件,发现根据依赖打包,果真强悍,作到了每一个页面js的插件数量恰好知足这个页面的需求,作到每一个页面的代码都是最少的,可见多对多打包仍是挺不错的