{"id":3471,"date":"2018-03-25T13:43:56","date_gmt":"2018-03-25T13:43:56","guid":{"rendered":"http:\/\/www.rezafaisal.net\/?p=3471"},"modified":"2018-03-25T13:51:58","modified_gmt":"2018-03-25T13:51:58","slug":"how-to-budle-minify-asp-net-core-2-project-using-visual-studio-2017","status":"publish","type":"post","link":"https:\/\/www.rezafaisal.net\/?p=3471","title":{"rendered":"How to Budle &amp; Minify ASP.NET Core 2 Project using Visual Studio 2017"},"content":{"rendered":"<p>Hal pertama yang harus kita ketahui adalah \u201capa itu GULP?\u201d dan \u201capa fungsi GULP?\u201d setelah itu baru kita akan belajar bagaimana menggunakannya. Karena tidak ada gunanya menghabiskanw aktu terlebih dahulu jika kita tidak tahu apa manfaatnya kan?<\/p>\n<p>Masalah yang mungkin sering kita hadapi dalam \u201cweb application development\u201d adalah kadang harus melakukan hal yang sama berulang kali. Bisa melakukan pengulangan task di satu project.\u00a0 Atau melakukan pengulangan setiap memulai membuat project.\u00a0 Sebagai contoh, kita akan membuat banyak file javascript, file CSS, file HTML, kemudian kita perlu melakukan \u201cminifying\u201d semua itu sebelum di upload.<\/p>\n<p>Nah, GULP membantu kita untuk otomatisasi proses-proses taks yang berulang tersebut.<\/p>\n<p>&nbsp;<\/p>\n<p>{<strong><em>What is Gulp<\/em><\/strong>}<\/p>\n<p>Gulp adalah javascript task runner yang membantu kita untuk melakukan otomatisasi task-task berikut ini:<\/p>\n<ul>\n<li>membundle dan minifying library-library dan CSS stylesheet.<\/li>\n<li>Refresh web browser setelah file disimpan.<\/li>\n<li>Mempercepat menjalankan unit test.<\/li>\n<li>Menjalankan code analysis.<\/li>\n<li>Menyalin file yang telah dimodifikasi kedalam output directory.<\/li>\n<\/ul>\n<p>Untuk lebih mengerti apa fungsinya Gulp, maka kita akan melakukan praktek secara langsung.<\/p>\n<p>&nbsp;<\/p>\n<p>{<strong><em>Membuat Project<\/em><\/strong>}<\/p>\n<p>Langkah pertama adalah membuat project ASP.NET Core Web Application pada Visual Studio 2017 dengan nama BundlerMinifier.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"blog01\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog01.jpg\" alt=\"blog01\" width=\"450\" height=\"287\" border=\"0\" \/><\/p>\n<p>Kemudian klik OK, kemudian pada window New ASP.NET Core Web Application pilih Web Application.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"blog02\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog02.jpg\" alt=\"blog02\" width=\"450\" height=\"291\" border=\"0\" \/><\/p>\n<p>Kemudian klik tombol OK.<\/p>\n<p>&nbsp;<\/p>\n<p>{<strong><em>bundleconfig.json<\/em><\/strong>}<\/p>\n<p>Selanjutnya pada project dapat dilihat file bundleconfig.json dengan isi sebagai berikut.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre id=\"codeSnippet\" style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\"><span style=\"color: #008000;\">\/\/ Configure bundling and minification for the project.<\/span>\r\n<span style=\"color: #008000;\">\/\/ More info at https:\/\/go.microsoft.com\/fwlink\/?LinkId=808241<\/span>\r\n[\r\n  {\r\n    <span style=\"color: #006080;\">\"outputFileName\"<\/span>: <span style=\"color: #006080;\">\"wwwroot\/css\/site.min.css\"<\/span>,\r\n    <span style=\"color: #008000;\">\/\/ An array of relative input file paths. Globbing patterns supported<\/span>\r\n    <span style=\"color: #006080;\">\"inputFiles\"<\/span>: [\r\n      <span style=\"color: #006080;\">\"wwwroot\/css\/site.css\"<\/span>\r\n    ]\r\n  },\r\n  {\r\n    <span style=\"color: #006080;\">\"outputFileName\"<\/span>: <span style=\"color: #006080;\">\"wwwroot\/js\/site.min.js\"<\/span>,\r\n    <span style=\"color: #006080;\">\"inputFiles\"<\/span>: [\r\n      <span style=\"color: #006080;\">\"wwwroot\/js\/site.js\"<\/span>\r\n    ],\r\n    <span style=\"color: #008000;\">\/\/ Optionally specify minification options<\/span>\r\n    <span style=\"color: #006080;\">\"minify\"<\/span>: {\r\n      <span style=\"color: #006080;\">\"enabled\"<\/span>: <span style=\"color: #0000ff;\">true<\/span>,\r\n      <span style=\"color: #006080;\">\"renameLocals\"<\/span>: <span style=\"color: #0000ff;\">true<\/span>\r\n    },\r\n    <span style=\"color: #008000;\">\/\/ Optionally generate .map file<\/span>\r\n    <span style=\"color: #006080;\">\"sourceMap\"<\/span>: <span style=\"color: #0000ff;\">false<\/span>\r\n  }\r\n]<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Saat membuat file ini pada VS2017 dapat dilihat tawaran untuk menggunakan extension untuk membantu proses ini seperti pada gambar di bawah.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"blog03\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog03.jpg\" alt=\"blog03\" width=\"450\" height=\"289\" border=\"0\" \/><\/p>\n<p>Klik tawaran tersebut, dan akan ditampilkan tawaran sebagai berikut.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"blog04\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog04.jpg\" alt=\"blog04\" width=\"450\" height=\"315\" border=\"0\" \/><\/p>\n<p>Centak checkbox yang tersedia, kemudian klik Install.\u00a0 Setelah proses installasi selesai, maka VS2017 perlu direstart.<\/p>\n<p>&nbsp;<\/p>\n<p>{<strong><em>Bundling &amp; Minifying<\/em><\/strong>}<\/p>\n<p>Untuk membundle beberapa file, maka file-file tersebut dapat dipilih dengan cara menekan tombol Control+Klik file-file yang diinginkan pada Solution Explorer seperti pada gambar di bawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"blog06\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog06.jpg\" alt=\"blog06\" width=\"450\" height=\"373\" border=\"0\" \/><\/p>\n<p>Hasilnya dapat dilihat pada gambar dibawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"blog07\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog07.jpg\" alt=\"blog07\" width=\"450\" height=\"514\" border=\"0\" \/><\/p>\n<p>Nama file hasil bundling ini adalah jquery-validation-bundle.js, yang berisi gabungan file additional-method.js dan jquery-validate.js.\u00a0 Sedangkan file jquery-validation-bundle.min.js adalah file jquery-validation-bundle.js yang telah diminifying.<\/p>\n<p>&nbsp;<\/p>\n<p>{<strong><em>Bundle on Build<\/em><\/strong>}<\/p>\n<p>Pada project yang kita buat telah tersedia file bundleconfig.json.\u00a0 Dengan memanfaatkan file ini, kita dapat melakukan proses bundle secara otomatis saat proses build selesai dilakukan.\u00a0 Caranya adalah, klik kanan pada file tersebut kemudian pilih Budler &amp; Minifier &gt; Enable bundle on build.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"blog08\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog08.jpg\" alt=\"blog08\" width=\"450\" height=\"285\" border=\"0\" \/><\/p>\n<p>Selanjutnya akan dilakukan proses installasi package yang diperlukan untuk melakukan bundle secara otomatis ini.\u00a0 Nama file-file hasil bundle dan minify sesuai dengan konfigurasi yang telah dilakukan pada file bundleconfig.json.<\/p>\n<p>Sebagai contoh setelah project dibuild, maka dapat dilihat ada proses tambahan, yaitu bundler, seperti yang dilihat pada gambar di bawah ini.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"blog09\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog09.jpg\" alt=\"blog09\" width=\"450\" height=\"103\" border=\"0\" \/><\/p>\n<p>Hasilnya dapat dilihat pada file-file yang ada di Solution Explorer.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"blog10\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog10.jpg\" alt=\"blog10\" width=\"450\" height=\"517\" border=\"0\" \/><\/p>\n<p>Pada gambar di atas dapat dilihat file site.css memiliki file site.min.css yang merupakan hasil minifying.\u00a0 Begitu juga file site.js memiliki file site.min.js.<\/p>\n<p>&nbsp;<\/p>\n<p>{<strong><em>Gulp<\/em><\/strong>}<\/p>\n<p>Jika telah biasa melakukan proses otomatisasi dengan Gulp maka file bundleconfig.json digunakan untuk tujuan tersebut. Caranya adalah dengan klik kanan pada file bundleconfig.json, kemudian pilih Bundles &amp; Minifier &gt; Convert to Gulp.\u00a0 Kemudian akan dilakukan proses installasi package yang diperlukan.\u00a0 Maka dapat dilihat terdapat tambahan file baru yaitu gulpfile.js dengan isi sebagai berikut.<\/p>\n<div id=\"codeSnippetWrapper\" style=\"font-size: 8pt; overflow: auto; cursor: text; font-family: 'Courier New', courier, monospace; width: 97.5%; direction: ltr; text-align: left; margin: 20px 0px 10px; line-height: 12pt; max-height: 200px; background-color: #f4f4f4; border: silver 1px solid; padding: 4px;\">\n<pre style=\"font-size: 8pt; overflow: visible; font-family: 'Courier New', courier, monospace; width: 100%; color: black; direction: ltr; text-align: left; margin: 0em; line-height: 12pt; background-color: #f4f4f4; border-style: none; padding: 0px;\"><span style=\"color: #006080;\">\"use strict\"<\/span>;<\/pre>\n<p><span style=\"color: #0000ff;\">var<\/span> gulp = require(<span style=\"color: #006080;\">&#8220;gulp&#8221;<\/span>),<br \/>\nconcat = require(<span style=\"color: #006080;\">&#8220;gulp-concat&#8221;<\/span>),<br \/>\ncssmin = require(<span style=\"color: #006080;\">&#8220;gulp-cssmin&#8221;<\/span>),<br \/>\nhtmlmin = require(<span style=\"color: #006080;\">&#8220;gulp-htmlmin&#8221;<\/span>),<br \/>\nuglify = require(<span style=\"color: #006080;\">&#8220;gulp-uglify&#8221;<\/span>),<br \/>\nmerge = require(<span style=\"color: #006080;\">&#8220;merge-stream&#8221;<\/span>),<br \/>\ndel = require(<span style=\"color: #006080;\">&#8220;del&#8221;<\/span>),<br \/>\nbundleconfig = require(<span style=\"color: #006080;\">&#8220;.\/bundleconfig.json&#8221;<\/span>);<\/p>\n<p><span style=\"color: #0000ff;\">var<\/span> regex = {<br \/>\ncss: \/\\.css$\/,<br \/>\nhtml: \/\\.(html|htm)$\/,<br \/>\njs: \/\\.js$\/<br \/>\n};<\/p>\n<p>gulp.task(<span style=\"color: #006080;\">&#8220;min&#8221;<\/span>, [<span style=\"color: #006080;\">&#8220;min:js&#8221;<\/span>, <span style=\"color: #006080;\">&#8220;min:css&#8221;<\/span>, <span style=\"color: #006080;\">&#8220;min:html&#8221;<\/span>]);<\/p>\n<p>gulp.task(<span style=\"color: #006080;\">&#8220;min:js&#8221;<\/span>, <span style=\"color: #0000ff;\">function<\/span> () {<br \/>\n<span style=\"color: #0000ff;\">var<\/span> tasks = getBundles(regex.js).map(<span style=\"color: #0000ff;\">function<\/span> (bundle) {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> gulp.src(bundle.inputFiles, { <span style=\"color: #0000ff;\">base<\/span>: <span style=\"color: #006080;\">&#8220;.&#8221;<\/span> })<br \/>\n.pipe(concat(bundle.outputFileName))<br \/>\n.pipe(uglify())<br \/>\n.pipe(gulp.dest(<span style=\"color: #006080;\">&#8220;.&#8221;<\/span>));<br \/>\n});<br \/>\n<span style=\"color: #0000ff;\">return<\/span> merge(tasks);<br \/>\n});<\/p>\n<p>gulp.task(<span style=\"color: #006080;\">&#8220;min:css&#8221;<\/span>, <span style=\"color: #0000ff;\">function<\/span> () {<br \/>\n<span style=\"color: #0000ff;\">var<\/span> tasks = getBundles(regex.css).map(<span style=\"color: #0000ff;\">function<\/span> (bundle) {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> gulp.src(bundle.inputFiles, { <span style=\"color: #0000ff;\">base<\/span>: <span style=\"color: #006080;\">&#8220;.&#8221;<\/span> })<br \/>\n.pipe(concat(bundle.outputFileName))<br \/>\n.pipe(cssmin())<br \/>\n.pipe(gulp.dest(<span style=\"color: #006080;\">&#8220;.&#8221;<\/span>));<br \/>\n});<br \/>\n<span style=\"color: #0000ff;\">return<\/span> merge(tasks);<br \/>\n});<\/p>\n<p>gulp.task(<span style=\"color: #006080;\">&#8220;min:html&#8221;<\/span>, <span style=\"color: #0000ff;\">function<\/span> () {<br \/>\n<span style=\"color: #0000ff;\">var<\/span> tasks = getBundles(regex.html).map(<span style=\"color: #0000ff;\">function<\/span> (bundle) {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> gulp.src(bundle.inputFiles, { <span style=\"color: #0000ff;\">base<\/span>: <span style=\"color: #006080;\">&#8220;.&#8221;<\/span> })<br \/>\n.pipe(concat(bundle.outputFileName))<br \/>\n.pipe(htmlmin({ collapseWhitespace: <span style=\"color: #0000ff;\">true<\/span>, minifyCSS: <span style=\"color: #0000ff;\">true<\/span>, minifyJS: <span style=\"color: #0000ff;\">true<\/span> }))<br \/>\n.pipe(gulp.dest(<span style=\"color: #006080;\">&#8220;.&#8221;<\/span>));<br \/>\n});<br \/>\n<span style=\"color: #0000ff;\">return<\/span> merge(tasks);<br \/>\n});<\/p>\n<p>gulp.task(<span style=\"color: #006080;\">&#8220;clean&#8221;<\/span>, <span style=\"color: #0000ff;\">function<\/span> () {<br \/>\n<span style=\"color: #0000ff;\">var<\/span> files = bundleconfig.map(<span style=\"color: #0000ff;\">function<\/span> (bundle) {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> bundle.outputFileName;<br \/>\n});<\/p>\n<p><span style=\"color: #0000ff;\">return<\/span> del(files);<br \/>\n});<\/p>\n<p>gulp.task(<span style=\"color: #006080;\">&#8220;watch&#8221;<\/span>, <span style=\"color: #0000ff;\">function<\/span> () {<br \/>\ngetBundles(regex.js).forEach(<span style=\"color: #0000ff;\">function<\/span> (bundle) {<br \/>\ngulp.watch(bundle.inputFiles, [<span style=\"color: #006080;\">&#8220;min:js&#8221;<\/span>]);<br \/>\n});<\/p>\n<p>getBundles(regex.css).forEach(<span style=\"color: #0000ff;\">function<\/span> (bundle) {<br \/>\ngulp.watch(bundle.inputFiles, [<span style=\"color: #006080;\">&#8220;min:css&#8221;<\/span>]);<br \/>\n});<\/p>\n<p>getBundles(regex.html).forEach(<span style=\"color: #0000ff;\">function<\/span> (bundle) {<br \/>\ngulp.watch(bundle.inputFiles, [<span style=\"color: #006080;\">&#8220;min:html&#8221;<\/span>]);<br \/>\n});<br \/>\n});<\/p>\n<p><span style=\"color: #0000ff;\">function<\/span> getBundles(regexPattern) {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> bundleconfig.filter(<span style=\"color: #0000ff;\">function<\/span> (bundle) {<br \/>\n<span style=\"color: #0000ff;\">return<\/span> regexPattern.test(bundle.outputFileName);<br \/>\n});<br \/>\n}<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Jika ingin memanfaatkan Gulp pada Visual Studio 2017, maka dapat dilakukan dengan menggunakan Task Runner Explorer.\u00a0 Untuk menaktifkan fitur ini dengan cara pilih View &gt; Other Windows &gt; Taks Runner Explorer.\u00a0 Hasilnya dapat dilihat pada area bawah Visual Studio 2017.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;\" title=\"blog11\" src=\"http:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog11.jpg\" alt=\"blog11\" width=\"450\" height=\"169\" border=\"0\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hal pertama yang harus kita ketahui adalah \u201capa itu GULP?\u201d dan \u201capa fungsi GULP?\u201d setelah itu baru kita akan belajar bagaimana menggunakannya. Karena tidak ada gunanya menghabiskanw aktu terlebih dahulu jika kita tidak tahu apa manfaatnya kan? Masalah yang mungkin&hellip;<\/p>\n","protected":false},"author":1,"featured_media":3466,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[6],"tags":[169,170],"class_list":["post-3471","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-softwaredev","tag-visual-studio","tag-vs-2017"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.rezafaisal.net\/wp-content\/uploads\/2018\/03\/blog07.jpg","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p1sNAL-TZ","_links":{"self":[{"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/posts\/3471","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3471"}],"version-history":[{"count":2,"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/posts\/3471\/revisions"}],"predecessor-version":[{"id":3473,"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/posts\/3471\/revisions\/3473"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=\/wp\/v2\/media\/3466"}],"wp:attachment":[{"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rezafaisal.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}