Gruntfileを最適化する

はじめに



Gruntがあなたにずっお新しい蚀葉であるなら、最初にChris Coyers の蚘事「Gruntのようなものはくお重いず思う人々のためのGrunt」を読むこずができたす。 クリスからの玹介の埌、あなたはあなた自身のGruntプロゞェクトを持ち、Gruntが私たちに提䟛するすべおの機䌚をすでに味わっおいるでしょう。



この蚘事では、Gruntの倚数のプラグむンをプロゞェクトに远加するのではなく、アセンブリ自䜓を䜜成するプロセスに焊点を圓おたす。 Gruntでの䜜業の次の偎面で実践的なスキルを習埗したす。







叙情的な䜙談Gruntは、タスクの実行に䜿甚できる倚くのデバむスの1぀にすぎたせん。 Gulpがあなたにぎったりなら、 すごい  この蚘事で説明されおいる機胜を確認した埌でも、ビルド甚の独自のツヌルセットを䜜成したい堎合は、問題ありたせん この蚘事でGruntをレビュヌしたす。Gruntは、すでに倚数のナヌザヌがいる゚コシステムであるためです。



Gruntfileの敎理



倚くのGruntプラグむンをプラグむンするか、Gruntfileに倚くのタスクを蚘述しようずするず、すぐに面倒でサポヌトが難しくなりたす。 幞いなこずに、この特定の問題に特化したプラグむンがいく぀かありたす。Gruntfileをきれいで敎然ずした倖芳に戻したす。



最適化前のGruntfile



これは、最適化前のGruntfileの倖芳です。



module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), concat: { dist: { src: ['src/js/jquery.js','src/js/intro.js', 'src/js/main.js', 'src/js/outro.js'], dest: 'dist/build.js', } }, uglify: { dist: { files: { 'dist/build.min.js': ['dist/build.js'] } } }, imagemin: { options: { cache: false }, dist: { files: [{ expand: true, cwd: 'src/', src: ['**/*.{png,jpg,gif}'], dest: 'dist/' }] } } }); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-imagemin'); grunt.registerTask('default', ['concat', 'uglify', 'imagemin']); };
      
      





今なら、「おい それはもっず悪いだろうず思った 維持するこずはかなり可胜です」、それからおそらくあなたは正しいでしょう。 簡単にするために、カスタマむズなしで3぀のプラグむンのみを远加したした。 この蚘事で「戊闘」プロゞェクトで䜿甚される実際のGruntfileの䟋を提䟛する堎合、無限のスクロヌルが必芁になりたす。 さお、それに぀いお䜕ができるか芋おみたしょう



プラグむンを自動ロヌドする





ヒント load-grunt-configにはload-grunt-tasksが含たれおいるので、読みたくない堎合はこの蚘事をスキップしお、気持ちを害するこずはありたせん。



新しいプラグむンをプロゞェクトに远加する堎合は、プロゞェクトの䟝存関係ずしおpackage.jsonに远加し、Gruntfileにロヌドする必芁がありたす。 プラグむン「 grunt-contrib-concat 」の堎合、次のようになりたす。



 // tell Grunt to load that plugin grunt.loadNpmTasks('grunt-contrib-concat');
      
      





npmを䜿甚しおプラグむンを削陀し、package.jsonを線集したが、Gruntfileの曎新を忘れるず、アセンブリが壊れたす。 小さなプラグむン「load-grunt-tasks」が私たちの助けになりたす。



ここたでは、Gruntプラグむンを手動でロヌドする必芁がありたした。



 grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-imagemin');
      
      





load-gurnt-tasksを䜿甚するず、コヌドの量を1行に枛らすこずができたす。



 require('load-grunt-tasks')(grunt);
      
      





プラグむンを接続するず、package.jsonが分析され、プラグむンの䟝存関係ツリヌが決定され、自動的にロヌドされたす



分割構成ファむル



load-grunt-tasksは、Gruntfileのサむズず耇雑さを軜枛したすが、倧芏暡なアプリケヌションを構築する堎合、ファむルサむズは匕き続き着実に増加したす。 この時点で、新しいプラグむンload-grunt-configが登堎したす Gruntfileをタスクに分割できたす。 さらに、load-grunt-tasksずその機胜をカプセル化したす



重芁 Gruntfileを共有するこずは、垞に最適な゜リュヌションずは限りたせん。 タスク間で関連する蚭定が倚数ある堎合Gruntfileの暙準化など、もう少し泚意する必芁がありたす。



「load-grunt-config」プラグむンを䜿甚するず、Gruntfileは次のようになりたす。



 module.exports = function(grunt) { require('load-grunt-config')(grunt); };
      
      





はい、そうです これがファむル党䜓です しかし、構成ファむルは今どこにありたすか



ディレクトリを䜜成しおgruntずいう名前を付けたす。 Gruntfileがあるディレクトリで実行しおみたしょう。 デフォルトでは、プラグむンは、䜿甚するタスクで指定された名前でこのディレクトリのファむルを接続したす。 プロゞェクトの構造は次のようになりたす。



 - myproject/ -- Gruntfile.js -- grunt/ --- concat.js --- uglify.js --- imagemin.js
      
      





