私はフロントエンド担当で、Grunt (cssmin、少ないコンパイル、uglify、livereload、image minify、watch、lint...) を使用しており、Symfony (小枝のテンプレート化、assetsics) を使用するバックエンドの担当者と仕事を始めました。私が Grunt で行うタスクのほとんどは...)
私たちは一種の Model-View-ViewModel パターンを使用しています (私はバックエンドの専門家ではありません)。
問題は、私たち二人にとって適切なワークフローを見つけることです。
今のところフロントエンドに最適だと思うので、Grunt を使い続けたいと思います。
私の通常のワークフローは、localhost:9000 で Grunt Web サーバーを起動し、livereload でコーディングすることです。
完了したら、「Grunt ビルド」を使用して「プロダクション」タスク (縮小、醜化、画像圧縮など) を実行できます。
問題は Php と Twig のテンプレートにあり、Grunt を使用して Php の Web サーバーを起動することはできず、twig.js を使用してテンプレートをレンダリングすることはできません。
また、サーバー側で Symfony2 フレームワークを処理する必要があります。
livereloading 部分では、スタンドアロン プラグインを使用していますが、ファイルを監視してページをリロードしますが、たとえば、Lessphp は Twitter Bootstrap (フロントエンドで使用しているフレームワーク) と完全に互換性がないため、less コンパイルは機能しません。
何か提案はありますか?場合によっては詳細を追加できます。
できる限り 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'
]);