前端工作流程(Grunt)遇见php后端(Symfony2-Twig)

时间:2013-11-02 10:59:00

标签: php twitter-bootstrap symfony workflow gruntjs

我是前端人物,我使用Grunt(cssmin,较少编译,uglify,livereload,图像缩小,观看,lint ......)然后我开始与使用Symfony的后端人员(twig)合作我用Grunt完成大部分任务的模板,资产......)

我们正在使用一种Model-View-ViewModel模式(我不是后端专家抱歉)。

问题是要为我们双方找到合适的工作流程。 我想和Grunt呆在一起,因为我认为这是最好的前端。

我通常的工作流程是在localhost:9000启动Grunt webserver并使用livereload进行编码,而不是编译。
当我完成后,我可以使用“Grunt build”来执行“生产”任务(缩小,uglify,图像压缩...)

问题来自Php和Twig模板,我不能使用grunt并为Php启动Web服务器而我无法使用twig.js渲染模板,因为它不是我们在生产中使用的模板。
我们还必须处理服务器端的Symfony2框架。

对于livereloading部分我正在使用独立插件,但是监视文件并重新加载页面,但是例如较少的编译不起作用,因为Lessphp与Twitter Bootstrap(我正在使用的框架)不完全兼容末端)

你有什么建议吗?我可以添加详细信息。

我宁愿尽可能地留在Grunt,但如果他完成所有相同的任务或其他解决方案,我可以考虑使用Assetics。

当我只在前端工作时,这是我的实际Gruntfile.js:

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

module.exports = function(grunt) {    
    pkg: grunt.file.readJSON('package.json'),

                src: 'src',
        app: 'app',
        assets: '<%= project.app %>/assets',
        css: [
            '<%= project.src %>/less/bootstrap.less'
        ],
        js: [
            '<%= project.src %>/js/*.js'
        ]
    },

    connect: {
        options: {
            port: 9000,
            hostname: '*'
        },
        livereload: {
            options: {
                middleware: function(connect) {
                    return [lrSnippet, mountFolder(connect, 'app')];
                }
            }
        }
    },

    concat: {
        dev: {
            files: {
                '<%= project.assets %>/js/scripts.min.js': '<%= project.js %>'
            }
        },
        options: {
            stripBanners: true,
            nonull: true,
            banner: '<%= tag.banner %>'
        }
    },

    uglify: {
        options: {
            banner: "<%= tag.banner %>"
        },
        dist: {
            files: {
                '<%= project.assets %>/js/scripts.min.js': '<%= project.js %>'
            }
        }
    },

    less: {
        dev: {
            files: {
                '<%= project.assets %>/css/style.min.css': '<%= project.css %>'
            }
        },
        dist: {
            options: {
                cleancss: true
            },
            files: {
                '<%= project.assets %>/css/style.min.css': '<%= project.css %>'
            }
        }
    },

    imagemin: { // Task
        dynamic: { // Another target
            files: [{
                expand: true, // Enable dynamic expansion
                cwd: '<%= project.src %>/img', // Src matches are relative to this path
                src: ['**/*.{png,jpg,gif}'], // Actual patterns to match
                dest: '<%= project.assets %>/img' // Destination path prefix
            }]
        }
    },

    open: {
        server: {
            path: 'http://localhost:<%= connect.options.port %>'
        }
    },

    watch: {
        concat: {
            files: '<%= project.src %>/js/{,*/}*.js',
            tasks: ['concat:dev', 'jshint']
        },
        less: {
            files: '<%= project.src %>/less/{,*/}*.less',
            tasks: ['less:dev']
        },
        livereload: {
            options: {
                livereload: LIVERELOAD_PORT
            },
            files: [
                '<%= project.app %>/{,*/}*.html',
                '<%= project.assets %>/css/*.css',
                '<%= project.assets %>/js/{,*/}*.js',
                '<%= project.assets %>/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
            ]
        }
    }
};

grunt.registerTask('default', [
    'less:dev',
    'concat:dev',
    'connect:livereload',
    'open',
    'watch'
]);

grunt.registerTask('build', [
    'less:dist',
    'uglify',
    'imagemin'
]);

1 个答案:

答案 0 :(得分:0)

解决:
使用Vagrant,重新加载的唯一重要事项是在树枝模板上设置监视任务。
这是我做的gruntfile.js编辑:

livereload: {
                options: {
                    livereload: LIVERELOAD_PORT
                },
                files: [
                    ...
                    '<%= project.views %>/{,*/}*.html.twig',
                    '...
                ]
            }

然后在来宾计算机上设置一个不同的端口:

var LIVERELOAD_PORT = 35728;

然后使用正确的端口(来自livereload chrome扩展程序正在侦听的位置)从您的guest虚拟机向您的主机设置Vagrantfile的转发(35729)

config.vm.network :forwarded_port, guest: 35728, host: 35729

一切都像魅力一样。