それでは、各タスクの蚭定を個別のファむルに蚭定したしょうこれは、Gruntfileからの通垞のコピヌペヌストであるこずがわかりたす。



grunt / concat.js



 module.exports = { dist: { src: ['src/js/jquery.js', 'src/js/intro.js', 'src/js/main.js', 'src/js/outro.js'], dest: 'dist/build.js', } };
      
      





grunt / uglify.js



 module.exports = { dist: { files: { 'dist/build.min.js': ['dist/build.js'] } } };
      
      





うなり声/ imagemin.js



 module.exports = { options: { cache: false }, dist: { files: [{ expand: true, cwd: 'src/', src: ['**/*.{png,jpg,gif}'], dest: 'dist/' }] } };
      
      





JavaScript構成ブロックが自分のものでない堎合、load-grunt-tasksではYAMLたたはCoffeeScript構文を䜿甚するこずもできたす。 YAMLを䜿甚しお最埌に必芁なファむルを曞きたしょう。 これぱむリアスファむルになりたす。 これは、すべおのタスク゚むリアスが登録されおいるファむルです。 これは、registerTask関数を呌び出す前に行う必芁のあるこずです。 実際のファむルは次のずおりです。



grunt / aliases.yaml



 default: - 'concat' - 'uglify' - 'imagemin'
      
      





以䞊です コン゜ヌルで次のコマンドを実行したす。



 $ grunt
      
      





すべおが正垞に機胜した堎合、実際、Gruntの「デフォルト」タスクを䜜成したした。 関連ファむルで指定した順序ですべおのプラグむンを実行したす。 さお、Gruntfileを3行のコヌドに枛らしたので、どのタスクでも行を修正するためにGruntfileに再床行く必芁はありたせん。これは完了です。 しかし、やめおください、それはただ非垞に遅いです ぀たり、すべおが集たるたでに倚くの時間を埅たなければなりたせん。 これを改善する方法を芋おみたしょう



組立時間を最小化



Webアプリケヌションのダりンロヌド速床ず起動時間は、ビルドに必芁な時間よりも重芁ですが、速床が遅いず、倚くの䞍䟿が生じたす。 これにより、 grunt-contrib-watchなどのプラグむンを䜿甚しおアプリケヌションを自動的にアセンブルするプロセス、たたはGitぞのコミット埌にビルドするプロセスが非垞に「困難」になりたす-これは実際の拷問に倉わりたす。 芁するに、アセンブリの実行が速いほど、ワヌクフロヌはより良く、より速くなりたす。 プロダクションアセンブリが10分以䞊かかる堎合、極端な堎合にのみそれに頌り、組み立おられる間、コヌヒヌを飲みに行きたす。 これは生産性の䜎䞋です。 しかし、絶望しないでください、私たちには違いを生むこずができる䜕かがありたす。



倉曎されたもののみを収集したす grunt-newer



ああ、この感芚は、プロゞェクト党䜓を組み立おた埌、いく぀かのファむルを倉曎し、すべおが再び組み立おられるたで2回目のラりンドで埅機する必芁がある堎合です。 src / img /ディレクトリ内の1぀の画像を倉曎する䟋を芋おみたしょう-この堎合、imageminを実行しお画像の最適化を実行するのは理にかなっおいたすが、1぀の画像に察しおのみです。もちろん、この堎合はconcatずuglifyを再起動するだけです貎重なプロセッサ時間の無駄。



もちろん、い぀でも実行できたす
 $ grunt imagemin
      
      



暙準ではなくコン゜ヌルから
 $ grunt
      
      



。 これにより、必芁なタスクのみを実行できたすが、より合理的な゜リュヌションがありたす。 それはうなり声の新しいず呌ばれたす。



Grunt-newerにはロヌカルキャッシュがあり、そこに倉曎されたファむルに関する情報を保存し、そのファむルに察しおのみタスクを実行したす。 接続方法を芋おみたしょう。



aliases.yamlを芚えおいたすか 倉えたしょう



 default: - 'concat' - 'uglify' - 'imagemin'
      
      





これに



 default: - 'newer:concat' - 'newer:uglify' - 'newer:imagemin'
      
      





簡単に蚀えば、タスクのいずれかにプレフィックス「newer」を远加するだけです。最初にgrunt-newerプラグむンを介しお枡す必芁がありたす。このプラグむンは、タスクを実行するファむルず実行しないファむルを決定したす。



タスクを䞊行しお実行する grunt-concurrent



grunt-concurrentは、互いに独立した倚くのタスクがあり、倚くの時間がかかる堎合に非垞に圹立぀プラグむンです。 プロセッサのコアを䜿甚し、それらのタスクを䞊列化したす。



特にクヌルなのは、このプラグむンの構成が非垞に簡単なこずです。 load-grunt-configを䜿甚する堎合は、slを䜜成したす。 ファむル



grunt / concurrent.js



 module.exports = { first: ['concat'], second: ['uglify', 'imagemin'] };
      
      





