Requirejs.
Showing
2 changed files
with
158 additions
and
24 deletions
... | @@ -7,6 +7,43 @@ | ... | @@ -7,6 +7,43 @@ |
7 | 7 | ||
8 | module.exports = function (grunt) { | 8 | module.exports = function (grunt) { |
9 | var _ = require('lodash'); | 9 | var _ = require('lodash'); |
10 | |||
11 | grunt.registerTask('revconfig', function revconfig() { | ||
12 | var prefix = grunt.template.process('dist/scripts/'); | ||
13 | var pattern = prefix + '**/*.{js,html}'; | ||
14 | var files = grunt.file.expand(pattern); | ||
15 | var lines = [ | ||
16 | '(function(container) {', | ||
17 | ]; | ||
18 | _.each(files, function(file) { | ||
19 | file = file.substring(prefix.length); | ||
20 | var res = file.match(/^(.*\/)?([0-9a-f]+)\.([^\/]+)\.([^\.]+)$/); | ||
21 | if (!res) { | ||
22 | return; | ||
23 | } | ||
24 | //grunt.log.oklns(JSON.stringify(res)); | ||
25 | var dir = res[1] || ''; | ||
26 | //var hash = res[2]; | ||
27 | var base = res[3]; | ||
28 | var ext = res[4]; | ||
29 | var id; | ||
30 | if (ext === 'js') { | ||
31 | id = dir + base; | ||
32 | file = file.substring(0, file.length - ext.length - 1); | ||
33 | } else if (ext === 'html') { | ||
34 | id = 'text!' + dir + base + '.' + ext; | ||
35 | } | ||
36 | grunt.log.oklns('map: ' + id + ' -> ' + file); | ||
37 | lines.push('container[' + JSON.stringify(id) + ']=' + JSON.stringify(file) + ';\n'); | ||
38 | }); | ||
39 | lines.push('})(require.paths);'); | ||
40 | if (false && lines.length == 2) { | ||
41 | lines = []; | ||
42 | } | ||
43 | grunt.file.write('.grunt/holygrail/scripts/revconfig.js', lines.join('')); | ||
44 | }); | ||
45 | |||
46 | |||
10 | function createConfig(mpConfig) { | 47 | function createConfig(mpConfig) { |
11 | 48 | ||
12 | var holyGrailTmp = '.grunt/holygrail'; | 49 | var holyGrailTmp = '.grunt/holygrail'; |
... | @@ -23,6 +60,7 @@ module.exports = function (grunt) { | ... | @@ -23,6 +60,7 @@ module.exports = function (grunt) { |
23 | }] | 60 | }] |
24 | }, | 61 | }, |
25 | }, | 62 | }, |
63 | concat: {}, | ||
26 | copy: { | 64 | copy: { |
27 | dist: { | 65 | dist: { |
28 | files: [{ | 66 | files: [{ |
... | @@ -40,7 +78,7 @@ module.exports = function (grunt) { | ... | @@ -40,7 +78,7 @@ module.exports = function (grunt) { |
40 | }, | 78 | }, |
41 | }, | 79 | }, |
42 | }; | 80 | }; |
43 | if (common.useRev) { | 81 | if (mpConfig.useRev) { |
44 | initConfig.rev = { | 82 | initConfig.rev = { |
45 | dist: { | 83 | dist: { |
46 | files: [], | 84 | files: [], |
... | @@ -118,7 +156,7 @@ module.exports = function (grunt) { | ... | @@ -118,7 +156,7 @@ module.exports = function (grunt) { |
118 | } | 156 | } |
119 | 157 | ||
120 | var htmlSourceDir; | 158 | var htmlSourceDir; |
121 | if (common.punch) { | 159 | if (mpConfig.punch) { |
122 | grunt.registerMultiTask('punch', 'run punch externally to create html files', function() { | 160 | grunt.registerMultiTask('punch', 'run punch externally to create html files', function() { |
123 | var done = this.async(); | 161 | var done = this.async(); |
124 | var options = this.options(); | 162 | var options = this.options(); |
... | @@ -201,7 +239,7 @@ module.exports = function (grunt) { | ... | @@ -201,7 +239,7 @@ module.exports = function (grunt) { |
201 | initConfig.clean.dist.files[0].src.push('.grunt/usemin'); | 239 | initConfig.clean.dist.files[0].src.push('.grunt/usemin'); |
202 | initConfig.htmlmin = { | 240 | initConfig.htmlmin = { |
203 | dist: { | 241 | dist: { |
204 | //options: _.extend({}, common.htmlmin.options), | 242 | //options: _.extend({}, mpConfig.htmlmin.options), |
205 | files: [{ | 243 | files: [{ |
206 | expand: true, | 244 | expand: true, |
207 | cwd: 'dist', | 245 | cwd: 'dist', |
... | @@ -212,26 +250,26 @@ module.exports = function (grunt) { | ... | @@ -212,26 +250,26 @@ module.exports = function (grunt) { |
212 | }; | 250 | }; |
213 | } | 251 | } |
214 | 252 | ||
215 | if (common.css) { | 253 | if (mpConfig.css) { |
216 | initConfig.copy.css = { | 254 | initConfig.copy.css = { |
217 | files: [{ | 255 | files: [{ |
218 | expand: true, | 256 | expand: true, |
219 | dot: true, | 257 | dot: true, |
220 | cwd: 'src', | 258 | cwd: 'src', |
221 | dest: '.grunt/usemin-css/', | 259 | dest: '.grunt/usemin-css/', |
222 | src: _.map(common.css.options.dirs, function (value) { | 260 | src: _.map(mpConfig.css.options.dirs, function (value) { |
223 | return value + '/{,**/}*.css'; | 261 | return value + '/{,**/}*.css'; |
224 | }), | 262 | }), |
225 | }] | 263 | }] |
226 | }; | 264 | }; |
227 | initConfig.clean.dist.files[0].src.push('.grunt/usemin-css'); | 265 | initConfig.clean.dist.files[0].src.push('.grunt/usemin-css'); |
228 | initConfig.usemin.css = _.map(common.css.options.dirs, function (value) { | 266 | initConfig.usemin.css = _.map(mpConfig.css.options.dirs, function (value) { |
229 | return 'dist/' + value + '/{,**/}*.css'; | 267 | return 'dist/' + value + '/{,**/}*.css'; |
230 | }); | 268 | }); |
231 | if (common.useRev) { | 269 | if (mpConfig.useRev) { |
232 | initConfig.rev.css = { | 270 | initConfig.rev.css = { |
233 | files: { | 271 | files: { |
234 | src: _.map(common.css.options.dirs, function (value) { | 272 | src: _.map(mpConfig.css.options.dirs, function (value) { |
235 | return 'dist/' + value + '/{,**/}*.css'; | 273 | return 'dist/' + value + '/{,**/}*.css'; |
236 | }), | 274 | }), |
237 | } | 275 | } |
... | @@ -239,10 +277,10 @@ module.exports = function (grunt) { | ... | @@ -239,10 +277,10 @@ module.exports = function (grunt) { |
239 | } | 277 | } |
240 | } | 278 | } |
241 | 279 | ||
242 | if (common.images) { | 280 | if (mpConfig.images) { |
243 | initConfig.imagemin = { | 281 | initConfig.imagemin = { |
244 | dist: { | 282 | dist: { |
245 | files: _.map(common.images.options.dirs, function (value) { | 283 | files: _.map(mpConfig.images.options.dirs, function (value) { |
246 | return { | 284 | return { |
247 | expand: true, | 285 | expand: true, |
248 | cwd: 'src/' + value, | 286 | cwd: 'src/' + value, |
... | @@ -254,7 +292,7 @@ module.exports = function (grunt) { | ... | @@ -254,7 +292,7 @@ module.exports = function (grunt) { |
254 | }; | 292 | }; |
255 | initConfig.svgmin = { | 293 | initConfig.svgmin = { |
256 | dist: { | 294 | dist: { |
257 | files: _.map(common.images.options.dirs, function (value) { | 295 | files: _.map(mpConfig.images.options.dirs, function (value) { |
258 | return { | 296 | return { |
259 | expand: true, | 297 | expand: true, |
260 | cwd: 'src/' + value, | 298 | cwd: 'src/' + value, |
... | @@ -270,15 +308,15 @@ module.exports = function (grunt) { | ... | @@ -270,15 +308,15 @@ module.exports = function (grunt) { |
270 | dot: true, | 308 | dot: true, |
271 | cwd: 'src', | 309 | cwd: 'src', |
272 | dest: 'dist', | 310 | dest: 'dist', |
273 | src: _.map(common.images.options.dirs, function (value) { | 311 | src: _.map(mpConfig.images.options.dirs, function (value) { |
274 | return value + '/{,**/}*.*'; | 312 | return value + '/{,**/}*.*'; |
275 | }), | 313 | }), |
276 | }] | 314 | }] |
277 | }; | 315 | }; |
278 | if (common.useRev) { | 316 | if (mpConfig.useRev) { |
279 | initConfig.rev.img = { | 317 | initConfig.rev.img = { |
280 | files: { | 318 | files: { |
281 | src: _.map(common.images.options.dirs, function (value) { | 319 | src: _.map(mpConfig.images.options.dirs, function (value) { |
282 | return 'dist/' + value + '/{,**/}*.{gif,jpeg,jpg,png,webp}'; | 320 | return 'dist/' + value + '/{,**/}*.{gif,jpeg,jpg,png,webp}'; |
283 | }), | 321 | }), |
284 | } | 322 | } |
... | @@ -286,49 +324,144 @@ module.exports = function (grunt) { | ... | @@ -286,49 +324,144 @@ module.exports = function (grunt) { |
286 | } | 324 | } |
287 | } | 325 | } |
288 | 326 | ||
289 | if (common.bower) { | 327 | if (mpConfig.bower) { |
290 | externalMultiTask('bower', 'run bower externally', 'bower', function(target, options, configFile) { | 328 | externalMultiTask('bower', 'run bower externally', 'bower', function(target, options, configFile) { |
291 | return ['--config.directory=' + options.directory, target]; | 329 | return ['--config.directory=' + options.directory, target]; |
292 | }); | 330 | }); |
293 | initConfig.bower = { | 331 | initConfig.bower = { |
294 | options: { | 332 | options: { |
295 | directory: 'src/' + common.bower.directory, | 333 | directory: 'src/' + mpConfig.bower.directory, |
296 | }, | 334 | }, |
297 | install: {}, | 335 | install: {}, |
298 | update: {}, | 336 | update: {}, |
299 | }; | 337 | }; |
300 | if (common.useRev) { | 338 | if (mpConfig.useRev) { |
301 | initConfig.rev.dist.files.push({src: 'dist/' + common.bower.directory}); | 339 | initConfig.rev.dist.files.push({ |
340 | src: [ | ||
341 | 'dist/' + mpConfig.bower.directory + '/**/*.js', | ||
342 | '!dist/' + mpConfig.bower.directory + '/requirejs/require.js', | ||
343 | 'dist/scripts/**/*.js', | ||
344 | '!dist/scripts/config.js', | ||
345 | '!dist/scripts/defaults/**/*.js', | ||
346 | ], | ||
347 | }); | ||
348 | initConfig.rev.requirejs = { | ||
349 | files: { | ||
350 | src: [ | ||
351 | 'dist/' + mpConfig.bower.directory + '/requirejs/require.js', | ||
352 | ], | ||
353 | }, | ||
354 | }; | ||
355 | } | ||
356 | initConfig.concat.requirejs = { | ||
357 | files: [{ | ||
358 | dest: 'dist/' + mpConfig.bower.directory + '/requirejs/require.js', | ||
359 | src: [ | ||
360 | 'src/scripts/config.js', | ||
361 | '.grunt/holygrail/scripts/revconfig.js', | ||
362 | '.grunt/holygrail/scripts/bundles.js', | ||
363 | 'src/' + mpConfig.bower.directory + '/requirejs/require.js', | ||
364 | ], | ||
365 | }], | ||
366 | }; | ||
367 | initConfig.requirejs = { | ||
368 | dist: { | ||
369 | options: { | ||
370 | |||
371 | done: function onDone(next) { | ||
372 | /* jshint devel:true */ | ||
373 | var target = grunt.task.current.target; | ||
374 | var requireModules = grunt.config('requireModules.' + target) || {}; | ||
375 | var lines = [ | ||
376 | '(function(container, propName) {', | ||
377 | 'container = (container[propName] = container[propName] || {});', | ||
378 | ]; | ||
379 | for (var key in requireModules) { | ||
380 | var keyS = JSON.stringify(key); | ||
381 | var value = requireModules[key]; | ||
382 | var included = []; | ||
383 | for (var i = 0; i < value.length; i++) { | ||
384 | var file = value[i]; | ||
385 | if (file.match(/\.js$/)) { | ||
386 | included.push(file.substring(0, file.length - 3)); | ||
387 | } | ||
388 | } | ||
389 | lines.push('container[' + keyS + '] = ' + JSON.stringify(included) + ';'); | ||
390 | } | ||
391 | //lines.push('return bundles;'); | ||
392 | lines.push('})(require, \'bundles\');'); | ||
393 | if (lines.length == 2) { | ||
394 | lines = []; | ||
395 | } | ||
396 | grunt.file.write('.grunt/holygrail/scripts/bundles.js', lines.join('\n')); | ||
397 | next(); | ||
398 | }, | ||
399 | |||
400 | onModuleBundleComplete: function onModuleBundleComplete(data) { | ||
401 | /* jshint devel:true */ | ||
402 | var target = grunt.task.current.target; | ||
403 | grunt.config('requireModules.' + target + '.' + grunt.config.escape(data.name), data.included); | ||
404 | }, | ||
405 | |||
406 | baseUrl: 'src/scripts', | ||
407 | mainConfigFile: [ | ||
408 | 'src/scripts/config.js', | ||
409 | ], | ||
410 | |||
411 | wrapShim: true, | ||
412 | keepBuildDir: true, | ||
413 | optimize: 'none', | ||
414 | removeCombined: true, | ||
415 | skipDirOptimize: true, | ||
416 | //generateSourceMaps: true, | ||
417 | |||
418 | dir: 'dist/scripts', | ||
419 | locale: 'en-us', | ||
420 | paths: { | ||
421 | 'defaults': 'empty:', | ||
422 | }, | ||
423 | modules: mpConfig.modules, | ||
424 | }, | ||
302 | } | 425 | } |
426 | }; | ||
303 | } | 427 | } |
304 | 428 | ||
305 | buildList.push('useminPrepare'); // html | 429 | buildList.push('useminPrepare'); // html |
306 | //buildList.push('usemin:views' | 430 | //buildList.push('usemin:views' |
307 | //buildList.push('requirejs'); // script | 431 | if (mpConfig.bower) { |
432 | buildList.push('requirejs'); // script | ||
433 | } | ||
308 | buildList.push('copy:css'); // css | 434 | buildList.push('copy:css'); // css |
309 | if (common.images) { | 435 | if (mpConfig.images) { |
310 | buildList.push('imagemin'); // image | 436 | buildList.push('imagemin'); // image |
311 | buildList.push('svgmin'); // image | 437 | buildList.push('svgmin'); // image |
312 | if (common.useRev) { | 438 | if (mpConfig.useRev) { |
313 | buildList.push('rev:img'); // image | 439 | buildList.push('rev:img'); // image |
314 | } | 440 | } |
315 | } | 441 | } |
316 | //buildList.push('autoprefixer'); // css | 442 | //buildList.push('autoprefixer'); // css |
317 | //buildList.push('concat:requirejs'); // montyPython | ||
318 | buildList.push('concat:generated'); // montyPython | 443 | buildList.push('concat:generated'); // montyPython |
319 | buildList.push('cssmin'); // montyPython | 444 | buildList.push('cssmin'); // montyPython |
320 | //'uglify:dist'); | 445 | //'uglify:dist'); |
321 | buildList.push('copy:dist'); | 446 | buildList.push('copy:dist'); |
322 | //'modernizr'); | 447 | //'modernizr'); |
323 | //buildList.push('uglify:generated'); // montyPython | 448 | //buildList.push('uglify:generated'); // montyPython |
324 | if (common.useRev) { | 449 | if (mpConfig.useRev) { |
325 | buildList.push('rev:dist'); // montyPython | 450 | buildList.push('rev:dist'); // montyPython |
326 | buildList.push('rev:css'); // montyPython | 451 | buildList.push('rev:css'); // montyPython |
452 | buildList.push('revconfig'); // montyPython | ||
453 | } | ||
454 | if (mpConfig.bower) { | ||
455 | buildList.push('concat:requirejs'); // montyPython | ||
456 | } | ||
457 | if (mpConfig.useRev) { | ||
458 | buildList.push('rev:requirejs'); | ||
327 | } | 459 | } |
328 | //buildList.push('revconfig'); // montyPython | ||
329 | //buildList.push('uglify:bower'); // montyPython | 460 | //buildList.push('uglify:bower'); // montyPython |
330 | //buildList.push('uglify:requireconfig'); // montyPython | 461 | //buildList.push('uglify:requireconfig'); // montyPython |
462 | if (mpConfig.useRev && mpConfig.bower) { | ||
331 | //buildList.push('rev:requireconfig'); // montyPython | 463 | //buildList.push('rev:requireconfig'); // montyPython |
464 | } | ||
332 | buildList.push('usemin:html'); // montyPython | 465 | buildList.push('usemin:html'); // montyPython |
333 | buildList.push('usemin:css'); // montyPython | 466 | buildList.push('usemin:css'); // montyPython |
334 | buildList.push('htmlmin'); // montyPython | 467 | buildList.push('htmlmin'); // montyPython | ... | ... |
... | @@ -24,6 +24,7 @@ | ... | @@ -24,6 +24,7 @@ |
24 | "grunt-contrib-jshint": "~0", | 24 | "grunt-contrib-jshint": "~0", |
25 | "grunt-contrib-htmlmin": "~0", | 25 | "grunt-contrib-htmlmin": "~0", |
26 | "grunt-contrib-imagemin": "~0", | 26 | "grunt-contrib-imagemin": "~0", |
27 | "grunt-contrib-requirejs": "~0", | ||
27 | "grunt-rev": "~0", | 28 | "grunt-rev": "~0", |
28 | "grunt-svgmin": "~0", | 29 | "grunt-svgmin": "~0", |
29 | "grunt-usemin": "~2", | 30 | "grunt-usemin": "~2", | ... | ... |
-
Please register or sign in to post a comment