{"id":15803,"date":"2017-01-19T12:15:37","date_gmt":"2017-01-19T10:15:37","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=15803"},"modified":"2017-01-19T12:13:27","modified_gmt":"2017-01-19T10:13:27","slug":"running-vue-js","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/","title":{"rendered":"Up and Running with Vue.js"},"content":{"rendered":"<p>You don\u2019t need another JavaScript framework. You\u2019ve got one you\u2019re using. Hopefully you\u2019re happy with it. You just read eight other articles about other awesome, shiny, new, amazing, fabulous frameworks with astounding new features that will change your very existence into something incredible. Right? I did.<\/p>\n<p><a href=\"http:\/\/vuejs.org\/\">Vue.js<\/a> is (like many other frameworks) worthy of all of those adjectives. But none of those are why you should use it. And really, maybe you shouldn\u2019t. That will all depend on you and Vue and how you two get along. Let\u2019s find out.<\/p>\n<h2>How I Met Vue<\/h2>\n<p>I build web things. Often. I\u2019ve been building things for the web since the late \u201990s. I was even writing JavaScript (well, JScript) on the server side pre-2000. I used it on the client side from the moment I could make animated gifs chase a mouse cursor.<\/p>\n<p>However, even with all the history, I\u2019d not met a JavaScript framework or library that I\u2019d really fallen in love with until I met Vue.<\/p>\n<p>It wasn\u2019t because it was fast. It wasn\u2019t because it was <a href=\"https:\/\/www.webcodegeeks.com\/web-development\/give-new-tech-try\/\">the \u201cnew hotness.\u201d<\/a> It wasn\u2019t even because the code was simple and obvious. It was for one simple reason: It thought like me.<\/p>\n<h3>Data as state machine<\/h3>\n<p>This was the key part of Vue that won me over.<\/p>\n<p>State machines are old awesomeness. Nothing new here. However, in most JavaScript frameworks, libraries, or even \u201cvanilla code,\u201d understanding the state of the system is like untangling all those wires under your desk \u2014 or worse.<\/p>\n<p>Vue puts the state machine at its very core by using a plain JSON-compatible object. Essentially:<\/p>\n<pre class=\"brush:php\">data == JSON.parse(JSON.stringify(data));<\/pre>\n<p>Vue then adds reactive binding via its templating system and provides methods for data observation using simple JSON Path-style watchers. The end result is an application that centers around its data and reacts to changes within that data.<\/p>\n<h3>Strikingly simple start<\/h3>\n<p>Another thing that won me over was the speed at which I could get my head around the sample code and explanations in the documentation.<\/p>\n<p>For example, here\u2019s a strikingly simple Hello World-style Vue application (<a href=\"https:\/\/jsfiddle.net\/chrisvfritz\/50wL7mdz\/\">view it on JSFiddle<\/a>):<\/p>\n<p><strong>App.js<\/strong><\/p>\n<pre class=\"brush:js\">new Vue({\r\n  el: '#app',\r\n  data: {\r\n    message: 'Hello Vue.js'\r\n  }\r\n});<\/pre>\n<p><strong>App.html<\/strong><\/p>\n<pre class=\"brush:xml\">&lt;div id=\"app\"&gt;\r\n&lt;p&gt;{{message}}&lt;\/p&gt;\r\n&lt;\/div&gt;<\/pre>\n<p>That\u2019s about as simple as it gets in any JS framework. The curly-brace style templating was very familiar from building entirely too many Mustache and Handlebars templates. The neat part with Vue, however, is that <code>message<\/code> is immediately dynamically bound! No extra time defining state classes, interfaces, or magical pony meta-objects. Just some JSON and some HTML and some JS glue in the middle.<\/p>\n<p>Don\u2019t believe me? I\u2019ll prove it by adding a bi-directionally bound message editor and only changing the HTML.<\/p>\n<p><strong>App.html<\/strong><\/p>\n<pre class=\"brush:xml\">&lt;div id=\"app\"&gt;\r\n&lt;p&gt;{{message}}&lt;\/p&gt;\r\n&lt;input v-model=\"message\"&gt;\r\n&lt;\/div&gt;<\/pre>\n<p><a href=\"https:\/\/jsfiddle.net\/BigBlueHat\/chzLmfxs\/1\/\">Try it!<\/a><\/p>\n<p>The <code>v-model<\/code> attribute dynamically binds the input (or textarea) field you\u2019ve chosen to the data in your application, giving you direct access to manipulate the state of your application\u2019s data-based state machine. Handy. To say the least.<\/p>\n<p>That alone had me pretty sold, but obviously one could write it off as \u201cneat.\u201d However, as I dug deeper into the examples, documentation, and my own experience, I found that this simple, obvious approach brought me not only great happiness but also great reward in terms of speed of coding, understanding my own code, and ability to explain it to my friends and future self.<\/p>\n<p>Vue successfully reduced my mental workload of bi-directional binding and application state into a single, understandable unit.<\/p>\n<p>The best way to explain my utter exuberance over all this \u2014 and how it\u2019s hopefully applicable to your day today \u2014 is likely to take this example a bit farther and see where we end up.<\/p>\n<p>Shall we?<\/p>\n<h2>Make Messages<\/h2>\n<p>So. We\u2019ve got a thing where we type stuff and it shows up on a screen. Neat!<\/p>\n<p>What if we made it possible to record what we\u2019ve written plus when we wrote it? Like, you know, note taking.<\/p>\n<p>We\u2019ll do that by:<\/p>\n<ol>\n<li>Expanding the data model to include: a) a log of messages in the main application and b) timestamps on messages<\/li>\n<li>A button for removing earlier messages<\/li>\n<li>And for bonus points, a Vue component to trigger a desktop notification displaying the note (because why not)<\/li>\n<\/ol>\n<p>Sounds straightforward enough. Here goes.<\/p>\n<h3>Message logging model<\/h3>\n<p>Since we have this fabulous underlying \u201cdata as state machine\u201d thing, let\u2019s flesh out the model a wee bit.<\/p>\n<pre class=\"brush:php\">new Vue({\r\n  el: '#app',\r\n  data: {\r\n    message: 'Hello Vue.js!',\r\n    log: [{\r\n      value: 'Codeship is awesome!!1!',\r\n      created: '2017-01-09'\r\n    }]\r\n  }\r\n});<\/pre>\n<p>This change expands on our existing code, so it should all still work. It adds the <code>log<\/code> (just an Array) which contains the message log. I\u2019ve prepopulated it with a particularly useful message.<\/p>\n<p>Let\u2019s keep iterating. Next up, HTML.<\/p>\n<pre class=\"brush:xml\">&lt;div id=\"app\"&gt;\r\n&lt;input v-model=\"message\"&gt;\r\n&lt;button v-on:click=\"save()\"&gt;save&lt;\/button&gt;\r\n&lt;ul&gt;\r\n&lt;li v-for=\"(msg, idx) in log\"&gt;\r\n{{msg.value}} - &lt;em&gt;{{msg.created}}&lt;\/em&gt;\r\n&lt;button v-on:click=\"log.splice(idx, 1)\"&gt;X&lt;\/button&gt;\r\n&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\n&lt;\/div&gt;<\/pre>\n<p>You\u2019ll note I\u2019ve removed the bi-directional bound display for <code>message<\/code>, but left the input field and <code>v-model<\/code> binding. I\u2019ve also added a Save button and the list of messages. The list of messages is created by looping through the <code>log<\/code> array using the <code>v-for<\/code> property, with the object in the array set to <code>msg<\/code> and the index of the object within the list set to <code>idx<\/code>.<\/p>\n<p>If you run that now, you should see one message in the list, a button to remove that message, and the message box (prepopulated with a default) to type in a new message as well as a Save button which doesn\u2019t (yet) work.<\/p>\n<p>Let\u2019s make the Save button work. Back to the JS:<\/p>\n<pre class=\"brush:php\">ew Vue({\r\n  el: '#app',\r\n  data: {\r\n    message: 'Hello Vue.js!',\r\n    log: [{\r\n      value: 'Hi there, Codeship!',\r\n      created: '2017-01-09'\r\n    }]\r\n  },\r\n  methods: {\r\n    save: function() {\r\n      this.log.unshift({\r\n        value: this.message,\r\n        created: (new Date).toISOString()\r\n      });\r\n    }\r\n  }\r\n});<\/pre>\n<p><a href=\"https:\/\/jsfiddle.net\/BigBlueHat\/chzLmfxs\/2\/\">Now try it!<\/a> Pretty slick, right? We\u2019re simply manipulating the state of the data, and the output is reacting to that state change.<\/p>\n<p>However, I spot some \u201cdata smarts\u201d in that <code>save()<\/code> method. Let\u2019s see if we can put that in a tinier place, so we don\u2019t have to read the save code to understand (or reuse) this app\u2019s date format.<\/p>\n<h3>Datum date datum<\/h3>\n<p>Remember that bit about data as state machine? It gets better.<\/p>\n<p>That created-date formatting living inside the save method is a bit of a \u201csmell\u201d (<em>i.e.<\/em>, in want of refactoring). Consequently, it would smell less if it lived on its own. Vue has just the thing for that: computed data.<\/p>\n<p>Here\u2019s the updated app code showing the new <code>created<\/code> computed property:<\/p>\n<pre class=\"brush:php\">new Vue({\r\n  el: '#app',\r\n  data: {\r\n    message: 'Hello Vue.js!',\r\n    log: [{\r\n      value: 'Hi there, Codeship!,\r\n      created: '2017-01-09'\r\n    }]\r\n  },\r\n  computed: {\r\n    created: function() {\r\n      return (new Date).toISOString();\r\n    }\r\n  },\r\n  methods: {\r\n    save: function() {\r\n      this.log.unshift({\r\n        value: this.message,\r\n        created: this.created\r\n      });\r\n    }\r\n  }\r\n});<\/pre>\n<p>We\u2019ve added a new <code>computed<\/code> object which contains a single <code>created<\/code> property that returns the current date in the One True Date format, also known as ISO 8601. So far. So obvious.<\/p>\n<p>Now focus in on the third line of the <code>save()<\/code> method. See that? We\u2019re accessing the new computed <code>created<\/code> value off of <code>this<\/code>, and (you guessed it!) it\u2019s returning the current date in ISO 8601.<\/p>\n<p>The <code>this<\/code> object in Vue is set to the current \u201cVue Model\u201d (often abbreviated as VM). This object allows direct get-ing and set-ing of the VM\u2019s data as well as access to its methods (<em>e.g.<\/em>, <code>this.save()<\/code> works).<\/p>\n<p>But this is still just the world of a single Vue application. We\u2019ve not yet added a component.<\/p>\n<p>Let\u2019s add a component that could be useful in other applications. How about a desktop notification button using an emoji! That sounds super useful!<\/p>\n<h3>Desktop notificator<\/h3>\n<p>The Vue component below could be used in any Vue application. It accepts two properties: message and title. These map into the JS Notifications API you can see used in the <code>notify<\/code> method on the component.<\/p>\n<p>The <code>template<\/code> is inline this time, for legibility here and for keeping this component completely contained in a single file \u2014 and since it\u2019s just so plain simple.<\/p>\n<pre class=\"brush:php\">Vue.component('desktop-notificator', {\r\n  props: ['message', 'title'],\r\n  template: '&lt;button v-on:click=\"notify()\"&gt;??&lt;\/button&gt;',\r\n  methods: {\r\n   notify: function() {\r\n     if (Notification.permission !== \"granted\") {\r\n       Notification.requestPermission();\r\n     } else {\r\n       new Notification(this.title, {\r\n         body: this.message,\r\n       });\r\n     }\r\n   }\r\n }\r\n});<\/pre>\n<p>If you\u2019re coding in your own JSFiddle (or similar) you can copy\/paste that into the main JS above the <code>new Vue<\/code> bit. Or, if you want, you can toss it in its own file and load it via a script tag (below the Vue.js script tag of course).<\/p>\n<p>Once you\u2019ve got it added, you can use it within this (and any other) Vue application by adding code similar to this:<\/p>\n<pre class=\"brush:xml\">&lt;desktop-notificator v-bind:message=\"msg.value\" v-bind:title=\"msg.created\"&gt;&lt;\/desktop-notificator&gt;<\/pre>\n<p>The <code>v-bind:<\/code> prefixed attributes map the internal data model (<code>message<\/code> and <code>title<\/code>) to the parent application (or components) values: <code>msg.value<\/code> and <code>msg.created<\/code> (in the case of this app).<\/p>\n<p>Let\u2019s take a look at it within the wider awesomessness of this little app\u2019s HTML:<\/p>\n<pre class=\"brush:xml\">&lt;div id=\"app\"&gt;\r\n&lt;input v-model=\"message\"&gt;\r\n&lt;button v-on:click=\"save()\"&gt;save&lt;\/button&gt;\r\n&lt;ul&gt;\r\n&lt;li v-for=\"(msg, idx) in log\"&gt;\r\n&lt;desktop-notificator v-bind:message=\"msg.value\"\r\nv-bind:title=\"msg.created\"&gt;&lt;\/desktop-notificator&gt;\r\n{{msg.value}} - &lt;em&gt;{{msg.created}}&lt;\/em&gt;\r\n&lt;button v-on:click=\"log.splice(idx, 1)\"&gt;X&lt;\/button&gt;\r\n&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\n&lt;\/div&gt;<\/pre>\n<p><a href=\"https:\/\/jsfiddle.net\/BigBlueHat\/chzLmfxs\/3\/\">Try it out!<\/a> You\u2019ll need to allow desktop notifications for it to work (which you probably already knew).<\/p>\n<h3>Simplification<\/h3>\n<p>We\u2019ve made it this far. We\u2019ve got a working application that does extra neat things like desktop notifications. We\u2019ve seen a bit of Vue\u2019s component system and its bi-directional binding enabled templating system of greatness.<\/p>\n<p>But there\u2019s more. Lots more.<\/p>\n<p>For now, we\u2019re going to take a quick look at some niftiness to streamline the template code we\u2019ve just written to make it simpler \u2014 though (admittedly) a bit more idiosyncratic.<\/p>\n<h3>Idiosyncratic awesome<\/h3>\n<p>Every JS framework is unique. Often the uniqueness can feel strange or awkward in other people\u2019s code or examples in documentation. That\u2019s likely how you\u2019d have felt if I\u2019d started with this code.<\/p>\n<pre class=\"brush:xml\">&lt;div id=\"app\"&gt;\r\n&lt;input v-model=\"message\"&gt;\r\n&lt;button @click=\"save()\"&gt;save&lt;\/button&gt;\r\n&lt;ul&gt;\r\n&lt;li v-for=\"(msg, idx) in log\"&gt;\r\n&lt;desktop-notificator :message=\"msg.value\" :title=\"msg.created\"&gt;&lt;\/desktop-notificator&gt;\r\n{{msg.value}} - &lt;em&gt;{{msg.created}}&lt;\/em&gt;\r\n&lt;button @click=\"log.splice(idx, 1)\"&gt;X&lt;button&gt;\r\n&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\n&lt;\/div&gt;\r\n\r\nSome of the <code>v-*<\/code> attributes remain, but we\u2019ve replaced the <code>v-on<\/code> and <code>v-bind<\/code> attributes with a short hand notation: <code>v-on:<\/code> is replaced by <code>@<\/code> and <code>v-bind:<\/code> is replaced by <code>:<\/code>.\r\n\r\nWeird looking, right? However, as you spend more time with Vue, you\u2019ll find this notation actually makes the template code more legible. There are also handy syntax highlighters likely available for your preferred editor which make these short-hand attributes stand out a bit more.<\/pre>\n<h3>Even great idioms<\/h3>\n<p>We\u2019ve built this simple application and its component using two files: one for the JS code and one for the HTML (which you could even combine). The Vue world, however, has a handy command-line tool called <em><a href=\"https:\/\/github.com\/vuejs\/vueify\">vueify<\/a><\/em> which, as you might surmise from the name, works a bit like browserify, but with lots of Vue-focused fabulousness. For instance, vueify allows you to work with single <code>.vue<\/code> files which contain <em>all<\/em> the JS, CSS, and HTML you need for a single component. It\u2019s obviously super handy for components like the one built above. Here\u2019s what <code>desktop-notificator.vue<\/code> would look like:<\/p>\n<pre class=\"brush:php\">&lt;template&gt;\r\n  &lt;button @click=\"notify()\"&gt;??&lt;\/button&gt;\r\n&lt;\/template&gt;\r\n\r\n&lt;script&gt;\r\nexport default {\r\n  props: ['message', 'title'],\r\n  methods: {\r\n  notify () {\r\n    if (Notification.permission !== \"granted\") {\r\n      Notification.requestPermission();\r\n    } else {\r\n      new Notification(this.title, {\r\n        body: this.message,\r\n      });\r\n    }\r\n  }\r\n};\r\n&lt;\/script&gt;<\/pre>\n<p>The template code now lives inside a template tag, and the script tag now holds our JS code, which I\u2019ve changed to use ES6\/ECMA2016 which vueify is happy to transpile for me. Additionally, vueify allows you to mix in other <a href=\"https:\/\/github.com\/vuejs\/vueify#enabling-other-pre-processors\">preprocessors<\/a> such as Jade, Stylus, CoffeeScript, and many more.<\/p>\n<p>If you think in preprocessed languages, adding vueify to your coding kit might increase happiness by at least +10.<\/p>\n<h2>Vue Thinks Like Me<\/h2>\n<p>When I found Vue, I found a framework that thinks like I do.<\/p>\n<p>Data is central to what I design. Everything else pivots around it. Using watchers to react to change and computed values to generate unique additional value puts my \u201cprescriptive\u201d code in a place where I could still see my \u201cdescriptive\u201d data.<\/p>\n<p>Templating is something I (actually) enjoy, and I\u2019ve found Vue\u2019s bi-directional binding, custom attribute-based integration, and web-component-like application construction to be refreshing. Containing elements of the UI within components that communicate their state through shared data and events felt right (to me at least).<\/p>\n<p>Lastly, the Vue community, while still relatively small, has also been welcoming and eager to continue Vue\u2019s future and grow the surrounding ecosystem by contributing to \u201cofficial\u201d add-ons like <a href=\"https:\/\/github.com\/vuejs\/vuex\">Vuex<\/a> (a Flux-style state manager) and vue-router (for history and page-state management). There\u2019s also an ever-widening world of component-based code for your Vue-based applications.<\/p>\n<h2>Don\u2019t Use Vue \u2014 unless<\/h2>\n<p>It thinks like you do. If not, please use something that suits you. You\u2019ll get more done, be happier, and consequently get more done. Enjoy!<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"https:\/\/blog.codeship.com\/up-and-running-with-vue-js\/\">Up and Running with Vue.js<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/join-us\/wcg\/\">WCG partner<\/a> Benjamin Young at the <a href=\"http:\/\/blog.codeship.com\/\">Codeship Blog<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>You don\u2019t need another JavaScript framework. You\u2019ve got one you\u2019re using. Hopefully you\u2019re happy with it. You just read eight other articles about other awesome, shiny, new, amazing, fabulous frameworks with astounding new features that will change your very existence into something incredible. Right? I did. Vue.js is (like many other frameworks) worthy of all &hellip;<\/p>\n","protected":false},"author":158,"featured_media":920,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[427],"class_list":["post-15803","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-vue-js"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Up and Running with Vue.js - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"You don\u2019t need another JavaScript framework. You\u2019ve got one you\u2019re using. Hopefully you\u2019re happy with it. You just read eight other articles about other\" \/>\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\/running-vue-js\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Up and Running with Vue.js - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"You don\u2019t need another JavaScript framework. You\u2019ve got one you\u2019re using. Hopefully you\u2019re happy with it. You just read eight other articles about other\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/\" \/>\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:published_time\" content=\"2017-01-19T10:15:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-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=\"Benjamin Cane\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Benjamin Cane\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/\"},\"author\":{\"name\":\"Benjamin Cane\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/4f5d918df9c19fab91b5b205357ce0b8\"},\"headline\":\"Up and Running with Vue.js\",\"datePublished\":\"2017-01-19T10:15:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/\"},\"wordCount\":1858,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"keywords\":[\"Vue.js\"],\"articleSection\":[\"JavaScript\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/\",\"name\":\"Up and Running with Vue.js - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"datePublished\":\"2017-01-19T10:15:37+00:00\",\"description\":\"You don\u2019t need another JavaScript framework. You\u2019ve got one you\u2019re using. Hopefully you\u2019re happy with it. You just read eight other articles about other\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#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\":\"Up and Running with Vue.js\"}]},{\"@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\/4f5d918df9c19fab91b5b205357ce0b8\",\"name\":\"Benjamin Cane\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/09c6af2f1a7430456089189937094b817ef1b7c75ab9968bfd3ec35d938d914b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/09c6af2f1a7430456089189937094b817ef1b7c75ab9968bfd3ec35d938d914b?s=96&d=mm&r=g\",\"caption\":\"Benjamin Cane\"},\"description\":\"Benjamin Cane is a systems architect in the financial services industry. He writes about Linux systems administration on his blog and has recently published his first book, Red Hat Enterprise Linux Troubleshooting Guide.\",\"url\":\"https:\/\/www.webcodegeeks.com\/author\/benjamin-cane\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Up and Running with Vue.js - Web Code Geeks - 2026","description":"You don\u2019t need another JavaScript framework. You\u2019ve got one you\u2019re using. Hopefully you\u2019re happy with it. You just read eight other articles about other","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\/running-vue-js\/","og_locale":"en_US","og_type":"article","og_title":"Up and Running with Vue.js - Web Code Geeks - 2026","og_description":"You don\u2019t need another JavaScript framework. You\u2019ve got one you\u2019re using. Hopefully you\u2019re happy with it. You just read eight other articles about other","og_url":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2017-01-19T10:15:37+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","type":"image\/jpeg"}],"author":"Benjamin Cane","twitter_card":"summary_large_image","twitter_creator":"@webcodegeeks","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Benjamin Cane","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/"},"author":{"name":"Benjamin Cane","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/4f5d918df9c19fab91b5b205357ce0b8"},"headline":"Up and Running with Vue.js","datePublished":"2017-01-19T10:15:37+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/"},"wordCount":1858,"commentCount":2,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","keywords":["Vue.js"],"articleSection":["JavaScript"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/","url":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/","name":"Up and Running with Vue.js - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","datePublished":"2017-01-19T10:15:37+00:00","description":"You don\u2019t need another JavaScript framework. You\u2019ve got one you\u2019re using. Hopefully you\u2019re happy with it. You just read eight other articles about other","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/javascript\/running-vue-js\/#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":"Up and Running with Vue.js"}]},{"@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\/4f5d918df9c19fab91b5b205357ce0b8","name":"Benjamin Cane","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/09c6af2f1a7430456089189937094b817ef1b7c75ab9968bfd3ec35d938d914b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/09c6af2f1a7430456089189937094b817ef1b7c75ab9968bfd3ec35d938d914b?s=96&d=mm&r=g","caption":"Benjamin Cane"},"description":"Benjamin Cane is a systems architect in the financial services industry. He writes about Linux systems administration on his blog and has recently published his first book, Red Hat Enterprise Linux Troubleshooting Guide.","url":"https:\/\/www.webcodegeeks.com\/author\/benjamin-cane\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/15803","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\/158"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=15803"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/15803\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/920"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=15803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=15803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=15803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}