最初最初ず2番目2番目のキュヌの䞊列実行を蚭定するだけです。 最初の段階では、「concat」タスクのみを実行したす。 2番目の段階では、uglifyずimageminを実行したす。 これらは盞互に独立しおおり、䞊行しお実行されるため、実行時間は䞡方のタスクに共通です。



grunt-concurrentプラグむンを介しお凊理されるように、デフォルトタスクの゚むリアスを倉曎したした。 倉曎されたaliases.yamlファむルは次のずおりです。



 default: - 'concurrent:first' - 'concurrent:second'
      
      





ここでGruntアセンブリを再起動するず、コンカレントプラグむンはたずconcatタスクを開始し、次に異なるプロセッサコアで2぀のスレッドを䜜成しお、imageminずuglifyが䞊行しお動䜜するようにしたす。 かっこいい



簡単なヒント 単玔な䟋では、うなり声の同時発生がビルドを著しく高速化する可胜性は非垞に䜎いです。 その理由は、Gruntむンスタンスに远加のスレッドを実行するためのオヌバヌヘッドオヌバヌヘッドです。 私の蚈算から刀断するず、少なくずも300ms /ストリヌムかかりたす。



アセンブリにはどれくらい時間がかかりたしたか 時間のうなり声が助けになりたす



さお、これですべおのタスクが最適化されたした。各タスクにかかる時間を知るこずは非垞に䟿利です。 幞いなこずに、この仕事を完璧に行うプラグむンがありたす。



time-gruntは叀兞的な意味でのプラグむンではなくloadNpmTask経由では接続したせん、むしろload-grunt-configなどの「盎接」接続するプラグむンを指したす。 load-grunt-configの堎合ず同じ方法で、このプラグむンの接続をGruntfileに远加したす。 Gruntfileは次のようになりたす。



 module.exports = function(grunt) { // measures the time each task takes require('time-grunt')(grunt); // load grunt config require('load-grunt-config')(grunt); };
      
      





倱望をおallびしたすが、それだけです-コン゜ヌルからGruntを再起動しおみおください。各タスクおよびアセンブリ党䜓に぀いお、ランタむムに関する適切にフォヌマットされた情報が衚瀺されるはずです。







自動譊報システム



すべおのタスクを迅速に実行し、自動アセンブル぀たり、grunt-contrib-watchプラグむンたたはコミット埌のフックの䜿甚によるファむルぞの倉曎の远跡の機胜を提䟛する、最適化されたコレクタヌが甚意できたので、システムを持぀こずは玠晎らしいこずですそれはあなたの新しいビルドが䜿甚する準備ができたずき、たたは䜕かがうたくいかないずきあなたに譊告するこずができるでしょうか grunt-notifyに䌚いたす。



デフォルトでは、grunt-notifyは、Gruntがスロヌするすべおの゚ラヌず譊告に察しお自動アラヌトを提䟛したす。 これを行うには、Mac OS XたたはWindows甚のGrowl、Mountain LionおよびMavericksのNotification Center、Notify-sendなど、OSにむンストヌルされおいる譊告システムを䜿甚できたす。 この機胜を取埗するために必芁なのは、npmリポゞトリからプラグむンをむンストヌルし、Gruntfileに接続するこずだけです䞊蚘のようにgrunt-load-configを䜿甚する堎合、このステップは自動化されたす。



オペレヌティングシステムに応じおプラグむンがどのように機胜するかを次に瀺したす。







゚ラヌず譊告に加えお、最埌のタスクの埌に開始するように構成したしょう。

grunt-contrib-configを䜿甚しおファむル間でタスクを分離するこずを前提ずしおいたす。 必芁なファむルは次のずおりです。



grunt / notify.js



 module.exports = { imagemin: { options: { title: 'Build complete', // optional message: '<%= pkg.name %> build finished successfully.' //required } } } }
      
      





構成のハッシュキヌによっお、grunt-notifyに接続するタスクの名前が決たりたす。 この䟋では、imageminタスク実行するリストの最埌のタスクが完了した盎埌にアラヌトを生成したす。



そしお結論ずしお



この蚘事で説明したように、最初からすべおを行った堎合、䞊列化ず遞択的凊理により非垞に高速で、非垞に高速で組織化されたコレクタヌの誇りのある所有者であるず考えるこずができたす。 たた、アセンブリの結果に぀いおは、慎重に通知されるこずを忘れないでください



Gruntの改善に圹立぀その他の興味深い゜リュヌション、たたは䟿利なプラグむンを芋぀けた堎合は、お知らせください それたでの間、ビルドは成功したした



翻蚳者から


私はこの蚘事をできるだけオリゞナルに近い圢に翻蚳しようずしたしたが、いく぀かの堎所で「ロシア語で聞こえる」ようにいく぀かの軜薄さを䜜りたした。 英語の文章を䜜成するすべおの順番ず方法がロシア語にうたく適合するわけではありたせん。 私はあなたが理解しおこれを扱うこずを本圓に願っおいたす。



蚘事をお楜しみください。 建蚭的な批刀ず改善の提案を聞いおうれしいです。 コメントも歓迎したす



All Articles