Skip to content
This repository has been archived by the owner on Mar 26, 2018. It is now read-only.

Multiple files to compile #210

Open
talvesmachado opened this issue Feb 6, 2014 · 2 comments
Open

Multiple files to compile #210

talvesmachado opened this issue Feb 6, 2014 · 2 comments

Comments

@talvesmachado
Copy link

Hi, In my project (a NodeJS phone Controller ==> desktop) i need to deal with two mains html files.
index.html => desktop render
mobile.html => mobile render

Everything works fine in the app folder, but the compilation create problems.
Here is my folder structure (just the interresting things)

myApplicationFolder/
|--Gruntfile.js 
|--app/
|   |--scripts/
|   |   |--collections/
|   |   |--helpers/
|   |   |--models/
|   |   |--routes/
|   |   |--templates/
|   |   |--vendor/
|   |   |--views/
|   |   |--main.js
|   |   |--mobile.js
|   |--index.html
|   |--mobile.html
|--dist/
|--node_modules/

index.html:

    <body>
        <div id="app-wrapper">

        </div>

        <!-- build:js scripts/main.js -->
        <script data-main="scripts/main" src="bower_components/requirejs/require.js"></script>
        <!-- endbuild -->
</body>
</html>

mobile.html:

    <body>
        <div id="app-wrapper">

        </div>

        <!-- build:js scripts/mobile.js -->
        <script data-main="scripts/mobile" src="bower_components/requirejs/require.js"></script>
        <!-- endbuild -->
</body>
</html>

Actually i don't know what to change in ma grunt configartion file :

'use strict';
var LIVERELOAD_PORT = 35729;
var SERVER_PORT = 9000;
var lrSnippet = require('connect-livereload')({
    port: LIVERELOAD_PORT
});
var mountFolder = function(connect, dir) {
    return connect.static(require('path').resolve(dir));
};

// # Globbing
// for performance reasons we're only matching one level down:
// 'test/spec/{,*/}*.js'
// use this if you want to match all subfolders:
// 'test/spec/**/*.js'
// templateFramework: 'lodash'

