generator-backbone icon indicating copy to clipboard operation
generator-backbone copied to clipboard

Multiple files to compile

Open talvesmachado opened this issue 11 years ago • 2 comments

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 ;)

talvesmachado avatar Feb 06 '14 14:02 talvesmachado

Explain but the compilation create problems.

revathskumar avatar Feb 07 '14 18:02 revathskumar

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 :-1:

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

talvesmachado avatar Feb 10 '14 17:02 talvesmachado