{"id":3605,"date":"2015-04-15T12:15:04","date_gmt":"2015-04-15T09:15:04","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=3605"},"modified":"2015-04-11T16:21:16","modified_gmt":"2015-04-11T13:21:16","slug":"pack-it-up-pack-it-in","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/","title":{"rendered":"Pack It Up, Pack It In"},"content":{"rendered":"<p>Let me begin with a list of usual suspects up to no good in the browser:<\/p>\n<ul>\n<li><a href=\"http:\/\/coffeescript.org\/\" target=\"_blank\">CoffeeScript<\/a> (or <a href=\"http:\/\/www.typescriptlang.org\/\" target=\"_blank\">TypeScript<\/a>)<\/li>\n<li><a href=\"http:\/\/lesscss.org\/\" target=\"_blank\">Less<\/a> (or <a href=\"http:\/\/sass-lang.com\/\" target=\"_blank\">Sass<\/a>\/Scss)<\/li>\n<li><a href=\"http:\/\/jade-lang.com\/\" target=\"_blank\">Jade<\/a> (or <a href=\"http:\/\/handlebarsjs.com\/\" target=\"_blank\">Handlebars<\/a>, <a href=\"https:\/\/mustache.github.io\/\" target=\"_blank\">Mustache<\/a>)<\/li>\n<\/ul>\n<p>I mean, because, you know, writing in HTML\/JS\/CSS is so 2000-late.<\/p>\n<p>All this 74 72 61 6e s p i l a t i o n.<\/p>\n<p>A typical layout. Something like this:<\/p>\n<pre class=\"brush: perl; title: ; notranslate\" title=\"\">\r\nassets\/\r\n    css\/\r\n    img\/\r\n    js\/\r\n    html\/\r\n    index.html\r\nsrc\/\r\n    coffee\/\r\n    img\/\r\n    jade\/\r\n    less\/\r\nGruntfile.js \/\/ or gulpfile.js\r\npackage.json\r\nserver.js\r\n\/\/ ...\r\n<\/pre>\n<p>You\u2019re using <a href=\"http:\/\/gruntjs.com\/\" target=\"_blank\">Grunt<\/a> or its less-loquacious cousin, <a href=\"http:\/\/gulpjs.com\/\" target=\"_blank\">Gulp<\/a> or \u2014 mind-blown \u2014 <a href=\"https:\/\/www.npmjs.com\/\" target=\"_blank\">npm<\/a>(!) for builds\u2026 I mean running tasks\u2026 I mean running build tasks.\u00a0Did I mention you\u2019re modularizing with <a href=\"http:\/\/www.commonjs.org\/\" target=\"_blank\">CommonJS<\/a>? Well, in this blog post you are. We\u2019ll forego tests for brevity\u2019s sake. Because, of course you\u2019re testing\u2026<\/p>\n<p>The cadre of \/G(runt|ulp)\/ transpiler plugins: contrib-coffee, contrib-less, contrib-jade, gulp-coffee, gulp-less, gulp-jade \u2014 configured. I said CommonJS, didn\u2019t I? You might be tempted to use Browerserify, so multiply things by ^ify.<\/p>\n<p>And you don\u2019t want to repeat yourself. So you DRY-ly declare the chain of project directories in your Gruntfile.js or gulpfile.js.<\/p>\n<pre class=\"brush: perl; title: ; notranslate\" title=\"\">\r\nvar src = &#x5B;__dirname, 'src'].join('\/');\r\nvar srcCss = &#x5B;src, 'css'].join('\/');\r\nvar srcHtml = &#x5B;src, 'html'].join('\/');\r\nvar srcImg = &#x5B;src, 'img'].join('\/');\r\nvar srcJs = &#x5B;src, 'js'].join('\/');\r\n \r\nvar dest = &#x5B;__dirname, 'assets'].join('\/');\r\n\/\/ ...\r\n<\/pre>\n<p>\u201cLike I said, you don\u2019t want to repeat yourself,\u201d he said, dryly.<\/p>\n<p>And maybe you want some hot\/live reloading? Maybe you didn\u2019t, but in this blog post, you do. Some client frameworks are more naturally suited than others (React and Flux) but at any rate, you orchestrate the delicate swan dance of watchers and reloaders in your package.json and build file.<\/p>\n<p>So you\u2019ve got at least six packages declared \u2014 at least \u2014 for this scheme, and at least a hundred well-formatted lines in your build file for the plug-ins alone, plus variable declarations. That\u2019s a lot of wiring for a modern web app dev environment.<\/p>\n<p>What if I told you you could get all of that in a cohesive manner? In a framework that will take care of all that wiring for you? Enter <a href=\"http:\/\/webpack.github.io\/\" target=\"_blank\">webpack<\/a>! Gone are the variable declarations! (Mostly) gone are the lengthy plug-in configurations, the watch and reload courtship! Imagine all the digital trees saved!<\/p>\n<h3>webpack<\/h3>\n<p><a href=\"http:\/\/webpack.github.io\/\" target=\"_blank\">webpack<\/a> is a module builder and runtime module loader (like RequireJS). It\u2019s not RequireJS. It\u2019s not CommonJS. But it understands both. It will bundle both. In its fundamental design, however, what makes webpack different is: <strong>everything is a bundle<\/strong>. Wait.. CSS? Yep. Fonts? Uh-huh. HTML templates? You got it. Images? Alright, now you\u2019re just being annoying.<\/p>\n<p>Yes, you will be \u201crequire\u201d-ing images. Of all the resources that become bundles themselves, in the webpack way of things, images are maybe the strangest, because their usage at runtime are in languages (HTML, and CSS by way of) that, in their DNA, expect to be served URL-y. So there are design considerations.<\/p>\n<p>For one, anything beyond a <strong>truly single-page<\/strong> trivial application, you will be using a client framework. For another, with the help of said framework, you\u2019ll be doing client-side routing, relegating the web server to a web service (and static asset directory, maybe). You see where this is heading: templating and JavaScript (transpiled-to). Be it a Handlebars template or, e.g., an Angular directive:<\/p>\n<pre class=\"brush: perl; title: ; notranslate\" title=\"\">\r\nvar angular = require('angular');\r\nvar img = require('.\/..\/img\/foo.png');\r\n \r\nvar app = angular.module('app', &#x5B;]);\r\napp.directive('bindImg', function () {\r\n    return {\r\n        link: function (scope) {\r\n            scope.photo = img;\r\n        },\r\n        template: '&lt;img data-ng-src=&quot;\/assets\/{{photo}}&quot;&gt;',\r\n        transclude: true\r\n    };\r\n});\r\n<\/pre>\n<p>(<strong>magic hands<\/strong>) And Bob\u2019s your uncle. I could\u2019ve even `require`-ed the HTML (as Jade) in the above `template` declaration.<\/p>\n<p>But I\u2019m off-point here. The focus of this post isn\u2019t a tutorial over webpack. There are some good ones out there. It\u2019s also not to document webpack. It has its own gh pages for that (decent, and hopefully gets better, more consistent, more in-depth and yet more accessible). No, this post is to convince you to offload your transpilations, your assets-building, to webpack. Drop the configurations and wiring in your build files. Where the building and wiring of assets are concerned, let webpack handle it. Forget the traditional bundling mechanisms of your modular frameworks.<\/p>\n<p>1. You lose all those brittle declared meta-variables.<br \/>\n2. You lose the Gulp\/Grunt plugins you fed them to.<br \/>\n3. See below<\/p>\n<p>A webpack config file for this phantom project could look like this:<\/p>\n<pre class=\"brush: perl; title: ; notranslate\" title=\"\">\r\n'use strict';\r\n \r\nvar config = {\r\n    entry: &#x5B;\r\n        &#x5B;__dirname, 'src', 'js', 'Application.js'].join('\/')\r\n    ],\r\n    module: {\r\n        loaders: &#x5B;\r\n            {\r\n                loader: 'style-loader!css-loader',\r\n                test: \/\\.css$\/\r\n            },\r\n            {\r\n                loader: 'coffee-loader',\r\n                test: \/\\.coffee$\/\r\n            },\r\n            {\r\n                loader: 'html',\r\n                test: \/\\.html$\/\r\n            },\r\n            {\r\n                loader: 'jade-loader',\r\n                test: \/\\.jade$\/\r\n            },\r\n            {\r\n                loader: 'file-loader',\r\n                test: \/\\.(png|jpg)$\/\r\n            },\r\n            {\r\n                loader: 'style-loader!css-loader!less-loader',\r\n                test: \/\\.less$\/\r\n            },\r\n            {\r\n                loader: 'file-loader',\r\n                test: \/\\.(ttf|eot|svg)(\\?v=&#x5B;0-9]\\.&#x5B;0-9]\\.&#x5B;0-9])?$\/\r\n            },\r\n            {\r\n                loader: 'url-loader?limit=10000&amp;mimetype=application\/font-woff',\r\n                test: \/\\.woff2?(\\?v=&#x5B;0-9]\\.&#x5B;0-9]\\.&#x5B;0-9])?$\/\r\n            }\r\n        ]\r\n    },\r\n    output: {\r\n        filename: 'bundle.js',\r\n        path: &#x5B;__dirname, 'assets'].join('\/')\r\n    }\r\n};\r\n \r\nmodule.exports = config;\r\n<\/pre>\n<p>Defining an entry point and configuring the loaders responsible for each filetype required (you will need to install these), plus an output directory\/file. Pretty simple and should feel conceptually familiar to RequireJS users. You can get more sophisticated with \u201c<a href=\"http:\/\/webpack.github.io\/docs\/code-splitting.html\" target=\"_blank\">chunking<\/a>,\u201d or breaking apart, your assets as you see fit. Out of the gate, you get one file for non-binary assets and a file-per binary.<\/p>\n<p>The key thing is that the naming, wiring, and retrieval of all assets is handled by the webpack runtime, embedded in the output. Actually key number two (maybe I\u2019m a janitor?) is, it all goes in one directory (out-of-the-box). It\u2019s a blob. To you at runtime, it\u2019s a blob. To you at dev-time, it\u2019s a blob. To you \u2014 and this is the pudding \u2014 at build-time, it\u2019s a blob. Just declare your dependencies at the file-level. webpack simplifies things.<\/p>\n<p>So, you say, \u201cOK. That config snippet looks simple and kinda familiar. Not much configuration. My Grunt\/Gulp tasks become dedicated runners vs. builders\u2026\u201d (yes, I just put words in your mouth) \u201c\u2026but, I\u2019m a curmudgeon and it wouldn\u2019t be very curmudgeonly of me to just accept a streamlined and consistent approach to building projects and declaring all dependencies, now would it?\u201d Well, dagnabbit, if we din\u2019t up \u2018n fergit hot reload (<strong>slaps prospector\u2019s hat on knee<\/strong>)!<\/p>\n<h3>webpack-dev-server<\/h3>\n<p>Although, strictly-speaking, not a part of webpack proper, <a href=\"http:\/\/webpack.github.io\/docs\/webpack-dev-server.html\" target=\"_blank\">webpack-dev-server<\/a>\u00a0is an easy-peasy-lemon-squeezy +1. Here is where the webpack runtime really flexes its muscles. Once configured, the runtime will serve through the dev-server (over a websocket) <strong>only the changed delta<\/strong>\u00a0in-page. If you think about it, it\u2019s a natural application of webpack\u2019s design choices: it\u2019s the runtime loader, it chunks and wires as it sees fit \u2014 substitutions in this model should be theoretically trivial vs. the watchers of old, binding file globs to tasks.<\/p>\n<p>And for the most part, it just works. Occasionally, you may have to restart the server or its buffer, eventually, after long periods of uptime, overflows. But you can easily set up, for dev-time, say, an Express server serving API, offloading static assets to the dev-server and be ripping through your style minutiae and route tunings, seamlessly and lickety-split-ily(?). Again, there\u2019s plenty of examples out there to guide you.<\/p>\n<h2>Conclusion<\/h2>\n<p>I\u2019ve only touched the surface of webpack. Try it out.<\/p>\n<p>I\u2019m sure you\u2019ll appreciate the cruft removed from your task runner, webpack\u2019s minimal configuration, its everything-is-a-module boon to testing, and its rapid development dev-server (esp. if you\u2019re using React \u2014 its shadow dom, itself, a lattice-like state machine). Its maintainers have made it easier to suggest documentation improvements (where I think is its weak point \u2014 including plug-ins) so I\u2019m sure things will get better on that front (<strong>nudge, nudge<\/strong> YOU). But you can get going and do a lot in spite of it.<\/p>\n<p>Now, get packin\u2019!<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/keyholesoftware.com\/2015\/03\/31\/pack-it-up-pack-it-in\/\">Pack It Up, Pack It In<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/wcg\/\">WCG partner<\/a> Keyhole Software at the <a href=\"http:\/\/keyholesoftware.com\/\">Keyhole Software<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Let me begin with a list of usual suspects up to no good in the browser: CoffeeScript (or TypeScript) Less (or Sass\/Scss) Jade (or Handlebars, Mustache) I mean, because, you know, writing in HTML\/JS\/CSS is so 2000-late. All this 74 72 61 6e s p i l a t i o n. A typical layout. &hellip;<\/p>\n","protected":false},"author":22,"featured_media":927,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":["post-3605","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Pack It Up, Pack It In - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Let me begin with a list of usual suspects up to no good in the browser: CoffeeScript (or TypeScript) Less (or Sass\/Scss) Jade (or Handlebars, Mustache) I\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pack It Up, Pack It In - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Let me begin with a list of usual suspects up to no good in the browser: CoffeeScript (or TypeScript) Less (or Sass\/Scss) Jade (or Handlebars, Mustache) I\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:author\" content=\"http:\/\/facebook.com\/keyholesoftware\" \/>\n<meta property=\"article:published_time\" content=\"2015-04-15T09:15:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Keyhole Software\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/keyholesoftware\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Keyhole Software\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/\"},\"author\":{\"name\":\"Keyhole Software\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2\"},\"headline\":\"Pack It Up, Pack It In\",\"datePublished\":\"2015-04-15T09:15:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/\"},\"wordCount\":1340,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"articleSection\":[\"JavaScript\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/\",\"name\":\"Pack It Up, Pack It In - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"datePublished\":\"2015-04-15T09:15:04+00:00\",\"description\":\"Let me begin with a list of usual suspects up to no good in the browser: CoffeeScript (or TypeScript) Less (or Sass\/Scss) Jade (or Handlebars, Mustache) I\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Pack It Up, Pack It In\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2\",\"name\":\"Keyhole Software\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g\",\"caption\":\"Keyhole Software\"},\"description\":\"Keyhole is a midwest-based consulting firm with a tight-knit technical team. We work primarily with Java, JavaScript and .NET technologies, specializing in application development. We love the challenge that comes in consulting and blog often regarding some of the technical situations and technologies we face.\",\"sameAs\":[\"http:\/\/keyholesoftware.com\/\",\"http:\/\/facebook.com\/keyholesoftware\",\"http:\/\/linkedin.com\/company\/keyhole-software\",\"https:\/\/x.com\/http:\/\/twitter.com\/keyholesoftware\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/keyhole-software\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pack It Up, Pack It In - Web Code Geeks - 2026","description":"Let me begin with a list of usual suspects up to no good in the browser: CoffeeScript (or TypeScript) Less (or Sass\/Scss) Jade (or Handlebars, Mustache) I","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/","og_locale":"en_US","og_type":"article","og_title":"Pack It Up, Pack It In - Web Code Geeks - 2026","og_description":"Let me begin with a list of usual suspects up to no good in the browser: CoffeeScript (or TypeScript) Less (or Sass\/Scss) Jade (or Handlebars, Mustache) I","og_url":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_author":"http:\/\/facebook.com\/keyholesoftware","article_published_time":"2015-04-15T09:15:04+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","type":"image\/jpeg"}],"author":"Keyhole Software","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/keyholesoftware","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Keyhole Software","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/"},"author":{"name":"Keyhole Software","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2"},"headline":"Pack It Up, Pack It In","datePublished":"2015-04-15T09:15:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/"},"wordCount":1340,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","articleSection":["JavaScript"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/","url":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/","name":"Pack It Up, Pack It In - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","datePublished":"2015-04-15T09:15:04+00:00","description":"Let me begin with a list of usual suspects up to no good in the browser: CoffeeScript (or TypeScript) Less (or Sass\/Scss) Jade (or Handlebars, Mustache) I","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/web-dev-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/javascript\/pack-it-up-pack-it-in\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"JavaScript","item":"https:\/\/www.webcodegeeks.com\/category\/javascript\/"},{"@type":"ListItem","position":3,"name":"Pack It Up, Pack It In"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2","name":"Keyhole Software","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g","caption":"Keyhole Software"},"description":"Keyhole is a midwest-based consulting firm with a tight-knit technical team. We work primarily with Java, JavaScript and .NET technologies, specializing in application development. We love the challenge that comes in consulting and blog often regarding some of the technical situations and technologies we face.","sameAs":["http:\/\/keyholesoftware.com\/","http:\/\/facebook.com\/keyholesoftware","http:\/\/linkedin.com\/company\/keyhole-software","https:\/\/x.com\/http:\/\/twitter.com\/keyholesoftware"],"url":"https:\/\/www.webcodegeeks.com\/author\/keyhole-software\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/3605","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=3605"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/3605\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/927"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=3605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=3605"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=3605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}