module.exports = function(grunt) {
    // show elapsed time at the end
    require('time-grunt')(grunt);
    // load all grunt tasks
    require('load-grunt-tasks')(grunt);

    // configurable paths
    var yeomanConfig = {
        app: 'app',
        dist: 'dist'
    };

    grunt.initConfig({
        yeoman: yeomanConfig,
        watch: {
            options: {
                nospawn: true,
                livereload: true
            },
            coffee: {
                files: ['<%= yeoman.app %>/scripts/{,*/}*.coffee'],
                tasks: ['coffee:dist']
            },
            coffeeTest: {
                files: ['test/spec/{,*/}*.coffee'],
                tasks: ['coffee:test']
            },
            livereload: {
                options: {
                    livereload: LIVERELOAD_PORT
                },
                files: [
                    '<%= yeoman.app %>/*.html',
                    '{.tmp,<%= yeoman.app %>}/styles/{,*/}*.css',
                    '{.tmp,<%= yeoman.app %>}/scripts/{,*/}*.js',
                    '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}',
                    '<%= yeoman.app %>/scripts/templates/*.{ejs,mustache,hbs}',
                    'test/spec/**/*.js'
                ]
            },
            jst: {
                files: [
                    '<%= yeoman.app %>/scripts/templates/*.ejs'
                ],
                tasks: ['jst']
            },
            test: {
                files: ['<%= yeoman.app %>/scripts/{,*/}*.js', 'test/spec/**/*.js'],
                tasks: ['test:true']
            }
        },
        connect: {
            options: {
                port: SERVER_PORT,
                // change this to '0.0.0.0' to access the server from outside
                hostname: 'localhost'
            },
            livereload: {
                options: {
                    middleware: function(connect) {
                        return [
                            lrSnippet,
                            mountFolder(connect, '.tmp'),
                            mountFolder(connect, yeomanConfig.app)
                        ];
                    }
                }
            },
            test: {
                options: {
                    port: 9001,
                    middleware: function(connect) {
                        return [
                            lrSnippet,
                            mountFolder(connect, '.tmp'),
                            mountFolder(connect, 'test'),
                            mountFolder(connect, yeomanConfig.app)
                        ];
                    }
                }
            },
            dist: {
                options: {
                    middleware: function(connect) {
                        return [
                            mountFolder(connect, yeomanConfig.dist)
                        ];
                    }
                }
            }
        },
        open: {
            server: {
                path: 'http://localhost:<%= connect.options.port %>'
            },
            test: {
                path: 'http://localhost:<%= connect.test.options.port %>'
            }
        },
        clean: {
            dist: ['.tmp', '<%= yeoman.dist %>/*'],
            server: '.tmp'
        },
        jshint: {
            options: {
                jshintrc: '.jshintrc',
                reporter: require('jshint-stylish')
            },
            all: [
                'Gruntfile.js',
                '<%= yeoman.app %>/scripts/{,*/}*.js',
                '!<%= yeoman.app %>/scripts/vendor/*',
                'test/spec/{,*/}*.js'
            ]
        },
        mocha: {
            all: {
                options: {
                    run: true,
                    urls: ['http://localhost:<%= connect.test.options.port %>/index.html']
                }
            }
        },
        coffee: {
            dist: {
                files: [{
                    // rather than compiling multiple files here you should
                    // require them into your main .coffee file
                    expand: true,
                    cwd: '<%= yeoman.app %>/scripts',
                    src: '{,*/}*.coffee',
                    dest: '.tmp/scripts',
                    ext: '.js'
                }]
            },
            test: {
                files: [{
                    expand: true,
                    cwd: 'test/spec',
                    src: '{,*/}*.coffee',
                    dest: '.tmp/spec',
                    ext: '.js'
                }]
            }
        },
        requirejs: {
            dist: {
                // Options: https://github.com/jrburke/r.js/blob/master/build/example.build.js
                options: {
                    baseUrl: '<%= yeoman.app %>/scripts',
                    optimize: 'none',
                    paths: {
                        'templates': '../../.tmp/scripts/templates',
                        'jquery': '../../app/bower_components/jquery/jquery',
                        'underscore': '../../app/bower_components/underscore/underscore',
                        'backbone': '../../app/bower_components/backbone/backbone',
                        'snap': '../bower_components/Snap.svg/dist/snap.svg-min',
                        'TweenMax': '../bower_components/greensock-js/src/uncompressed/TweenMax',
                    },
                    // TODO: Figure out how to make sourcemaps work with grunt-usemin
                    // https://github.com/yeoman/grunt-usemin/issues/30
                    //generateSourceMaps: true,
                    // required to support SourceMaps
                    // http://requirejs.org/docs/errors.html#sourcemapcomments
                    preserveLicenseComments: false,
                    useStrict: true,
                    wrap: true
                    //uglify2: {} // https://github.com/mishoo/UglifyJS2
                }
            }
        },
        useminPrepare: {
            html: '<%= yeoman.app %>/index.html',
            options: {
                dest: '<%= yeoman.dist %>'
            },
        },
        usemin: {
            html: ['<%= yeoman.dist %>/{,*/}*.html'],
            css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
            options: {
                dirs: ['<%= yeoman.dist %>']
            }
        },
        imagemin: {
            dist: {
                files: [{
                    expand: true,
                    cwd: '<%= yeoman.app %>/images',
                    src: '{,*/}*.{png,jpg,jpeg}',
                    dest: '<%= yeoman.dist %>/images'
                }]
            }
        },
        cssmin: {
            dist: {
                files: {
                    '<%= yeoman.dist %>/styles/main.css': [
                        '.tmp/styles/{,*/}*.css',
                        '<%= yeoman.app %>/styles/{,*/}*.css'
                    ]
                }
            }
        },
        htmlmin: {
            dist: {
                options: {
                    /*removeCommentsFromCDATA: true,
                    // https://github.com/yeoman/grunt-usemin/issues/44
                    //collapseWhitespace: true,
                    collapseBooleanAttributes: true,
                    removeAttributeQuotes: true,
                    removeRedundantAttributes: true,
                    useShortDoctype: true,
                    removeEmptyAttributes: true,
                    removeOptionalTags: true*/
                },
                files: [{
                    expand: true,
                    cwd: '<%= yeoman.app %>',
                    src: '*.html',
                    dest: '<%= yeoman.dist %>'
                }]
            }
        },
        copy: {
            dist: {
                files: [{
                        expand: true,
                        dot: true,
                        cwd: '<%= yeoman.app %>',
                        dest: '<%= yeoman.dist %>',
                        src: [
                            '*.{ico,txt}',
                            '.htaccess',
                            'images/{,*/}*.{webp,gif,svg}',
                            'styles/fonts/{,*/}*.*',
                            'server.js',
                        ]
                    }, {
                        expand: true,
                        dot: true,
                        cwd: 'node_modules',
                        dest: '<%= yeoman.dist %>/node_modules',
                        src: [
                            'socket.io/{,*/}*.*',
                            'md5/{,*/}*.*',
                        ]
                    },

                ]
            }
        },
        bower: {
            all: {
                rjsConfig: '<%= yeoman.app %>/scripts/main.js'
            }
        },
        jst: {
            options: {
                amd: true
            },
            compile: {
                files: {
                    '.tmp/scripts/templates.js': ['<%= yeoman.app %>/scripts/templates/*.ejs']
                }
            }
        },
        rev: {
            dist: {
                files: {
                    src: [
                        '<%= yeoman.dist %>/scripts/{,*/}*.js',
                        '<%= yeoman.dist %>/styles/{,*/}*.css',
                        '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp}',
                        '/styles/fonts/{,*/}*.*',
                    ]
                }
            }
        }
    });

    grunt.registerTask('createDefaultTemplate', function() {
        grunt.file.write('.tmp/scripts/templates.js', 'this.JST = this.JST || {};');
    });

    grunt.registerTask('server', function() {
        grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
        grunt.task.run(['serve:' + target]);
    });

    grunt.registerTask('serve', function(target) {
        if (target === 'dist') {
            return grunt.task.run(['build', 'open:server', 'connect:dist:keepalive']);
        }

        if (target === 'test') {
            return grunt.task.run([
                'clean:server',
                'coffee',
                'createDefaultTemplate',
                'jst',
                'connect:test',
                'open:test',
                'watch:livereload'
            ]);
        }

        grunt.task.run([
            'clean:server',
            'coffee:dist',
            'createDefaultTemplate',
            'jst',
            'connect:livereload',
            'open:server',
            'watch'
        ]);
    });

    grunt.registerTask('test', function(isConnected) {
        isConnected = Boolean(isConnected);
        var testTasks = [
            'clean:server',
            'coffee',
            'createDefaultTemplate',
            'jst',
            'connect:test',
            'mocha',
            'watch:test'
        ];

        if (!isConnected) {
            return grunt.task.run(testTasks);
        } else {
            // already connected so not going to connect again, remove the connect:test task
            testTasks.splice(testTasks.indexOf('connect:test'), 1);
            return grunt.task.run(testTasks);
        }
    });

    grunt.registerTask('build', [
        'clean:dist',
        'coffee',
        'createDefaultTemplate',
        'jst',
        'useminPrepare',
        'requirejs',
        'imagemin',
        'htmlmin',
        'concat',
        'cssmin',
        'uglify',
        'copy',
        'rev',
        'usemin'
    ]);

    grunt.registerTask('default', [
        'jshint',
        'test',
        'build'
    ]);
};

I pass the different test that i made, they went all wrong...
So if you know how to configure the grunt file for my structure, Thanks ;)

@revathskumar
Copy link
Member

Explain but the compilation create problems.

@talvesmachado
Copy link
Author

I've made some change and now my project compile what i want.
So first of all, i'va added in the in the useminPrepare function my other file to compile :

useminPrepare: {
            html: ['<%= yeoman.app %>/index.html','<%= yeoman.app %>/mobile.html',],
            options: {
                dest: '<%= yeoman.dist %>'
            },
        },

After that, i change the require task because he was compiling everything in main.js 👎

So I've change the require task like that :

var requirejsOptions = {};

    requirejsOptions['desktop'] = {
        "options": {

            baseUrl: '<%= yeoman.app %>/scripts',
            optimize: 'none',
            name: 'main',
            paths: {
                'templates': '../../.tmp/scripts/templates',
                'jquery': '../../app/bower_components/jquery/jquery',
                'underscore': '../../app/bower_components/underscore/underscore',
                'backbone': '../../app/bower_components/backbone/backbone',
                'snap': '../../app/bower_components/Snap.svg/dist/snap.svg-min',
                'TweenMax': '../../app/bower_components/greensock-js/src/uncompressed/TweenMax',
            },
            preserveLicenseComments: false,
            useStrict: true,
            wrap: true,
            out: '<%= yeoman.dist %>/scripts/main.js'
        }
    };
    requirejsOptions['mobile'] = {
        "options": {

            baseUrl: '<%= yeoman.app %>/scripts',
            optimize: 'none',
            name: 'mobile',
            paths: {
                'templates': '../../.tmp/scripts/templates',
                'jquery': '../../app/bower_components/jquery/jquery',
                'underscore': '../../app/bower_components/underscore/underscore',
                'backbone': '../../app/bower_components/backbone/backbone',
                'snap': '../../app/bower_components/Snap.svg/dist/snap.svg-min',
                'TweenMax': '../../app/bower_components/greensock-js/src/uncompressed/TweenMax',
            },
            preserveLicenseComments: false,
            useStrict: true,
            wrap: true,
            out: '<%= yeoman.dist %>/scripts/mobile.js',
        }
    };

and the requirejs task function :

requirejs: requirejsOptions,

If it can help ;)

It works fine, but it imports all my templates jst in each js (main.js & mobile.js)
I tried to make sub-directories in the templates folder like :

templates/
   |--desktop/
   |--mobile/

I've change all the configuration but when i build require import in my classes causes errors (he can't find desktop in the .tmp folder etc), not when i use serve... strange

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants