<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CodeinWP</title>
    <description>The latest articles on DEV Community by CodeinWP (@codeinwp).</description>
    <link>https://dev.to/codeinwp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F795%2Fa3c775dc-bc2b-4416-96da-cec02c055cc8.png</url>
      <title>DEV Community: CodeinWP</title>
      <link>https://dev.to/codeinwp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codeinwp"/>
    <language>en</language>
    <item>
      <title>WordPress.com vs WordPress.org: Key Differences and Which One You Should Use</title>
      <dc:creator>Dobrin Robert Adrian</dc:creator>
      <pubDate>Wed, 30 Sep 2020 08:05:16 +0000</pubDate>
      <link>https://dev.to/codeinwp/wordpress-com-vs-wordpress-org-key-differences-and-which-one-you-should-use-22d2</link>
      <guid>https://dev.to/codeinwp/wordpress-com-vs-wordpress-org-key-differences-and-which-one-you-should-use-22d2</guid>
      <description>&lt;p&gt;WordPress is the most popular way to build a website. But despite its popularity, there’s one question that many new users still struggle with – &lt;strong&gt;what’s the difference between WordPress.com vs WordPress.org?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you search for “WordPress” on Google, the two websites will rank #1 and #2. And if you’re new to WordPress, you might not know which one to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This article will explain the key differences between WordPress.com vs WordPress.org and help you pick the best one for your needs.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  WordPress.com vs WordPress.org
&lt;/h1&gt;

&lt;p&gt;The key difference between WordPress.com and WordPress.org is who’s actually hosting your website.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;WordPress.org&lt;/strong&gt;, you host your own site (we recommend this).&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;WordPress.com&lt;/strong&gt;, on the other hand, it’s WordPress.com that takes care of all of this for you (easier to start, less freedom). &lt;strong&gt;And that’s the major difference.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nowadays, &lt;a href="https://themeisle.com/blog/best-wordpress-hosting/"&gt;hosting companies&lt;/a&gt; like &lt;a href="https://www.bluehost.com/special/wordpressciwp?utm_source=themeisle.com&amp;amp;utm_medium=affiliate&amp;amp;utm_campaign=affiliate-link_codeinwp_notype"&gt;Bluehost&lt;/a&gt; or SiteGround are as easy to start with as WordPress.com, cheaper and with more freedom.&lt;/p&gt;

&lt;h1&gt;
  
  
  The cost of using WordPress.com vs WordPress.org
&lt;/h1&gt;

&lt;p&gt;WordPress.com does allow you to set up a website entirely for free, but there are some downsides to this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can only place your site under a subdomain&lt;/li&gt;
&lt;li&gt;You cannot remove WordPress.com’s own ads and branding from your site&lt;/li&gt;
&lt;li&gt;You get limited disk space of 3GB&lt;/li&gt;
&lt;li&gt;You can’t &lt;a href="https://themeisle.com/blog/how-to-make-money-with-a-blog/"&gt;monetize your blog&lt;/a&gt; or website&lt;/li&gt;
&lt;li&gt;You can’t install &lt;a href="https://themeisle.com/blog/must-have-plugins-for-wordpress/"&gt;plugins&lt;/a&gt; or any themes that aren’t available on the platform by default&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you do want to use your site for a commercial purpose, you will have to pay at least $8 / month on your WordPress.com plan + the cost of a custom domain name usually in the range of $15 / year. In total, this means at least &lt;strong&gt;$111 annually to run a site on WordPress.com.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;WordPress.org&lt;/strong&gt;, on the other hand, you can launch a &lt;strong&gt;completely functional website at $35 for the first year&lt;/strong&gt; and then $50 every year after that.&lt;/p&gt;

&lt;p&gt;To make that happen, you first need to pick a web host. We have some &lt;a href="https://themeisle.com/blog/best-wordpress-hosting/"&gt;suggestions for you here&lt;/a&gt;, but if you’re in a hurry, just go with &lt;a href="https://www.bluehost.com/special/wordpressciwp?utm_source=themeisle.com&amp;amp;utm_medium=affiliate&amp;amp;utm_campaign=affiliate-link_codeinwp_notype"&gt;Bluehost&lt;/a&gt;. They’re a respected company with tons of options for WordPress. Here’s what’s good about Bluehost’s offering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can get started at $2.95 / month&lt;/li&gt;
&lt;li&gt;You get a free domain name for the first year&lt;/li&gt;
&lt;li&gt;WordPress will be installed for you automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a user’s point of view, Bluehost works similarly to WordPress.com – as in, you sign up, pick a hosting plan, tell them to install WordPress for you, finalize the purchase and you’re good to do.&lt;/p&gt;

&lt;p&gt;Plus, what you also get is complete freedom over what you want to do with your site – something that WordPress.com doesn’t give you. Go &lt;a href="https://www.bluehost.com/wordpress?utm_source=themeisle.com&amp;amp;utm_medium=affiliate&amp;amp;utm_campaign=affiliate-link_codeinwp_notype"&gt;here to get started with Bluehost and WordPress.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you need some more info before making up your mind, here’s a more in-depth look at the differences between WordPress.com and WordPress.org:&lt;/p&gt;

&lt;h1&gt;
  
  
  WordPress.com vs WordPress.org: Pros and cons
&lt;/h1&gt;

&lt;p&gt;Each version has its own pros and cons. (Although, I personally think the .com version has more cons than pros. But you can decide for yourself!)&lt;/p&gt;

&lt;h3&gt;
  
  
  When to use WordPress.com
&lt;/h3&gt;

&lt;p&gt;With WordPress.com, you don’t have to worry about &lt;a href="https://themeisle.com/blog/types-of-wordpress-hosting-plans/"&gt;purchasing hosting&lt;/a&gt; or maintaining your site. It also &lt;em&gt;can&lt;/em&gt; be free, though there are paid plans as well.&lt;/p&gt;

&lt;p&gt;The free plan limits you to 3GB of data and a subdomain (like &lt;em&gt;mywebsite.wordpress.com&lt;/em&gt;). It also includes WordPress.com ads.&lt;/p&gt;

&lt;p&gt;Furthermore, you won’t be able to install your own “plugins” or “themes” unless you pay for the expensive business plan. Plugins and themes are one of the most helpful things about the WordPress software because they make it easy to &lt;a href="https://themeisle.com/blog/wordpress-customizer-how-to/"&gt;customize your site&lt;/a&gt;, so that’s a pretty big loss.&lt;/p&gt;

&lt;p&gt;If the thought of changing a domain name server (DNS) or backing up your website data sounds incredibly daunting, WordPress.com may be the way to go to create a basic blog/website. &lt;strong&gt;But if you want any kind of flexibility, plan to monetize your site, or want your site to grow in the long run, WordPress.com can be very limiting.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  When to use WordPress.org
&lt;/h3&gt;

&lt;p&gt;WordPress.org &lt;a href="https://themeisle.com/blog/how-to-install-wordpress/"&gt;has to be set up&lt;/a&gt; with your hosting provider. In most cases, this is a simple one-click install, and is really easy.&lt;/p&gt;

&lt;p&gt;In fact, if you purchase &lt;a href="https://themeisle.com/blog/how-to-choose-a-domain-name/"&gt;your domain name&lt;/a&gt; from your hosting provider, you don’t even have to worry about changing DNSs. It will be done for you!&lt;/p&gt;

&lt;p&gt;Plus, WordPress.org has much better customization options. You’re able to &lt;a href="https://themeisle.com/blog/must-have-plugins-for-wordpress/"&gt;install plugins&lt;/a&gt;, &lt;a href="https://themeisle.com/wordpress-themes/"&gt;use custom website themes&lt;/a&gt;, and do just about anything you want with your site.&lt;/p&gt;

&lt;p&gt;You can also &lt;a href="https://themeisle.com/blog/how-to-make-money-with-a-blog/"&gt;monetize your website&lt;/a&gt; however you want, which is great if you’re planning to make it a business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want full control over your site and the best possible options, go with WordPress.org.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even though there’s a bit more of a learning curve, in the long run you’ll thank yourself for making this decision.&lt;/p&gt;

&lt;p&gt;Ready to get started? As mentioned, we recommend &lt;a href="https://www.bluehost.com/wordpress?utm_source=themeisle.com&amp;amp;utm_medium=affiliate&amp;amp;utm_campaign=affiliate-link_codeinwp_notype"&gt;Bluehost&lt;/a&gt; as the place to launch your WordPress website. The setup is easy and they help you along the way, too. For more guidance, here’s our &lt;a href="https://themeisle.com/blog/how-to-create-a-blog/"&gt;15 minute tutorial to starting a WordPress website&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>hosting</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>10+ Best JavaScript Animation Libraries to Use in 2020</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Fri, 12 Jun 2020 11:56:21 +0000</pubDate>
      <link>https://dev.to/codeinwp/10-best-javascript-animation-libraries-to-use-in-2020-l65</link>
      <guid>https://dev.to/codeinwp/10-best-javascript-animation-libraries-to-use-in-2020-l65</guid>
      <description>&lt;p&gt;If you’re looking to grab your website visitor’s attention, what can be better than animations? Using the many application engines freely available on the web, you can easily get your website’s elements to fade, bounce or whoosh. In today’s post, we’ll see how JavaScript animation libraries can help with all that.&lt;/p&gt;

&lt;p&gt;First, a little about JavaScript animations&lt;/p&gt;

&lt;p&gt;It’s one thing to add simple animations that need just one action (for instance, toggling). For this, you can always use simple CSS animations. But, for more complex or advanced effects, JavaScript is a better tool. It goes without saying that using JavaScript to create animations is more challenging than using CSS.&lt;/p&gt;

&lt;p&gt;Nevertheless, JavaScript can handle things that CSS can’t. This gives developers way more power to control complex animations that need to coordinate multiple moving parts.&lt;/p&gt;

&lt;p&gt;JavaScript animations are implemented by adding gradual changes to an element’s style. You can add them in-line as part of your code, or include them in other objects. When rendering, these changes are called up by a timer. Also, you can control the continuity of the animations by adjusting the time interval of the changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The best JavaScript animation libraries
&lt;/h3&gt;

&lt;p&gt;Here’s a list of JavaScript animation libraries that you can use to add some awesome-looking animations to &lt;a href="https://www.codeinwp.com/blog/how-to-build-your-own-website/"&gt;your website&lt;/a&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://animejs.com/"&gt;Anime.js&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2RjzXqJ1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/animejs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2RjzXqJ1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/animejs.jpg" alt="JavaScript libraries: Anime.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s start this list of JavaScript animation libraries with Anime.js. This lightweight animation library clocks 35K+ stars on &lt;a href="https://github.com/juliangarnier/anime"&gt;GitHub&lt;/a&gt;. Working from a single powerful API, you can use it to animate HTML, CSS, JS, SVG and DOM attributes. With a built-in staggering system, it can make creating ripples, directional movements, follow-through and overlapping effects appear simple. This system is usable on both timings and properties.&lt;/p&gt;

&lt;p&gt;There’s a lot you can do using the built-in callback and control functions. For instance, you can play, pause, control, reverse and trigger events in sync. To see what else is possible using this library, you can &lt;a href="https://codepen.io/collection/XLebem/?grid_type=list"&gt;visit Codepen&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="http://velocityjs.org/"&gt;Velocity.js&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ancZIILf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/velocityjs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ancZIILf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/velocityjs.jpg" alt="JavaScript libraries: Velocity.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Velocity.js combines the best of jQuery and CSS transitions. It rates close to &lt;a href="https://github.com/julianshapiro/velocity"&gt;17K stars on GitHub&lt;/a&gt; and boasts of prominent users like WhatsApp and &lt;a href="https://www.codeinwp.com/blog/mailchimp-alternatives/"&gt;Mailchimp&lt;/a&gt;. Looping, reversing, delaying, hiding/showing elements, property math (+, -, *, /), and hardware acceleration, all form part of the features.&lt;/p&gt;

&lt;p&gt;You can use Velocity.js to scroll &lt;a href="https://www.codeinwp.com/blog/best-cross-browser-testing-tools/"&gt;browser windows&lt;/a&gt;. It can work both with jQuery loaded in your browser and independent of it, and even undo previous animations.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;a href="https://popmotion.io/pure"&gt;Popmotion&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BDQcEOR6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/popmotion-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BDQcEOR6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/popmotion-1.jpg" alt="JavaScript libraries: Popmotion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At close to &lt;a href="https://github.com/popmotion/popmotion"&gt;18K stars&lt;/a&gt;, Popmotion is a functional animation library for any JavaScript environment. It can work with just about any API that accepts numbers as inputs such as &lt;a href="https://www.codeinwp.com/blog/react-best-practices/"&gt;React&lt;/a&gt;, Three.js, A-Frame and PixiJS.&lt;/p&gt;

&lt;p&gt;Popmotion weighs only 11.7kB, but packs a punch nevertheless. It features animations like keyframes, decay, timeline for synchronizing multiple instances and more. You can stagger any series of animations or functions, as well as use pure functions to compose your own configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;a href="https://threejs.org/"&gt;Three.js&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OhoQiqJc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/threejs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OhoQiqJc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/threejs.jpg" alt="JavaScript libraries: Three.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three.js tops this list of JavaScript animation libraries with &lt;a href="https://github.com/mrdoob/three.js"&gt;60K+ stars on GitHub&lt;/a&gt;. It’s dependent on &lt;a href="https://get.webgl.org/"&gt;WebGL&lt;/a&gt; to create and render 3D animations in the browser.&lt;/p&gt;

&lt;p&gt;There’s a ton of documentation to help you, and once you get past the learning curve, there’s not much you cannot accomplish using this library. Firstly, using the Three.js editor, you create a scene. Thereafter, you get to add geometrical figures, and adjust lighting and camera. The material, texture, object, color and fogging can all be tweaked, and the final file published to your project.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;a href="https://greensock.com/gsap/"&gt;GreenSock JS&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5whbbo8I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/gsap.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5whbbo8I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/gsap.jpg" alt="JavaScript libraries: Greensock"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GreenSock’s GSAP works with a set of small JavaScript files that make animations look great in all major browsers. It smoothly chains multiple animation properties and eliminates browser bugs.&lt;/p&gt;

&lt;p&gt;GSAP actions include creating animations on Canvas and animating any object in a scene. Also progressively revealing, morphing or moving any object along a path. For this purpose, it works with a bunch of software applications like SVGPlugins, PixiPlugin, WebGL, Adobe Animate and EaseJS. Its modular structure helps you choose just the functions you need. With 8 million users and 10K+ stars on &lt;a href="https://github.com/greensock/GSAP"&gt;GitHub&lt;/a&gt;, this powerful library has a lot going for it.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;a href="http://anijs.github.io/"&gt;AniJS&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z-IrJo4V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/anijs-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z-IrJo4V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/anijs-1.jpg" alt="JavaScript libraries: AniJS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Among the JavaScript libraries in this list, AniJS is somewhat unique. It allows you to add animations to elements in a simple ‘sentence-like’ structure, great for folks new to animation. What’s more, its non-specific nature allows almost everyone to use it in routine UX design.&lt;/p&gt;

&lt;p&gt;On &lt;a href="https://github.com/anijs/anijs"&gt;GitHub&lt;/a&gt;, AniJS rates more than 3.5K stars. It does not rely on any third-party library and generally helps to speed up development. It works just as well on Android and iOS, and also in all the popular browsers.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. &lt;a href="https://mojs.github.io/"&gt;Mo.js&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TtfzpEdv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/mojs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TtfzpEdv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/mojs.jpg" alt="JavaScript libraries: Mo.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Motion graphics has a big part to play in animations, and Mo.js is one option with which you can make an impact. With a number of tutorials and demos to help out, beginners may not find it hard to create geometrical shapes and time animations to the dot.&lt;/p&gt;

&lt;p&gt;The APIs may appear simple, but there’s a lot you can do with them. Within the toolkit, you’ll find a Curve Editor and Timeline Editor to help you build your animations, as well as a Player to control your animations. There are different modules for staggering, easing, timeline and more. All this earns Mo.js close to 16K stars on &lt;a href="https://github.com/mojs"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. &lt;a href="http://maxwellito.github.io/vivus/"&gt;Vivus.js&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rgl6DupY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/vivus-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rgl6DupY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/vivus-1.jpg" alt="JavaScript libraries: Vivus.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you wish to mimic a pen drawing on a screen in real-time, you’ll hit the mark with Vivus. It lets you animate SVGs giving the impression of being drawn. Since it has no dependencies, it’s fast and lightweight.&lt;/p&gt;

&lt;p&gt;You can choose any of the available animations – Delayed, Sync or OneByOne. Else, you can also create a custom script to draw your SVG. For more flexibility, you can override the animation of each path using a simple JavaScript function. More than 13K users give a thumbs-up to this &lt;a href="https://github.com/maxwellito/vivus#vivusjs"&gt;library on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. &lt;a href="https://scrollrevealjs.org/"&gt;ScrollReveal JS&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xPCxoeKd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/ScrollReveal.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xPCxoeKd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/ScrollReveal.jpg" alt="JavaScript libraries: ScrollReveal JS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you wish to animate your web elements as they scroll into view, ScrollReveal won’t disappoint. This easy to learn animation library has zero dependencies and 18.5K+ stars on &lt;a href="https://github.com/jlmakes/scrollreveal"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;ScrollReveal supports different types of effects and works well with web and mobile browsers. It intentionally works with a bare-bones configuration, so you can use it as a canvas for your creativity. To maximize the effect of the animations, the creators advise that you use it sparingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. &lt;a href="https://mattboldt.com/demos/typed-js/"&gt;Typed.js&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SE9QusLW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/typed-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SE9QusLW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/typed-1.jpg" alt="JavaScript libraries: Typed.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Typed.js is a simple library (more of a plugin, really) to animate typing on your screen. Once you enter any string, a visitor can watch it being typed at a set speed. Not only that, you can work the backspace button, as well as begin a new sentence. If you wish to allow visitors with JS disabled to also view it, you simply need to place an HTML div on the page. That way, bots and search engines also get to view the typed words.&lt;/p&gt;

&lt;p&gt;This library rates 9.5K+ stars on &lt;a href="https://github.com/mattboldt/typed.js"&gt;GitHub&lt;/a&gt;. Power users include Slack and Envato.&lt;/p&gt;

&lt;h3&gt;
  
  
  11. &lt;a href="http://airbnb.io/lottie/#/"&gt;Lottie by AirBnB&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zTrhcU86--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/lottie-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zTrhcU86--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2020/05/lottie-1.jpg" alt="JavaScript libraries: Lottie"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lottie is a lightweight animated graphics format that balances high quality graphics against the cost of rendering them. It makes applications smaller and includes dynamic features. It can be used for web, Android, iOS and IoTs, without the need for additional software.&lt;/p&gt;

&lt;p&gt;Lottie can run on any browser that supports JavaScript. The animations are stored in plain text and are human readable. Since the text data is stored in the JSON format, it’s easily assimilated with any JavaScript environment. This makes it a popular animated graphics format to enhance mobile frontends. The android version alone enjoys close to &lt;a href="https://github.com/airbnb/lottie-android"&gt;30K stars on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>15+ Front-End Tools You Should Know About: My Favorite Finds for 2020</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Tue, 09 Jun 2020 12:28:17 +0000</pubDate>
      <link>https://dev.to/codeinwp/15-front-end-tools-you-should-know-about-my-favorite-finds-for-2020-554e</link>
      <guid>https://dev.to/codeinwp/15-front-end-tools-you-should-know-about-my-favorite-finds-for-2020-554e</guid>
      <description>&lt;p&gt;&lt;em&gt;This post was originally written by Louis Lazaris for CodeinWP&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you’re like many web developers in the industry, you probably discover new front-end tools every day. I’m in the same boat, especially since I’m deeply involved in regularly researching what’s new in the tools landscape.&lt;/p&gt;

&lt;p&gt;In this post, I’m going to round up (with some screenshots and demos) some of the most interesting front-end tools I’ve found that I think you’ll find useful. These aren’t necessarily the most popular tools or the hottest tools, but I think each of them is unique in their use case and deserve a little more attention. These are essentially my favorite finds from the past months in front-end tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/github/hotkey" rel="noopener noreferrer"&gt;Hotkey&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fhotkey-screen-1024x775.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fhotkey-screen-1024x775.png" title="Hotkey" alt="Hotkey"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Detecting keystrokes with JavaScript isn’t an overly complex task, but this little utility from the team at GitHub makes it super simple.&lt;/p&gt;

&lt;p&gt;With it you can trigger an action on an element with a keyboard shortcut.&lt;/p&gt;

&lt;p&gt;The types of shortcuts include a key, key combo, or even key sequence. You can also have multiple shortcuts for a single action.&lt;/p&gt;

&lt;p&gt;The JavaScript is just one declaration along with an import:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./hotkey.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-hotkey]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once that code is in place, the main work is done in the HTML. Here’s a list of links that I created to display some content depending on the shortcut used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#a"&lt;/span&gt; &lt;span class="na"&gt;data-hotkey=&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Example&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#b"&lt;/span&gt; &lt;span class="na"&gt;data-hotkey=&lt;/span&gt;&lt;span class="s"&gt;"Control+b"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Example&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#f"&lt;/span&gt; &lt;span class="na"&gt;data-hotkey=&lt;/span&gt;&lt;span class="s"&gt;"f,p"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Example&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#and"&lt;/span&gt; &lt;span class="na"&gt;data-hotkey=&lt;/span&gt;&lt;span class="s"&gt;"&amp;amp; *"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Example&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#enter"&lt;/span&gt; &lt;span class="na"&gt;data-hotkey=&lt;/span&gt;&lt;span class="s"&gt;"Enter"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Example&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the &lt;code&gt;data-hotkey&lt;/code&gt; attributes added to each of the links. These are what enable the hotkeys for the targeted actions (in this case, triggering a :target selector via CSS). Multiple hotkeys are separated by a comma; key combinations are separated by a plus symbol; and key sequences are separated by a space.&lt;/p&gt;

&lt;p&gt;Here’s a live demo:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/impressivewebs/embed/bGNowqO?height=600&amp;amp;default-tab=js,result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Try out each of the shortcuts and notice that the code in the JavaScript panel is minimal. Very simple to set up, once the module is imported. And as a side point here, if you have an app with multiple shortcut keys that you want to display in a modal window (as is done on Twitter, GitHub, etc.), you might want to check out &lt;a href="https://www.impressivewebs.com/demo-files/question-mark-js/" rel="noopener noreferrer"&gt;QuestionMark.js&lt;/a&gt;, an old project of mine.&lt;/p&gt;

&lt;p&gt;Of course, with keyboard shortcuts, you’ll want to take note of accessibility concerns so be sure to check out the repo’s README for info on that.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/ctrl-freaks/freezeframe.js/" rel="noopener noreferrer"&gt;Freezeframe.js&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Ffreezeframe-screen-1024x775.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Ffreezeframe-screen-1024x775.png" title="Front-End Tools: Freezeframe.js" alt="Freezeframe.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Embedding brief videos in web pages is common to show an action taking place. Sometimes an animated GIF is also appropriate. But GIFs tend to be distracting because they play their content automatically.&lt;/p&gt;

&lt;p&gt;This little utility allows you to add video-like functionality to animated GIFs embedded in your HTML.&lt;/p&gt;

&lt;p&gt;Once you include the Freezeframe.js source in your page, you need only a single JavaScript declaration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Freezeframe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.freezeframe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hover&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;overlay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you drop the second argument (e.g. &lt;code&gt;new Freezeframe('.freezeframe')&lt;/code&gt;) it will default to no play button and the animation triggers on hover. The only flaw with this is that, because it’s an animated GIF, you technically can’t “pause” it, you can only “stop” it (which means it starts again from the beginning). But usually with GIFs, this isn’t a big deal.&lt;/p&gt;

&lt;p&gt;Here’s a demo with three different examples:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/impressivewebs/embed/QWwqdar?height=600&amp;amp;default-tab=js,result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Using this tool alone, however, might not save on performance as it seems the full GIF loads behind the scenes. But I’m assuming this could be used along with a lazy load library if the GIF is off screen when the page loads.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.paciellogroup.com/toolkit/" rel="noopener noreferrer"&gt;ARC Toolkit&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Farctoolkit-screen-1024x775.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Farctoolkit-screen-1024x775.png" title="Front-End Tools: ARC Toolkit" alt="ARC Toolkit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your go-to front-end tools should include plenty of accessibility options.&lt;/p&gt;

&lt;p&gt;This is a Chrome extension that adds a tab to your developer tools to help you find accessibility errors and warnings related to the WCAG 2.1 Level A and AA guidelines.&lt;/p&gt;

&lt;p&gt;Two reasons why this tool is so great:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It integrates with your existing testing/debugging workflow inside the developer tools&lt;/li&gt;
&lt;li&gt;It’s made by the The Paciello Group, who are well known in the developer community for their accessibility insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Farc-toolkit-1024x458.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Farc-toolkit-1024x458.png" title="ARC Toolkit Features" alt="ARC Toolkit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the extension is installed, just choose the tab in your developer tools and select “Run Tests”. The initial output will be similar to what you see in the previous screenshot. From there you can drill down to view any potential accessibility problems related to a specific feature, as shown in the next screenshot:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Farc-toolkit-drilldown-1024x785.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Farc-toolkit-drilldown-1024x785.png" title="ARC Toolkit Features Drilldown" alt="ARC Toolkit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice the “Links” option on the left has the checkmark next to it. That’s what I’ve chosen to examine in this instance. This also adds an overlay on the page showing where all the selected objects are, as you can see above the developer tools on the live page.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://daybrush.com/scenejs/" rel="noopener noreferrer"&gt;Scene.js&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fscenejs-screen-1024x775.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fscenejs-screen-1024x775.png" title="Front-End Tools: Scene.js" alt="Scene.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every year there seems to be a new animation library of sorts on the front-end tools landscape.&lt;/p&gt;

&lt;p&gt;My pick for this year (so far) is Scene.js.&lt;/p&gt;

&lt;p&gt;This is not one you can just pick up and work with in a matter of minutes like the others featured so far.&lt;/p&gt;

&lt;p&gt;There’s a learning curve to get used to the API, which looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;scene&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Scene&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.searchbox&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;width: 50px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;70%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;width: 300px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.line&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;30%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;width: 0%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;width: 100%&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;easing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EASE_IN_OUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;exportCSS&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;toggle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;toggle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setDirection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;normal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reverse&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s the code for one of the &lt;a href="https://daybrush.com/scenejs/#examples" rel="noopener noreferrer"&gt;examples&lt;/a&gt; on the home page. It’s a simple little animated search box. Here’s their CodePen demo:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/impressivewebs/embed/eYmMLxb?height=600&amp;amp;default-tab=js,result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Again, this won’t be an easy tool to learn quickly, but if you’re interested in trying out a new animation library with what seems to be a pretty straightforward API, this might be a good option.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://commento.io/" rel="noopener noreferrer"&gt;Commento&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcommento-screen-1024x775.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcommento-screen-1024x775.png" title="Front-End Tools: Commento" alt="Commento"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The current privacy-aware online landscape could use more tools like this one. I’ve been considering options for improved commenting systems on my WordPress website for a while now and Commento looks solid.&lt;/p&gt;

&lt;p&gt;I like the functionality of something like Disqus (upvotes/downvotes, top comments, etc.) but it has too much bloat.&lt;/p&gt;

&lt;p&gt;I also like that WordPress comments are self-hosted by default, but they lack those extra features of Disqus. I think Commento is a step in the right direction to fix these problems.&lt;/p&gt;

&lt;p&gt;If you are considering switching from an existing commenting platform to Commento, it is quite a bit of work from what I’ve read, so that’s a big downside.&lt;/p&gt;

&lt;p&gt;Also, although Commento allows you to import from Disqus, you won’t be able to import the “votes” on old comments from Disqus or the avatars from the users who posted comments.&lt;/p&gt;

&lt;p&gt;There’s also no way to import old WordPress comments into Commento unless you first export to Disqus, then import from Disqus to Commento (which can be done using a Disqus import tool when you sign up for Commento).&lt;/p&gt;

&lt;p&gt;The final drawback is the fact that Commento is not free unless you self-host it. But when you consider the bloat and privacy issues of Disqus, the small monthly fee is worthwhile.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://githistory.xyz/" rel="noopener noreferrer"&gt;Git History&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fgithistory-screen-1024x775.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fgithistory-screen-1024x775.png" title="Front-End Tools: Git History" alt="Git History"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although this is not solely in the front-end tools category, it’s one of my favorites on this list because of its simplicity and novelty in the way it works.&lt;/p&gt;

&lt;p&gt;Git History allows you to view the history for any file in a public Git repo (GitHub, GitLab, or Bitbucket).&lt;/p&gt;

&lt;p&gt;For example, let’s say you want to view the history of changes to the source file for Normalize.css. The file is located at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.com/necolas/normalize.css/blob/master/normalize.css&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In order to view its history, replace &lt;code&gt;github.com&lt;/code&gt; in the URL with &lt;code&gt;github.githistory.xyz&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.githistory.xyz/necolas/normalize.css/blob/master/normalize.css&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The output at the new URL loads up a neat, interactive way to view the file’s changes over time. Some cool animations are triggered every time you choose a history point, allowing you to see which changes took place and which user committed them.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://chrome.google.com/webstore/detail/css-feature-toggles/aeinmfddnniiloadoappmdnffcbffnjg" rel="noopener noreferrer"&gt;CSS Feature Toggles&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcsstoggles-screen-1024x775.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcsstoggles-screen-1024x775.png" title="Front-End Tools: CSS Feature Toggles" alt="CSS Feature Toggles"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re still working in an environment where you have to do some legacy browser testing, this might be a nice little Chrome extension to add to your testing toolbox.&lt;/p&gt;

&lt;p&gt;CSS Feature Toggles, similar to ARC Toolkit mentioned above, adds a new tab to your browser’s developer tools.&lt;/p&gt;

&lt;p&gt;In the tab, you’ll notice a list of modern CSS features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcsstoggles-1024x407.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcsstoggles-1024x407.png" title="CSS Features Available to Toggle" alt="CSS Feature Toggles"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can toggle these to instantly see how your page looks when a user visits the page in a browser that doesn’t support that particular feature. This is a great way to get a quick overview of how your layouts degrade in older environments.&lt;/p&gt;

&lt;p&gt;When selecting the different features, the page will update automatically to display the changes. A site built with Flexbox, for example, will benefit from some older CSS to keep the layout sane while progressively enhancing in newer browsers.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://createapp.dev/" rel="noopener noreferrer"&gt;Create App&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcreateapp-screen-1024x723.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcreateapp-screen-1024x723.png" title="Front-End Tools: Create App" alt="Create App"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No doubt your front-end tools workflow includes plenty of options for builds. This website is a combination of a learning site and a project generation tool for developers using (or wanting to learn how to use) webpack or Parcel, the popular asset bundlers.&lt;/p&gt;

&lt;p&gt;Drill down into the categories on the left to choose the options you want for your build, then see the necessary files and configuration options appear in the main window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcreateapp-1024x631.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcreateapp-1024x631.png" title="Create App Configuration Options" alt="Create App"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The page is fully interactive, so you can click on any of the virtual files to view their contents, or you can hover over a selected option to view a description along with highlighted portions of the build that are relevant to that option.&lt;/p&gt;

&lt;p&gt;Very useful both for learning and for creating new projects!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://cssjanus.github.io/" rel="noopener noreferrer"&gt;CSSJanus&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcssjanus-screen-1024x773.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcssjanus-screen-1024x773.png" title="Front-End Tools: CSS Janus" alt="CSSJanus"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the area of internationalization, this is an online tool that allows you to convert stylesheets from left-to-right to right-to-left, and vice-versa.&lt;/p&gt;

&lt;p&gt;This allows you to easily create stylesheets for right-to-left (rtl) languages like Arabic and Hebrew.&lt;/p&gt;

&lt;p&gt;Here’s a CSS example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.example&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5%&lt;/span&gt; &lt;span class="m"&gt;100px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;ne-resize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above will get converted to the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.example&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;95%&lt;/span&gt; &lt;span class="m"&gt;100px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;nw-resize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that the differences include not only lines like &lt;code&gt;float: left&lt;/code&gt; and &lt;code&gt;text-align: left&lt;/code&gt; but others like horizontal &lt;code&gt;padding&lt;/code&gt; declarations and &lt;code&gt;background-position&lt;/code&gt; values.&lt;/p&gt;

&lt;p&gt;And usefully, if you want the tool to ignore a style block or a single declaration, you can use the &lt;code&gt;@noflip&lt;/code&gt; directive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* @noflip */&lt;/span&gt; &lt;span class="nc"&gt;.ignored&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.not-ignored&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c"&gt;/* @noflip */&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;poster-ltr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;png&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;a href="https://github.com/lokesh/color-thief" rel="noopener noreferrer"&gt;Color Thief&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcolorthief-screen-1024x773.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fcolorthief-screen-1024x773.png" title="Front-End Tools: Color Thief" alt="Color Thief"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Color Thief is really neat and fairly simple to use but is very specific in its use cases.&lt;/p&gt;

&lt;p&gt;Basically, using this utility, you can use JavaScript to grab a color palette of anywhere from 2 to 20 colors based on a given image.&lt;/p&gt;

&lt;p&gt;This isn’t something you’ll use on every website or app, but it’s a nice idea and apparently has been around for a while and was updated over the past year.&lt;/p&gt;

&lt;p&gt;Using the simple API, you can grab a palette from the image with a single line:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;let myPalette = colorThief.getPalette(img, 10);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;From there, it’s just a matter of manipulating the array that’s returned. You can see a demo I built in CodePen below that grabs a user-entered number of colors from the image shown. The code I’m using on the array is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;myPalette&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;div class='color' style='background-color: rgb(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;)'&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’m building the palette using &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; elements and inline styles. The colors are returned as RGB values.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/impressivewebs/embed/dyPJZEy?height=600&amp;amp;default-tab=js,result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In the CodePen demo, I’m using a workaround to get around the cross-origin problems I ran into on CodePen, but normally you won’t need those lines (commented) in a customary environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://regex.guide/" rel="noopener noreferrer"&gt;RegexGuide&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fregexguide-screen-1024x773.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2020%2F01%2Fregexguide-screen-1024x773.png" title="Front-End Tools: RegexGuide" alt="RegexGuide"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It seems like every year I find a cool interactive app to add to my collection of front-end tools that helps build regular expressions, so here’s this year’s entry. And if you’re like me, you’ll take all the help you can get building these.&lt;/p&gt;

&lt;p&gt;This one is a little odd to get your head around at first because it goes through the steps one by one, like a wizard.&lt;/p&gt;

&lt;p&gt;When you’re done and have all conditions in place, you’re able to try different values to meet the specified conditions and the page will interactively indicate what works.&lt;/p&gt;

&lt;p&gt;These kinds of tools are always some of my favorites because they work not only as a way to create code that would otherwise be tedious, but they help you learn the syntax too.&lt;/p&gt;

&lt;h3&gt;
  
  
  Front-end tools: honorable mentions
&lt;/h3&gt;

&lt;p&gt;So those are, in my opinion, some of the more interesting front-end tools I’ve found that I think didn’t get enough attention over the past year. I’m sure you have your own such finds so feel free to drop them in the comments below. Meantime, here’s a final list of stuff that didn’t quite make the main list but I thought were worth mentioning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://wehatecaptchas.com/" rel="noopener noreferrer"&gt;wehatecaptchas&lt;/a&gt; - A captcha alternative with no image or letter/number deciphering, not even a checkbox to “confirm I’m not a robot”&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://simpleparallax.com/" rel="noopener noreferrer"&gt;simpleParallax&lt;/a&gt; – An easy way to do parallax effects with JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/paulirish/lite-youtube-embed" rel="noopener noreferrer"&gt;Lite YouTube Embed&lt;/a&gt; – Apparently 224X faster than the traditional embed code.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://browserdefaultstyles.com/" rel="noopener noreferrer"&gt;Browser Default Styles&lt;/a&gt; – Enter any HTML element and this tool will tell you each browser’s default CSS for that element.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://whocanuse.com/" rel="noopener noreferrer"&gt;Who Can Use&lt;/a&gt; – Enter a two-color combination and this tool will tell you which kinds of visually impaired users can use that combo for text/background.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>20+ Best React UI Component Libraries / Frameworks for 2020</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Fri, 17 Jan 2020 12:22:17 +0000</pubDate>
      <link>https://dev.to/codeinwp/20-best-react-ui-component-libraries-frameworks-for-2020-1nn9</link>
      <guid>https://dev.to/codeinwp/20-best-react-ui-component-libraries-frameworks-for-2020-1nn9</guid>
      <description>&lt;p&gt;React is open-source JavaScript library that helps you build a top interface for both the web as well as mobile apps. It combines conveniently with &lt;a href="https://www.codeinwp.com/blog/angular-vs-vue-vs-react/"&gt;other JavaScript frameworks and libraries&lt;/a&gt; and contains tiny, standalone bits of code called components. It’s these components that are going to be in the spotlight in this list of Best React UI component libraries and frameworks.&lt;/p&gt;

&lt;p&gt;The nice thing about components is that they’re modular without many app-specific dependencies. This means that you get to reuse the components to build awesome apps and interfaces super fast. And thanks to &lt;a href="https://bitsrc.io/"&gt;Bit&lt;/a&gt;, you can share them with other React enthusiasts too.&lt;/p&gt;

&lt;p&gt;Before you start your next project with React, take a few minutes to scan this list of best React UI component libraries that can help you create an awesome looking UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best React UI component libraries and frameworks in 2020
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.creative-tim.com/product/material-kit-react/?partner=91096"&gt;Material Kit React&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xzn_MSuB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:334/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/06/Material-Kit-React.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xzn_MSuB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:334/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/06/Material-Kit-React.jpg" alt="Material Kit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Created with inspiration from Google’s material design, Material Kit React builds a set of elements that put consistency as the main feature. That way, your web project retains a similarity in appearance and functions all through.&lt;/p&gt;

&lt;p&gt;The general layout resembles multiple sheets of paper. This imparts a depth and order to the layouts. Three example pages are included. Not only will these pages illustrate what’s possible with this kit, they also serve as templates where you can substitute text and images with your own.&lt;/p&gt;

&lt;p&gt;The kit also contains a number of basic elements such as buttons, badges, sliders, menu, pagination, navigation bars, tabs and pills. You’ll be able to customize the style, size and color for most elements. The JavaScript elements include Modals, tooltips, date-time picker, carousels and popovers. Besides using the kit to start a new project, you can also restyle any old Bootstrap project. The &lt;a href="https://www.creative-tim.com/product/material-kit-pro-react/?partner=91096"&gt;Pro version&lt;/a&gt; contains a lot more components, sections and example pages. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://designrevision.com/downloads/shards-react/"&gt;Shards React&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dSMixLeL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:354/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/shards.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dSMixLeL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:354/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/shards.jpg" alt="Shards React"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shards React is an open source, modern React UI kit that’s built from scratch and geared towards fast performance. The modern design system allows you to change many things. What’s more, you can download the source files to change things at code level too. The SCSS used for styling only enhances developer experience.&lt;/p&gt;

&lt;p&gt;This library is based on &lt;a href="https://designrevision.com/downloads/shards/"&gt;Shards&lt;/a&gt;, and uses &lt;a href="https://reactdatepicker.com/"&gt;React Datepicker&lt;/a&gt;, &lt;a href="https://www.npmjs.com/package/react-popper"&gt;React Popper&lt;/a&gt; (a positioning engine) and &lt;a href="https://refreshless.com/nouislider/download/"&gt;noUIShlider&lt;/a&gt;. It supports Material and Fontawesome icons. The Shards Pro package has 15 pre-made pages that help you get started. Helpfully, these pages use blocks that you can move around.&lt;/p&gt;

&lt;p&gt;With ~270 stars on &lt;a href="https://github.com/DesignRevision/shards-react"&gt;Github&lt;/a&gt;, it also includes dozens of custom components such as range sliders and toggle inputs. The 350+ components ensure that you can build almost every type of website with Shards React.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://material-ui.com/"&gt;Material-UI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---stZtEK6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:394/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/material-ui.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---stZtEK6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:394/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/material-ui.jpg" alt="Material-UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With close to a whopping 45K stars on &lt;a href="https://github.com/mui-org/material-ui"&gt;Github&lt;/a&gt;, Material-UI ranks among the most popular React UI component libraries. The components rely on React, but use Google’s Material Design. For those of you who need filling in, material design takes inspiration from the physical world and textures while keeping the actual UI elements to a minimum.&lt;/p&gt;

&lt;p&gt;A wide range of helpful components are available, like app bars, auto complete, badges, buttons, cards, dialog boxes, icons, menus, sliders and more. Helpfully, Material-UI also offers &lt;a href="https://www.codeinwp.com/blog/best-free-bootstrap-templates-for-reactjs/"&gt;React themes and templates&lt;/a&gt;, so you can have a custom color theme for your app.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://react-bootstrap.github.io/"&gt;React Bootstrap&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ybvf-N9P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:335/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/react-bootstrap.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ybvf-N9P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:335/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/react-bootstrap.jpg" alt="React-Bootstrap"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next on our list of React UI component libraries is React Bootstrap, a UI kit that retains it’s Bootstrap core. In order to give you more control over the form and function of each component, it replaces Bootstrap’s JavaScript with React. Each component is built to be easily accessible, important for front-end framework building.&lt;/p&gt;

&lt;p&gt;And since React Bootstrap doesn’t deviate much from its Bootstrap origins, developers can choose from the thousands of &lt;a href="https://www.codeinwp.com/blog/best-bootstrap-4-templates/"&gt;Bootstrap themes&lt;/a&gt; readily available. It’s earned 14500+ stars on &lt;a href="https://github.com/react-bootstrap/react-bootstrap"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="http://www.reactvirtualized.com/"&gt;React Virtualized&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cpAfMamT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:388/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/react-virtualized.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cpAfMamT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:388/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/react-virtualized.jpg" alt="React-Virtualized"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building a frontend that’s data heavy? React Virtualized may be the library you need to dip into. It includes numerous components for efficiently rendering large lists, tables and grids. For example, you’ll find masonry, columns, autosizers, direction sorters, window scrollers and more. Further, you can customize the tables by configuring the row heights, and display placeholders in the cells.&lt;/p&gt;

&lt;p&gt;Also, React Virtualized has very few dependencies and supports standard browsers, including recent mobile browsers for iOS and Android. It has 14,000+ stars on &lt;a href="https://github.com/bvaughn/react-virtualized"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.creative-tim.com/product/argon-design-system-react/?partner=91096"&gt;Argon Design System React&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MG9sG3PW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:407/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/argon-design-system.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MG9sG3PW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:407/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/argon-design-system.jpg" alt="Argon-Design-System"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This library offers a free design system for Bootstrap 4, React, and Reactstrap. It comes with 100 modern and gorgeous elements that are implemented in a fully-functional code, so you can switch from a page to the actual website effortlessly.&lt;/p&gt;

&lt;p&gt;The Argon Design System offers &lt;a href="https://demos.creative-tim.com/argon-design-system-react/#/landing-page?ref=creativetim/?partner=91096"&gt;pre-built example pages&lt;/a&gt; and a handful of variations for all the components such as colors, styles, hover, and focus.&lt;/p&gt;

&lt;p&gt;Take a sneak peek at the &lt;a href="https://demos.creative-tim.com/argon-design-system-react/#/?ref=creativetim/?partner=91096"&gt;entire set of components&lt;/a&gt;, featuring basic elements, typography, navbars, alerts, images, icons, Javascript components, and more. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://blueprintjs.com/"&gt;Blueprint&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--517u_qbO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:407/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/blueprintjs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--517u_qbO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:407/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/blueprintjs.jpg" alt="Blueprint"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The React components in Blueprint are primarily for use on desktop applications. These components are particularly suitable for building complex and data-dense interfaces. From the component library, you can pick up bits of code for generating and displaying icons, for interacting with dates and times, for picking timezones and more.&lt;/p&gt;

&lt;p&gt;What else is in this components library? A lot really – breadcrumbs, buttons, callouts, cards, divider, navbars, tabs, tags and much more. On &lt;a href="https://github.com/palantir/blueprint"&gt;Github&lt;/a&gt;, it clocks 13,000+ stars.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://react.semantic-ui.com/"&gt;Semantic UI React&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eLXb2UBr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:415/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/semantic-ui.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eLXb2UBr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:415/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/semantic-ui.jpg" alt="Semantic-UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Semantic UI uses human-friendly HTML for it’s development framework, and has integrations with React, Angular, Meteor, Ember and many other frameworks. All jQuery functionality has been re-implemented in React.&lt;/p&gt;

&lt;p&gt;It allows you to load any Semantic UI CSS theme on top of your Semantic UI React app. What’s more, you’ll also have complete access to the markup, which means there’s flexibility in customizing components. It’s star count on &lt;a href="https://github.com/Semantic-Org/Semantic-UI-React"&gt;Github&lt;/a&gt; is near 9,000.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="http://react-toolbox.io/"&gt;React Toolbox&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mUmvvy-5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:362/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/react-toolbox.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mUmvvy-5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:362/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/react-toolbox.jpg" alt="React Toolbox"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another React UI components library that you can use to implement Google’s material design principles in your project is React Toolbox. React Toolbox relies on &lt;a href="https://github.com/css-modules/css-modules"&gt;CSS modules&lt;/a&gt; for this purpose. Though you can use any module bundler, it integrates neatly with &lt;a href="http://webpack.github.io/"&gt;webpack&lt;/a&gt; workflow. Thoughtfully, the team at React Toolbox provides visitors with an in-browser editor where you can experiment with the components in real-time.&lt;/p&gt;

&lt;p&gt;While working with React Toolbox, you can choose to import components in bundles or raw components. The difference is, for the former, the components come with all necessary dependencies and themes injected for you. This means that the CSS for each dependency will be available in your final CSS automatically. On the contrary, with raw components, no CSS is included. This means you’ll have to provide a theme via properties to the component to be properly styled. React Toolbox is reaching the 8,500 mark on &lt;a href="https://github.com/react-toolbox/react-toolbox/"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="http://reactdesktop.js.org/"&gt;React Desktop&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fD7D1Enp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:445/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/react-desktop.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fD7D1Enp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:445/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/react-desktop.jpg" alt="React Desktop"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our next components library, React Desktop uses macOS, Sierra and Windows 10 components with the aim of bringing a native desktop experience to the web.&lt;/p&gt;

&lt;p&gt;This collection is a JavaScript library built on top of &lt;a href="https://reactjs.org/"&gt;Facebook’s React&lt;/a&gt; library and it’s compatible with any &lt;a href="https://www.codeinwp.com/blog/learning-javascript-for-wordpress/"&gt;JavaScript based project&lt;/a&gt;. This tool crosses the 8,000 star rating on &lt;a href="https://github.com/gabrielbull/react-desktop"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://onsen.io/react/"&gt;Onsen UI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QpAp-Ffd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:431/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/onsen-ui.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QpAp-Ffd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:431/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/onsen-ui.jpg" alt="Onsen UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case you’re into creating cross platform mobile apps, you’ll be interested in this offering on our list of React UI component libraries. Onsen UI is a mobile app development framework that uses HTML5 and JavaScript and provides integration with Angular, Vue.js and React. All the components are auto-styled based on the platform, and so it supports both iOS and Android using the same source code.&lt;/p&gt;

&lt;p&gt;Onsen UI is compatible with many popular frameworks. An interactive tutorial helps you get a good start with this tool. The component library employs pure CSS with no JavaScript behavior. For some extra details, custom elements help out. The star count on &lt;a href="https://github.com/OnsenUI/OnsenUI"&gt;Github&lt;/a&gt; exceeds 7,000.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://evergreen.segment.com/"&gt;Evergreen&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qepavhBd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:392/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/evergreen.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qepavhBd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:392/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/evergreen.jpg" alt="Evergreen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Evergreen contains a set of React components that’s suitable for enterprise-grade web applications. Since it uses &lt;a href="https://github.com/segmentio/ui-box"&gt;React Primitive&lt;/a&gt;, it’s highly flexible. At the same time, it works just as easily right out of the box.&lt;/p&gt;

&lt;p&gt;It includes a wide range of components and tools starting from basic layouts, typography, colors and icons to function-based components such as dropdowns, toggles, file uploads and feedback indicators. After installing the Evergreen package, you can pick and choose the components you want to import. It scores a 7,000+ star rating on &lt;a href="https://github.com/segmentio/evergreen"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://reactstrap.github.io/"&gt;Reactstrap&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xCkMfUGL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:323/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/reactstrap.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xCkMfUGL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:323/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/reactstrap.jpg" alt="Reactstrap"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For simple React Bootstrap 4 components, check out Reactstrap. It comes with two primary distribution versions. One, a basic version that excludes optional dependencies. This gives you more flexibility in configuring required dependencies.&lt;/p&gt;

&lt;p&gt;The second version is the full version that includes all the optional dependencies. This one is recommended for smaller applications. Reactstrap is yet another collection in the React UI components library that crosses the 7,000 star mark on &lt;a href="https://github.com/reactstrap/reactstrap"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://rebassjs.org/"&gt;Rebass&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zn0dmCc7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:450/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/rebass.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zn0dmCc7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:450/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/rebass.jpg" alt="Rebass"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rebass contains only eight foundational components, all in a super-small file. The components are extensible and themable, and built for responsive web design.&lt;/p&gt;

&lt;p&gt;The components use styled-system and serve as a great starting point for extending into custom UI components for your app. The ThemeProvider can also help you with this. The star count on &lt;a href="https://github.com/rebassjs/rebass"&gt;Github&lt;/a&gt; is nearing 5,000.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://v2.grommet.io/"&gt;Grommet&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wEn1IOBI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:377/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/grommet.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wEn1IOBI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:377/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/grommet.jpg" alt="Grommet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grommet has a wide library of components in its kit and counts big names like Netflix and Boeing among its users. Whether your app is for phones or for wider screens displays, you’ll be able to design layouts. Accessibility is via keyboard or screen reader.&lt;/p&gt;

&lt;p&gt;Theming tools help with the customization for color, type and layout. This React UI components library rates a star count exceeding 4,000 on &lt;a href="https://github.com/grommet/grommet"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="http://elemental-ui.com/home"&gt;Elemental UI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DiSx2msr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:348/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/elemental-ui.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DiSx2msr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:348/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/elemental-ui.jpg" alt="Elemental UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Elemental UI provides a number of basic functional components for standalone use or in any combination, whether in default style or after theming. Some of the components include forms, buttons, cards and modals.&lt;/p&gt;

&lt;p&gt;The project is under development, but manages a 4,000+ star rating on &lt;a href="https://github.com/elementalui/elemental"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://rsuitejs.com/en/"&gt;RSUITE&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p2S4er_B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:388/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/rsuite.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p2S4er_B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:388/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/rsuite.jpg" alt="RSUITE"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RSUITE contains a range of component libraries for enterprise system products. It supports all major browsers and platforms as well as server-side rendering.&lt;/p&gt;

&lt;p&gt;If you’re at home with Less development, customizing the components should not pose any problem. The components in this library include icons, loaders, dividers, tooltips and more, and RSUITE has close to 2,500 stars on &lt;a href="https://github.com/rsuite/rsuite"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="http://nikgraf.github.io/belle/"&gt;Belle&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z6oqUD8G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:423/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/belle.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z6oqUD8G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:423/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/belle.jpg" alt="Belle"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Among the most interesting React UI component libraries, Belle offers a truly wide range of components. You can customize these components at two levels – the base level for all components collectively, as well as each component individually.&lt;/p&gt;

&lt;p&gt;The components come with support for mobiles and ARIA support. The way to go about using Belle is to first set up a simple app with React, and then import any Belle component and begin using it right away. This component library has more than 2,300 stars on &lt;a href="https://github.com/nikgraf/belle/"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://react-md.mlaursen.com/"&gt;React-md&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3EXtwRrF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:421/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/react-md.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3EXtwRrF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:421/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/react-md.jpg" alt="react-md"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One more React UI components library that you should consider if you want to implement material design in your project is React-md. It gives you a choice of React components that work with Sass. For this purpose, there’s a separation of styles in Sass in lieu of inline styling. This makes it easier for you to customize components in line with existing styles.&lt;/p&gt;

&lt;p&gt;Colors and typography can be customized and the detailed documentation will help you get past the basics. On &lt;a href="https://github.com/mlaursen/react-md"&gt;Github&lt;/a&gt;, React-md counts close to 2,000 stars. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.primefaces.org/primereact/"&gt;PrimeReact&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3ST_LncJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:400/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/primereact.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3ST_LncJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:400/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/primereact.jpg" alt="PrimeReact"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This list of React UI component libraries would not be complete without PrimeReact. It provides components to cover almost all basic interface requirements such as input options, menus, data presentation, messages and more.&lt;/p&gt;

&lt;p&gt;It pays attention to mobile experience, too, with touch-optimized responsive design elements. There are a number of templates and themes that allow you to customize and choose between flat and material design. This component library is nearing 800 stars on &lt;a href="https://github.com/primefaces/primereact"&gt;Github&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.telerik.com/kendo-react-ui/"&gt;KendoReact&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rv_ap9Rd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:376/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/kendoreact.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rv_ap9Rd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://iotvnaw69daj.i.optimole.com/w:702/h:376/q:90/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/02/kendoreact.jpg" alt="KendoReact"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unlike the foregoing React UI component libraries, KendoReact is a premium set of components, with licenses starting at $799. It boasts an impressive client list that includes Microsoft, NASA and Sony. And you too can use it to create fast and feature-rich apps with impressive UI.&lt;/p&gt;

&lt;p&gt;The component set is built specifically for React development. This ensures zero dependencies and all the components are fully optimized for React. Plus, if you’ve got an existing component library, you can simply add to it from KendoReact without having to rewrite the whole library.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>5 Email Scripts to Crank Out the Perfect Follow Up Email to an Unresponsive Client</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Thu, 21 Nov 2019 13:48:20 +0000</pubDate>
      <link>https://dev.to/codeinwp/5-email-scripts-to-crank-out-the-perfect-follow-up-email-to-an-unresponsive-client-57dl</link>
      <guid>https://dev.to/codeinwp/5-email-scripts-to-crank-out-the-perfect-follow-up-email-to-an-unresponsive-client-57dl</guid>
      <description>&lt;p&gt;If you’re a freelancer, contractor, or &lt;a href="https://www.codeinwp.com/blog/best-web-hosting-for-small-business/"&gt;small business owner&lt;/a&gt;, working with clients can be one of the most challenging parts of your job. This is especially true when those clients become mysteriously unresponsive. When this happens, you’ll need to be vigilant in sending a follow-up email. And this is where some handy email scripts come into play.&lt;/p&gt;

&lt;p&gt;When written with a little thought and foresight, the right follow up email can produce quick results.&lt;/p&gt;

&lt;p&gt;If you’re not sure how to do this, don’t worry! Seeing a few examples and understanding how (and why) they work is usually all you’ll need to start using this tactic effectively in your business.&lt;br&gt;
In this post, we’re going to introduce five common situations involving unresponsive clients.&lt;/p&gt;

&lt;p&gt;For each, we’ll provide a sample follow up email, and explain why it’s likely to produce results. Let’s start at the top!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it pays to design a carefully-worded follow up email
&lt;/h2&gt;

&lt;p&gt;When it comes to creating email scripts, it’s well worth your time to design them carefully. A hastily-sent email can do more harm than good, so you’ll want to be strategic.&lt;/p&gt;

&lt;p&gt;This involves a number of considerations. You’ll want to think about the action you’d like the recipient to take, and how you can gently (yet firmly) encourage them in that direction. In addition, it’s vital to pay attention to every single word you use. Tone and intent matter just as much here as content – especially when you’re dealing with an unresponsive or difficult client.&lt;/p&gt;

&lt;p&gt;Writing solid email scripts that return results takes practice. However, to get you started, we’re going to present a number of examples you can use and learn from.&lt;/p&gt;

&lt;p&gt;We’ve worked with a lot of challenging and hard-to-contact clients over the years, and what follows are the types of emails we’ve found work best.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five email scripts you can use to follow up with unresponsive clients
&lt;/h2&gt;

&lt;p&gt;Let’s now take a look at the five scripts themselves! By using (and perhaps slightly tweaking) these emails yourself, you can greatly increase your chance of making successful connections.&lt;/p&gt;

&lt;p&gt;They’re in no order of importance or relevance, so you’re free to dip into whichever one takes your fancy first!&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Follow up after a proposal submission
&lt;/h2&gt;

&lt;p&gt;Few things are more frustrating then sending off a detailed proposal for a new project, and hearing nothing back. You’re ready and waiting to get started, and each day’s delay means one more day you’ll have to wait for payment once the project wraps up.&lt;/p&gt;

&lt;p&gt;The good news is that a lack of response to a proposal rarely means the client is unhappy with it or unwilling to move forward. On the contrary, they’ll usually let you know of this straightaway. Instead, you’ll often find they’ve been too busy to give it much thought, or even to fully read your email.&lt;/p&gt;

&lt;p&gt;In the words of Mercedes Cardona at &lt;a href="http://omhcommunications.com/index.html"&gt;OMH Communications&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Everybody gets far more email than they can read every day, and we’re all weeding out spam aggressively. Sometimes, a useful lead gets thrown out by mistake – it happens.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even so, you’ll certainly want to follow up with this client. You need to stay at the forefront of their minds, and remind them to take time out of their schedule to give your proposal the attention it deserves. Usually, a gentle nudge is all it will take:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Hi [Client name],&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;I was wondering if you've had a chance yet to look over our most recent proposal. [Brief, one-sentence summary of the proposal itself].&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;We're eager to hear your thoughts, and to get started on this project! Please let me know if you have any questions regarding the specifics of the proposal (as outlined in my previous email).&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This message opens with a polite acknowledgment of how busy the client is, and that you understand they may not have been able to give your proposal a thorough look yet. Then, it briefly reminds them of the proposal’s focus, so they don’t have to go back to the previous email in order to orient themselves.&lt;/p&gt;

&lt;p&gt;The second paragraph is the crucial element here. It’s a good idea to let the client know you’re excited about the project (even if you’re also feeling frustrated). This enthusiasm can be the push they need. Plus, by soliciting questions, you’re telling them they don’t need to immediately approve or reject your proposal, but are free to voice any queries or concerns they may have about it first.&lt;/p&gt;

&lt;p&gt;Of course, you’ll want to close the follow up email with your favorite sign-off phrase and your name. In addition, you should avoid terminology such as “there’s no rush” in this sort of message. While you want to remain polite and thoughtful, you also want to encourage the client to take action as soon as possible (your bank account is depending on it!).&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Reminder that you’re waiting on a response
&lt;/h2&gt;

&lt;p&gt;This may be the most common situation you find yourself in when dealing with unresponsive clients. You’re in the middle of some kind of project, and you can’t proceed further until the client answers a key question or provides a particular resource. Yet you’re met with radio silence.&lt;/p&gt;

&lt;p&gt;Following up promptly in this situation is in the best interests of both you and your client. After all, both of you want the project to carry on smoothly and &lt;a href="https://www.codeinwp.com/blog/time-management-wordpress-freelancers/"&gt;avoid wasting time&lt;/a&gt;. As with the previous scenario, it’s highly likely that the client did see your email, but forgot about it or has it marked to deal with later.&lt;/p&gt;

&lt;p&gt;This follow up email can be sent anywhere from a few days to a week after the prior communication, depending on the project’s urgency:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Hi [Client name],&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;I wanted to follow up, and see if you've had a chance to review my previous email. As I mentioned, [briefly restate the question or remind them of what you need].&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Once we have your answer, we'll be able to proceed straightaway to the next stage of the project. Let me know if I can provide any further clarification on what we need!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The first paragraph is structured in a similar way to our last example, which is deliberate. Here too, it’s important to acknowledge how busy the client is, and to avoid any air of impatience or frustration.&lt;/p&gt;

&lt;p&gt;Plus, reminding them briefly of your query lets them know exactly what you’re looking for. At the same time, you don’t want to get too detailed here, as the client can simply go back to the previous email to read over your full request.&lt;/p&gt;

&lt;p&gt;The next sentence is designed to let the client know (politely) the importance of this particular message. In other words, they may not have realized the lack of response has led to a roadblock on your end.&lt;/p&gt;

&lt;p&gt;Then, the offer to provide clarification wraps up this brief follow up email, while making it clear you’re ready and waiting to discuss anything unclear in your original message (thus delaying their response).&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Solicitation for new work
&lt;/h2&gt;

&lt;p&gt;Staying in close communication with your clients is always important. However, it’s never more essential than right after a project wraps up. It’s all too easy for a client to forget about you and move on to the next thing at this point – which is the last thing you’ll want.&lt;/p&gt;

&lt;p&gt;Therefore, if you’ve finished a project for a particular client and haven’t heard anything from them for a little while, you’ll want to send along a request for new work. The best approach to this email can vary a bit depending on the specific circumstances, but here’s an example of an effective message:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Hi [Client name],&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;As you know, we recently wrapped up [project name/description of project]. We hope you're happy with the results!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;We're eager to move forward with the next project – here's all we'll require from you:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;- [Brief list, in bullet point form, of necessary questions and/or requests for information or resources.]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Once we have this infraction, we can move forward to the next phase. Of course, please let me know if there are any questions I can answer as well.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This follow up email relies somewhat on the assumption that both you and your client are aware of your usual process, and have worked on multiple projects in the past. It may need a little personalization to reflect the type of projects you’re working on, but it provides a solid framework nonetheless.&lt;/p&gt;

&lt;p&gt;The first paragraph serves two purposes (besides simply being an introduction to the email). It reminds the client of the recently-completed project, and of their (hopefully) positive reaction to its quality. Remembering what a good job you did previously should whet their appetite for more of the same.&lt;/p&gt;

&lt;p&gt;Expressing your own eagerness to get started is always a good touch. However, the real star of the show here is the bullet point list of questions/requests. Listing out what you need from the client (instead of writing it all out in paragraph form) makes your requirements crystal-clear. It also increases the chances of getting a response to each specific inquiry.&lt;/p&gt;

&lt;p&gt;Wrap it all up with a nudge forward and a request for any questions the client might have, and you have a simple but effective follow up email on your hands.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Request for an overdue payment
&lt;/h2&gt;

&lt;p&gt;This one is a little tricky. Talking about money can be stressful, especially if you’re a creative who’d rather have nothing to do with the financial element of the business. This is even more pertinent when it comes to following up with a &lt;a href="https://www.codeinwp.com/blog/what-makes-a-client-good-or-bad/"&gt;difficult client&lt;/a&gt; who’s overdue on their payment.&lt;/p&gt;

&lt;p&gt;First and foremost, you’ll want to go into this communication as polite as possible. Don’t insinuate that the client is negligent, or start making threats. Instead, proceed with the assumption that the client has simply forgotten to pay. Even if there’s another reason for their delinquency, this approach can essentially guilt them into pulling out their wallet:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Hi [Client name],&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;I wanted to touch base, and remind you about the payment due on [date on invoice]. As of yet, we've not received your payment. Could you let us know when we can expect to receive it please?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It’s best to keep this type of follow up email short and sweet. You don’t want the key message to get overlooked. Plus, there’s no reason to throw in a bunch of qualifiers. Simply reminding them that payment is due – politely – often does the trick. However, you do want to give them all of the pertinent information, such as an invoice number, and the email it was sent to originally. The idea is to make payment as easy as possible.&lt;/p&gt;

&lt;p&gt;You can essentially repeat this email as many times as you feel necessary. However, if you still don’t receive a response, you may eventually need to get more forceful. Here’s a follow up email you might send if they fail to respond to a few messages like the one above:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Hi [Client name],&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;We have still not received your payment for [project name/description]. We'll be expecting the full invoice amount – [amount of payment] – by [new due date], or we'll potentially have to refer this matter to a collection agency.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is a firm and straightforward message, which is appropriate for a client who is both failing to pay and to respond. Giving them a reminder of the payment amount and a new due date may finally spur them into action.&lt;/p&gt;

&lt;p&gt;If not, you might have to cut your losses with this particular client and consider this a learning experience. Of course, you &lt;em&gt;can&lt;/em&gt; actually &lt;a href="https://www.entrepreneur.com/article/171218"&gt;hire a collection agency&lt;/a&gt; to follow up for you – but the hassle and fees involved make this a less desirable option unless the bill owed is very large.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The final email
&lt;/h2&gt;

&lt;p&gt;The previous follow up emails are designed to get a response whenever possible. However, sometimes a client simply goes quiet despite your best efforts.&lt;/p&gt;

&lt;p&gt;If you’ve sent several messages to a client and they just aren’t responding (and they don’t owe you any money), it’s time to send one last follow up email. It might look something like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Hi [Client name],&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;It's been some time since we've heard from you. At this point, we have to assume your priorities have changed, or you're taking your business in a different direction.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Please feel free to reach out in the future if we can be of any further assistance!&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This message accomplishes a few things. It’s polite and understanding for one, showing that you bear the client no ill will for their lack of response. Even if you don’t hear from them now, you’ll want to keep the relationship on as positive a note as possible.&lt;/p&gt;

&lt;p&gt;What’s more, making it clear you’re moving on this way plays on the client’s &lt;a href="https://revive.social/fear-of-missing-out-social-media/"&gt;fear of missing out (FOMO)&lt;/a&gt;. They should recognize that if they want to continue benefiting from your services, they’ll need to act quickly.&lt;/p&gt;

&lt;p&gt;Finally, you’ve made it clear you’re open to any future communications. It’s not uncommon to suddenly hear back from an old client months or years down the line, when priorities and personnel have changed. Wrapping your email up this way gives you the best possible shot of getting a response.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Unfortunately, there’s no way (yet!) to reach through your computer screen and make your client respond to a crucial message. However, sending a carefully-crafted follow up email can produce the results you’re looking for, while keeping your relationship on a positive note.&lt;/p&gt;

&lt;p&gt;In this article, we’ve introduced you to five email scripts you can use to chase up unresponsive clients:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Follow-up after a proposal submission.
2. A reminder that you’re waiting on a response.
3. Solicitation for new work.
4. Request for an overdue payment.
5. The final email.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Have you ever had success getting an unresponsive client to talk?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>writing</category>
    </item>
    <item>
      <title>How to Make Your Plugin Compatible With Gutenberg: Part 2 (Sidebar API)</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Thu, 19 Sep 2019 06:25:31 +0000</pubDate>
      <link>https://dev.to/codeinwp/how-to-make-your-plugin-compatible-with-gutenberg-part-2-sidebar-api-4onn</link>
      <guid>https://dev.to/codeinwp/how-to-make-your-plugin-compatible-with-gutenberg-part-2-sidebar-api-4onn</guid>
      <description>&lt;p&gt;If you’re trying to make your plugin compatible with Gutenberg, you have a couple of paths that you can/should take – depending on what your plugin does and how it delivers its features to the user.&lt;/p&gt;

&lt;p&gt;In the first part of this mini-series, &lt;a href="https://www.codeinwp.com/blog/adapt-your-plugin-for-gutenberg-block-api/" rel="noopener noreferrer"&gt;we explored Gutenberg’s Block API&lt;/a&gt; – which is what most plugins need in terms of Gutenberg-compatibility. This time, we will be exploring another piece of the Gutenberg puzzle – &lt;strong&gt;Gutenberg’s Sidebar API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Just to make sure we’re on the same page, a quick explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gutenberg’s Block API is very extensive and allows you to build almost everything as blocks, but, at times, it is not enough.&lt;/li&gt;
&lt;li&gt;Sidebar API, on the other hand, allows plugins to register a sidebar where they can take their functionality beyond blocks. The Sidebar is similar to Block Inspector.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.codeinwp.com/blog/build-for-gutenberg-how-others-do-it/" rel="noopener noreferrer"&gt;For example&lt;/a&gt;, Gutenberg Sidebar API in use as demonstrated by Yoast SEO:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2018%2F09%2FGutenberg-Sidebar-API.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2018%2F09%2FGutenberg-Sidebar-API.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Where can you use Sidebar API?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We recently worked on making our plugin – &lt;a href="https://themeisle.com/plugins/wp-product-review/" rel="noopener noreferrer"&gt;WP Product Review&lt;/a&gt; – ready for Gutenberg. WP Product Review used meta fields for adding review data to the post, and we couldn’t turn into a block for various backward-compatibility reasons. Hence, we used Sidebar API.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Here's the plugin's block in the classic editor:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2018%2F09%2FWP-Product-Review-Metabox-1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2018%2F09%2FWP-Product-Review-Metabox-1.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When users indicate that the post is a review with a sidebar toggle, they’ll be able to configure everything about their &lt;a href="https://www.codeinwp.com/blog/best-wordpress-review-plugins/" rel="noopener noreferrer"&gt;review box&lt;/a&gt; from the sidebar options.&lt;/p&gt;

&lt;p&gt;WP Product Review is one of the examples where Sidebar API can be useful. Another great example is the &lt;a href="https://wordpress.org/plugins/dropit/" rel="noopener noreferrer"&gt;Drop It&lt;/a&gt; plugin, which allows users to insert stock images from Unsplash and Giphy using the sidebar.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through the process of implementing something similar and making your plugin Gutenberg-compatible through Sidebar API.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Meta boxes are kind of ready for Gutenberg by default, but not quite&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s start with meta boxes. Let’s take a plugin that uses a simple meta box to deliver some functionality to the user on the editor screen.&lt;/p&gt;

&lt;p&gt;This can look like the following in the Classic Editor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2018%2F09%2FClassic-Editor-Meta-Field.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2018%2F09%2FClassic-Editor-Meta-Field.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use the following code to create such a meta box – it is also available in the &lt;a href="https://github.com/HardeepAsrani/hello-gutenberg/" rel="noopener noreferrer"&gt;Hello Gutenberg&lt;/a&gt; repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Register Hello Gutenbert Meta Box
 */
function hello_gutenberg_add_meta_box() {
    add_meta_box( 'hello_gutenberg_meta_box', __( 'Hello Gutenberg Meta Box', 'hello-gutenberg' ), 'hello_gutenberg_metabox_callback', 'post' );
}
add_action( 'add_meta_boxes', 'hello_gutenberg_add_meta_box' );

/**
 * Hello Gutenberg Metabox Callback
 */
function hello_gutenberg_metabox_callback( $post ) {
    $value = get_post_meta( $post-&amp;gt;ID, '_hello_gutenberg_field', true );
    ?&amp;gt;
    &amp;lt;label for="hello_gutenberg_field"&amp;gt;&amp;lt;?php _e( 'What\'s your name?', 'hello-gutenberg' ) ?&amp;gt;&amp;lt;/label&amp;gt;
    &amp;lt;input type="text" name="hello_gutenberg_field" id="hello_gutenberg_field" value="&amp;lt;?php echo $value ?&amp;gt;" /&amp;gt;
    &amp;lt;?php
}

/**
 * Save Hello Gutenberg Metabox
 */
function hello_gutenberg_save_postdata( $post_id ) {
    if ( array_key_exists( 'hello_gutenberg_field', $_POST ) ) {
        update_post_meta( $post_id, '_hello_gutenberg_field', $_POST['hello_gutenberg_field'] );
    }
}
add_action( 'save_post', 'hello_gutenberg_save_postdata' );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the question to ask here is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do we need to make this Gutenberg-compatible in the first place?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At this point, we should consider asking ourselves what Gutenberg-compatible is. For instance, if you use this very meta box in Gutenberg without making any changes to it, it will still work.&lt;/p&gt;

&lt;p&gt;However, when we talk about Gutenberg compatibility, we are not talking merely about the plugin working in the Gutenberg environment, but the plugin working &lt;em&gt;like Gutenberg&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;“Why?” – you’d ask. Quite simply, users who will start using WordPress after Gutenberg is the default editor will find the old ways to be counter-intuitive. Furthermore, they will expect a more Gutenberg-like style for everything in the editor.&lt;/p&gt;

&lt;p&gt;If you don’t provide users with a native feel, they will certainly look for alternatives that will work better with Gutenberg.&lt;/p&gt;

&lt;p&gt;Finally, let’s get our hands dirty with some code!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Getting started with Sidebar API&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We will start coding our Sidebar in Gutenberg to include our meta field. You can continue using the &lt;a href="https://github.com/HardeepAsrani/gutenberg-boilerplate" rel="noopener noreferrer"&gt;Gutenberg Boilerplate&lt;/a&gt; repository as a starting point.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Getting your meta box ready for Gutenberg&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Before we start, we first need to tell Gutenberg that we won’t be using our meta box in Gutenberg. You can do it by passing the __&lt;em&gt;back_compat_meta_box&lt;/em&gt; argument to the &lt;em&gt;add_meta_box&lt;/em&gt; function, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Register Hello Gutenberg Metabox
 */
function hello_gutenberg_add_meta_box() {
    add_meta_box( 'hello_gutenberg_meta_box', __( 'Hello Gutenberg Meta Box', 'hello-gutenberg' ), 'hello_gutenberg_metabox_callback', 'post',  array(
        '__back_compat_meta_box' =&amp;gt; false,
    ) );
}
add_action( 'add_meta_boxes', 'hello_gutenberg_add_meta_box' );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gutenberg Handbook has more details on how you can handle porting PHP meta boxes to Gutenberg (&lt;a href="https://developer.wordpress.org/block-editor/developers/backward-compatibility/meta-box/" rel="noopener noreferrer"&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;This will make sure that our old PHP meta boxes don’t appear in Gutenberg anymore. Now we also need to make our meta field ready for Gutenberg by adding it to WordPress REST API. You can add the following code to register the meta field with REST API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Register Hello Gutenberg Meta Field to Rest API
 */
function hello_gutenberg_register_meta() {
    register_meta(
        'post', '_hello_gutenberg_field', array(
            'type'      =&amp;gt; 'string',
            'single'    =&amp;gt; true,
            'show_in_rest'  =&amp;gt; true,
        )
    );
}
add_action( 'init', 'hello_gutenberg_register_meta' );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will add the _&lt;em&gt;hello_gutenberg_field&lt;/em&gt; to the &lt;strong&gt;meta&lt;/strong&gt; object in REST API.&lt;/p&gt;

&lt;p&gt;This function will only do the job of displaying our value in the REST API. Now we also need to add a method to update our meta field using REST API.&lt;/p&gt;

&lt;p&gt;The following code will add our custom route to WordPress REST API, which will be &lt;strong&gt;/hello-gutenberg/v1/update-meta/&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Register Hello Gutenberg Metabox to Rest API
 */
function hello_gutenberg_api_posts_meta_field() {
    register_rest_route(
        'hello-gutenberg/v1', '/update-meta', array(
            'methods'  =&amp;gt; 'POST',
            'callback' =&amp;gt; 'hello_gutenberg_update_callback',
            'args'   =&amp;gt; array(
                'id' =&amp;gt; array(
                    'sanitize_callback' =&amp;gt; 'absint',
                ),
            ),
        )
    );
}
add_action( 'rest_api_init', 'hello_gutenberg_api_posts_meta_field' );

/**
 * Hello Gutenberg REST API Callback for Gutenberg
 */
function hello_gutenberg_update_callback( $data ) {
    return update_post_meta( $data['id'], $data['key'], $data['value'] );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This REST API route will be used to modify our meta field from the Gutenberg sidebar. You can learn more about WordPress REST API and how to &lt;a href="https://developer.wordpress.org/rest-api/" rel="noopener noreferrer"&gt;register custom routes from here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Similarly, if you want to know what WordPress REST API is and how to get started, you can read our blog post: &lt;a href="https://www.codeinwp.com/blog/wordpress-rest-api/" rel="noopener noreferrer"&gt;WordPress REST API: What it is and how to get started using it&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Adding a sidebar block to Gutenberg&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s start with the Sidebar code from &lt;a href="https://github.com/HardeepAsrani/gutenberg-boilerplate/blob/master/src/sidebar.js" rel="noopener noreferrer"&gt;Gutenberg Boilerplate&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Internal block libraries
 */
const { __ } = wp.i18n;

const { Fragment } = wp.element;

const {
    PluginSidebar,
    PluginSidebarMoreMenuItem,
} = wp.editPost;

const { registerPlugin } = wp.plugins;

const Component = () =&amp;gt; (
    &amp;lt;Fragment&amp;gt;
        &amp;lt;PluginSidebarMoreMenuItem
            target="gutenberg-boilerplate-sidebar"
        &amp;gt;
            { __( 'Gutenberg Boilerplate' ) }
        &amp;lt;/PluginSidebarMoreMenuItem&amp;gt;
        &amp;lt;PluginSidebar
            name="gutenberg-boilerplate-sidebar"
            title={ __( 'Gutenberg Boilerplate' ) }
        &amp;gt;
            &amp;lt;h2&amp;gt;{ __( 'Hello World!' ) }&amp;lt;/h2&amp;gt;
        &amp;lt;/PluginSidebar&amp;gt;
    &amp;lt;/Fragment&amp;gt;
);

registerPlugin( 'gutenberg-boilerplate', {
    icon: 'admin-site',
    render: Component,
} );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will insert a very simple sidebar to the Gutenberg editor. We will take this as a starting point and build our project upon it.&lt;/p&gt;

&lt;p&gt;The example code is from our Gutenberg Boilerplate repository, and as a result, we need to replace all occurrences of “Gutenberg Boilerplate” with “Hello Gutenberg”.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Components Used&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While our sidebar already imports many components, we will need more. You can replace the top part of the code with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Internal block libraries
 */

const { __ } = wp.i18n;

const {
    PluginSidebar,
    PluginSidebarMoreMenuItem
} = wp.editPost;

const {
    PanelBody,
    TextControl
} = wp.components;

const {
    Component,
    Fragment
} = wp.element;

const { withSelect } = wp.data;

const { registerPlugin } = wp.plugins;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s learn quickly about all the components that we have imported.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As discussed in the previous article, the &lt;a href="https://github.com/WordPress/gutenberg/tree/master/packages/i18n" rel="noopener noreferrer"&gt;__&lt;/a&gt; component is used to make our text translatable.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://github.com/WordPress/gutenberg/tree/master/packages/edit-post/src#pluginsidebar" rel="noopener noreferrer"&gt;PluginSidebar&lt;/a&gt; component is used to add our sidebar to Gutenberg.
PluginSidebarMoreMenuItem is used to add a button to Gutenberg menu, which toggles sidebar’s visibility.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://github.com/WordPress/gutenberg/tree/master/packages/components/src/panel" rel="noopener noreferrer"&gt;PanelBody&lt;/a&gt; component is used to add a panel to our sidebar.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/WordPress/gutenberg/tree/master/packages/components/src/text-control" rel="noopener noreferrer"&gt;TextControl&lt;/a&gt; is used for our input field.&lt;/li&gt;
&lt;li&gt;After that, we imported the &lt;a href="https://reactjs.org/docs/react-component.html" rel="noopener noreferrer"&gt;Component&lt;/a&gt; and &lt;a href="https://reactjs.org/docs/fragments.html" rel="noopener noreferrer"&gt;Fragment&lt;/a&gt; components. Both of them are React components that we use in our sidebar.
The Fragment component is used to group a list of children without adding extra nodes to the DOM. We need to use the Fragment component in our code as JSX doesn’t allow us to have more than one parent node.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/WordPress/gutenberg/tree/master/packages/data/src/components/with-select" rel="noopener noreferrer"&gt;withSelect&lt;/a&gt; is a higher-order component. To learn what higher-order components are, I recommend that you read &lt;a href="https://reactjs.org/docs/higher-order-components.html" rel="noopener noreferrer"&gt;this documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;And finally, we import &lt;a href="https://github.com/WordPress/gutenberg/tree/master/packages/plugins" rel="noopener noreferrer"&gt;registerPlugin&lt;/a&gt;, which is similar to registerBlockType that we used in &lt;a href="https://www.codeinwp.com/blog/adapt-your-plugin-for-gutenberg-block-api/" rel="noopener noreferrer"&gt;the previous article&lt;/a&gt;. Instead of registering a block, registerPlugin registers your plugin.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Adding Controls&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;So far our sidebar is just a Component function, but since we will be &lt;a href="https://www.codeinwp.com/blog/best-free-bootstrap-templates-for-reactjs/" rel="noopener noreferrer"&gt;using React’s&lt;/a&gt; lifecycle methods, we will turn it into a React component, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Hello_Gutenberg extends Component {
    render() {
        return (
            &amp;lt;Fragment&amp;gt;
                &amp;lt;PluginSidebarMoreMenuItem
                    target="hello-gutenberg-sidebar"
                &amp;gt;
                    { __( 'Hello Gutenberg' ) }
                &amp;lt;/PluginSidebarMoreMenuItem&amp;gt;
                &amp;lt;PluginSidebar
                    name="hello-gutenberg-sidebar"
                    title={ __( 'Hello Gutenberg' ) }
                &amp;gt;
                    &amp;lt;h2&amp;gt;{ __( 'Hello World!' ) }&amp;lt;/h2&amp;gt;
                &amp;lt;/PluginSidebar&amp;gt;
            &amp;lt;/Fragment&amp;gt;
        )
    }
}

registerPlugin( 'hello-gutenberg', {
    icon: 'admin-site',
    render: Hello_Gutenberg,
} );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should make your sidebar work with plain text.&lt;/p&gt;

&lt;p&gt;Now let’s add our field to the sidebar. It should make our component look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Hello_Gutenberg extends Component {
    render() {
        return (
            &amp;lt;Fragment&amp;gt;
            &amp;lt;PluginSidebarMoreMenuItem
                target="hello-gutenberg-sidebar"
            &amp;gt;
                { __( 'Hello Gutenberg' ) }
            &amp;lt;/PluginSidebarMoreMenuItem&amp;gt;
            &amp;lt;PluginSidebar
                name="hello-gutenberg-sidebar"
                title={ __( 'Hello Gutenberg' ) }
            &amp;gt;
                &amp;lt;PanelBody&amp;gt;
                    &amp;lt;TextControl
                        label={ __( 'What\'s your name?' ) }
                        // value={}
                        // onChange={}
                    /&amp;gt;
                &amp;lt;/PanelBody&amp;gt;
            &amp;lt;/PluginSidebar&amp;gt;
        &amp;lt;/Fragment&amp;gt;
        )
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will add a simple input field to the sidebar that will do absolutely nothing at this point.&lt;br&gt;
Now we have two tasks left:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Display the value of our meta field.&lt;/li&gt;
&lt;li&gt;Allow updating the value of our meta field from the sidebar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2018%2F09%2FHello-Gutenberg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2018%2F09%2FHello-Gutenberg.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Display the meta value&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To fetch the meta data, we will be using &lt;a href="https://github.com/WordPress/gutenberg/tree/master/packages/api-fetch" rel="noopener noreferrer"&gt;wp.apiFetch&lt;/a&gt;. apiFetch is a utility library that allows us to make REST API requests.&lt;/p&gt;

&lt;p&gt;We will use apiFetch in our React component’s constructor, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Hello_Gutenberg extends Component {
    constructor() {
        super( ...arguments );

        this.state = {
            key: '_hello_gutenberg_field',
            value: '',
        }

        wp.apiFetch( { path: `/wp/v2/posts/${this.props.postId}`, method: 'GET' } ).then(
            ( data ) =&amp;gt; {
                this.setState( { 
                    value: data.meta._hello_gutenberg_field
                } );
                return data;
            },
            ( err ) =&amp;gt; {
                return err;
            }
        );
    }

    render() {
        return (
            &amp;lt;Fragment&amp;gt;
            &amp;lt;PluginSidebarMoreMenuItem
                target="hello-gutenberg-sidebar"
            &amp;gt;
                { __( 'Hello Gutenberg' ) }
            &amp;lt;/PluginSidebarMoreMenuItem&amp;gt;
            &amp;lt;PluginSidebar
                name="hello-gutenberg-sidebar"
                title={ __( 'Hello Gutenberg' ) }
            &amp;gt;
                &amp;lt;PanelBody&amp;gt;
                    &amp;lt;TextControl
                        label={ __( 'What\'s your name?' ) }
                        value={ this.state.value }
                        // onChange={}
                    /&amp;gt;
                &amp;lt;/PanelBody&amp;gt;
            &amp;lt;/PluginSidebar&amp;gt;
        &amp;lt;/Fragment&amp;gt;
        )
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First, we have defined an initial state, which is basically the key and the value of our meta field. After that, we are using apiFetch to fetch the data from our current post.&lt;/p&gt;

&lt;p&gt;We are passing the ID of our current post with the &lt;em&gt;${this.props.postId}&lt;/em&gt; variable. We will get back to this point later.&lt;/p&gt;

&lt;p&gt;Once the data is fetched, we update our state with the value from our REST API.&lt;/p&gt;

&lt;p&gt;Now, let’s get back to the postId variable. We currently don’t know the ID of our current post, so for that we use the &lt;em&gt;withSelect&lt;/em&gt; higher-order component, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const HOC = withSelect( ( select ) =&amp;gt; {
    const { getCurrentPostId } = select( 'core/editor' );
    return {
        postId: getCurrentPostId(),
    };
} )( Hello_Gutenberg );

registerPlugin( 'hello-gutenberg', {
    icon: 'admin-site',
    render: HOC,
} );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will pass the ID of our current post as a &lt;em&gt;postId&lt;/em&gt; variable. Now you can run an older post, and our Gutenberg sidebar will display the value of your meta field.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Update the meta value&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now we need to allow our sidebar to also update the meta value. Similar to fetching the details, we will use the &lt;a href="https://github.com/WordPress/WordPress/blob/master/wp-includes/js/api-request.js" rel="noopener noreferrer"&gt;wp.apiRequest&lt;/a&gt; utility.&lt;/p&gt;

&lt;p&gt;Every time the value of our state changes, we will be updating it with REST API. For this, we first need to add an &lt;em&gt;onChange&lt;/em&gt; event to our &lt;em&gt;TextControl&lt;/em&gt;, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TextControl
    label={ __( 'What\'s your name?' ) }
    value={ this.state.value }
    onChange={ ( value ) =&amp;gt; { 
        this.setState( {
            value
        } );
    } }
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then we will be using the &lt;a href="https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops" rel="noopener noreferrer"&gt;getDerivedStateFromProps&lt;/a&gt; lifecycle method to send our REST request.&lt;/p&gt;

&lt;p&gt;You can add the following code below your constructor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;static getDerivedStateFromProps( nextProps, state ) {
    wp.apiRequest( { path: `/hello-gutenberg/v1/update-meta?id=${nextProps.postId}`, method: 'POST', data: state } ).then(
        ( data ) =&amp;gt; {
            return data;
        },
        ( err ) =&amp;gt; {
            return err;
        }
    );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will update our meta field every time we change it from the field. Now you should see an issue with this approach.&lt;/p&gt;

&lt;p&gt;The meta values will be updated every time you change the meta value, there are two issues with this approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your data will be saved even if you decide not to update the post.&lt;/li&gt;
&lt;li&gt;It will make an HTTP call too often, which is not ideal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data should only be saved when you save or publish the post. For this, we can make use of our higher-order component to find out when the post is being saved.&lt;/p&gt;

&lt;p&gt;You can replace our HOC function with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const HOC = withSelect( ( select, { forceIsSaving } ) =&amp;gt; {
    const {
        getCurrentPostId,
        isSavingPost,
        isPublishingPost,
        isAutosavingPost,
    } = select( 'core/editor' );
    return {
        postId: getCurrentPostId(),
        isSaving: forceIsSaving || isSavingPost(),
        isAutoSaving: isAutosavingPost(),
        isPublishing: isPublishingPost(),
    };
} )( Hello_Gutenberg );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will give us a few variables that we can use to check if our post is being saved or published.&lt;/p&gt;

&lt;p&gt;We need to add this condition to our post request function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;static getDerivedStateFromProps( nextProps, state ) {
    if ( ( nextProps.isPublishing || nextProps.isSaving ) &amp;amp;&amp;amp; !nextProps.isAutoSaving ) {
        wp.apiRequest( { path: `/hello-gutenberg/v1/update-meta?id=${nextProps.postId}`, method: 'POST', data: state } ).then(
            ( data ) =&amp;gt; {
                return data;
            },
            ( err ) =&amp;gt; {
                return err;
            }
        );
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now meta values will only update when we save, update or publish the post.&lt;br&gt;
That’s it! Your sidebar is complete now, and you’ve just learned how to make your plugin compatible with Gutenberg!&lt;/p&gt;

&lt;p&gt;You can test your block to make sure it works. If not then please leave your response in the comments section below, and I’ll try to help you.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What’s next when you’re done with Sidebar API?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can find the finished example in the &lt;a href="https://github.com/HardeepAsrani/hello-gutenberg" rel="noopener noreferrer"&gt;Hello Gutenberg&lt;/a&gt; repository. If you find any problems then feel free to &lt;a href="https://github.com/HardeepAsrani/hello-gutenberg/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once again, this is a small example of what’s possible with Gutenberg’s Sidebar API. There are many amazing things you can create with Gutenberg and its APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are you trying to achieve with Gutenberg? Let us know.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The article was originally published on &lt;a href="https://www.codeinwp.com/blog/make-plugin-compatible-with-gutenberg-sidebar-api/" rel="noopener noreferrer"&gt;CodeinWP.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>gutenberg</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Micro-Interactions Tutorial for Beginner Developers: How to Create an Interactive “Like” Button With CSS and JavaScript</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Thu, 12 Sep 2019 08:58:52 +0000</pubDate>
      <link>https://dev.to/codeinwp/micro-interactions-tutorial-for-beginner-developers-how-to-create-an-interactive-like-button-with-css-and-javascript-ce</link>
      <guid>https://dev.to/codeinwp/micro-interactions-tutorial-for-beginner-developers-how-to-create-an-interactive-like-button-with-css-and-javascript-ce</guid>
      <description>&lt;p&gt;I think it’s safe to say that micro-interactions are cool. We – web people – universally all enjoy them. And no matter if you’re noticing them or not, they provide a significant user experience improvement. By making your website or web tool come to life subtly and in a friendly way, they simply make the user enjoy the whole interaction a tiny bit more.&lt;/p&gt;

&lt;p&gt;In that spirit, I want to give you a quick micro-interactions tutorial and show you how to create a cool “Like” button for your site. With minimal code. Here it is in action:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2aTItNTC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/08/microinteraction-gif.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2aTItNTC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://mk0codeinwp10tp0961a.kinstacdn.com/wp-content/uploads/2019/08/microinteraction-gif.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But first:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why bother with micro-interactions in the first place?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I’m not going to try to convince you too heavily here, but let’s just look at a couple of things.&lt;/p&gt;

&lt;p&gt;Micro-interactions have been around for a while – enough so that they even have &lt;a href="https://www.amazon.com/Microinteractions-Full-Color-Designing-Details/dp/1491945923"&gt;full books&lt;/a&gt; written about them. Plus, there have been many experiments and studies looking into how useful and effective they actually are.&lt;/p&gt;

&lt;p&gt;One of the most notable research houses, the Nielsen Norman Group, looked at micro-interactions more &lt;a href="https://www.nngroup.com/articles/microinteractions/"&gt;closely in 2018&lt;/a&gt;. As per their conclusions, micro-interactions have proven to, among other things, improve user experience by encouraging engagement, and communicating brand.&lt;/p&gt;

&lt;p&gt;In short, micro-interactions can be really beneficial if used right and, also, not too heavily. Today, we’re going to show you one simple example of a micro-interaction in action:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Micro-interactions tutorial: The markup and basic CSS of our thumbs-up button&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;💡 Note; at the bottom, we have some options for you that don’t involve writing code by hand.&lt;/p&gt;

&lt;p&gt;First of all, we need some good old HTML and CSS magic to make it work. The structure is pretty straightforward.&lt;/p&gt;

&lt;p&gt;We are going to use an &lt;em&gt;SVG&lt;/em&gt; tag for the like icon itself – this is from &lt;a href="https://fontawesome.com/"&gt;Font Awesome&lt;/a&gt;; you can find most of the icons &lt;a href="https://github.com/encharm/Font-Awesome-SVG-PNG"&gt;here&lt;/a&gt;. Just to adjust the width and height attributes of the SVG tag, we’re going to use the HTML below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;a href="#" class="like-button"&amp;gt;
      &amp;lt;svg width="20" height="20" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"&amp;gt;&amp;lt;path d="M320 1344q0-26-19-45t-45-19q-27 0-45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45-18.5t19-45.5zm160-512v640q0 26-19 45t-45 19h-288q-26 0-45-19t-19-45v-640q0-26 19-45t45-19h288q26 0 45 19t19 45zm1184 0q0 86-55 149 15 44 15 76 3 76-43 137 17 56 0 117-15 57-54 94 9 112-49 181-64 76-197 78h-129q-66 0-144-15.5t-121.5-29-120.5-39.5q-123-43-158-44-26-1-45-19.5t-19-44.5v-641q0-25 18-43.5t43-20.5q24-2 76-59t101-121q68-87 101-120 18-18 31-48t17.5-48.5 13.5-60.5q7-39 12.5-61t19.5-52 34-50q19-19 45-19 46 0 82.5 10.5t60 26 40 40.5 24 45 12 50 5 45 .5 39q0 38-9.5 76t-19 60-27.5 56q-3 6-10 18t-11 22-8 24h277q78 0 135 57t57 135z"/&amp;gt;&amp;lt;/svg&amp;gt;
      &amp;lt;/svg&amp;gt;
    &amp;lt;/a&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now for the CSS, we’re going to go real basic. What we want to happen here is to give a nice look to our like button and have everything nicely centered on the screen. We already know that we’re going to toggle a class upon click (the &lt;em&gt;active&lt;/em&gt; class), so we need to account for that. We’re going to fill the icon with a blue color when active and dark-gray when not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100vh;
}

.like-button {
  display: flex;
  align-items: center;
  justify-content: center;
}

.like-button.active {
  -webkit-animation: pop 0.9s both;
  animation: pop 0.9s both;
}

.like-button svg {
  opacity: 1;
}

.like-button svg path {
  fill: #333;
  transition: fill .4s ease-out;
}

.like-button.active svg path {   
  fill: #2196f3;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Another thing we want here is the &lt;em&gt;pop&lt;/em&gt; animation used when the button becomes active, so we’re going to add that to our CSS file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@-webkit-keyframes pop {
  0% {
    -webkit-transform: scale3d(1, 1, 1);
    transform: scale3d(1, 1, 1);
  }
  30% {
    -webkit-transform: scale3d(1.25, 0.75, 1);
    transform: scale3d(1.25, 0.75, 1);
  }
  40% {
    -webkit-transform: scale3d(0.75, 1.25, 1);
    transform: scale3d(0.75, 1.25, 1);
  }
  50% {
    -webkit-transform: scale3d(1.15, 0.85, 1);
    transform: scale3d(1.15, 0.85, 1);
  }
  65% {
    -webkit-transform: scale3d(0.95, 1.05, 1);
    transform: scale3d(0.95, 1.05, 1);
  }
  75% {
    -webkit-transform: scale3d(1.05, 0.95, 1);
    transform: scale3d(1.05, 0.95, 1);
  }
  100% {
    -webkit-transform: scale3d(1, 1, 1);
    transform: scale3d(1, 1, 1);
  }
}

@keyframes pop {
  0% {
    -webkit-transform: scale3d(1, 1, 1);
    transform: scale3d(1, 1, 1);
  }
  30% {
    -webkit-transform: scale3d(1.25, 0.75, 1);
    transform: scale3d(1.25, 0.75, 1);
  }
  40% {
    -webkit-transform: scale3d(0.75, 1.25, 1);
    transform: scale3d(0.75, 1.25, 1);
  }
  50% {
    -webkit-transform: scale3d(1.15, 0.85, 1);
    transform: scale3d(1.15, 0.85, 1);
  }
  65% {
    -webkit-transform: scale3d(0.95, 1.05, 1);
    transform: scale3d(0.95, 1.05, 1);
  }
  75% {
    -webkit-transform: scale3d(1.05, 0.95, 1);
    transform: scale3d(1.05, 0.95, 1);
  }
  100% {
    -webkit-transform: scale3d(1, 1, 1);
    transform: scale3d(1, 1, 1);
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;The “interaction” part of this micro-interactions tutorial&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now that we’ve got the basic styling out of the way, it’s time to handle the actual interactions – that means &lt;a href="https://www.codeinwp.com/blog/learning-javascript-for-wordpress/"&gt;JavaScript&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;First of all, we’re going to need a JavaScript function that generates a random integer between a given interval (a minimum and a maximum):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1) + min);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Next up, we’re going to need another function that randomly returns &lt;em&gt;+1&lt;/em&gt; or &lt;em&gt;-1&lt;/em&gt; so we can have random negative or positive values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function plusOrMinus() {
  return Math.random() &amp;lt; 0.5 ? -1 : 1;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now for the actual interaction handling; let’s look at the code to explain it properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First up, we’re going to save our button in a variable and add a click event listener to it.&lt;/li&gt;
&lt;li&gt;When the button is clicked, we’re going to add a &lt;em&gt;preventDefault()&lt;/em&gt; function so that we’re sure that nothing unwanted happens.&lt;/li&gt;
&lt;li&gt;After that, we’re going to add our &lt;em&gt;active&lt;/em&gt; class to the button, which we previously styled with a blue color via CSS.&lt;/li&gt;
&lt;li&gt;Then we’re going to run the &lt;em&gt;generateClones()&lt;/em&gt; function (that isn’t defined yet), passing our button as a parameter via &lt;em&gt;this&lt;/em&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let button = document.querySelector(".like-button");

button.addEventListener("click", function(e) {
  e.preventDefault();
  this.classList.toggle("active");
  generateClones(this);
});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now let’s define the &lt;em&gt;generateClones()&lt;/em&gt; function and run through the following steps with it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First, let’s decide on a random number of clones. We’re going to instantiate between two and four clones for the icon. We’re going to use the previously defined &lt;em&gt;randomInt()&lt;/em&gt; function.&lt;/li&gt;
&lt;li&gt;Then, for each clone, we’re going to use the SVG tag inside our button as a “model” and use the &lt;em&gt;cloneNode(true)&lt;/em&gt; JavaScript function to clone it into a new variable. We’re also going to define a size between 5 and 16 for our clone using the random integer generator function.&lt;/li&gt;
&lt;li&gt;Next up, we’re going to add our clones to the button, set their width and height with the previously generated number, and make their position absolute so that we can move them around independently from the button.&lt;/li&gt;
&lt;li&gt;Another thing we need is a transition for our clones, so they don’t just pop into their new place when clicking.&lt;/li&gt;
&lt;li&gt;Now, for adding the actual transformations that will move our icon around, we’re going to go a bit crazy. We want our clones to move from the center of our button outwards randomly. Using a combination of our &lt;em&gt;randomInt()&lt;/em&gt; and &lt;em&gt;plusOrMinus()&lt;/em&gt; functions, we’re going to move our clones in the XY axis with the &lt;em&gt;translate3d&lt;/em&gt; CSS property. We’re also going to use a “hack”, as our transition wouldn’t apply otherwise. So adding a simple &lt;em&gt;setTimeout()&lt;/em&gt; function is going to help us achieve that. At the same time, we’re going to move the opacity to 0, making the clones disappear.&lt;/li&gt;
&lt;li&gt;Deleting our clones. We have to clear up the DOM after we’re done with all the jazz. So we need another &lt;em&gt;setTimeout()&lt;/em&gt; function that’s going to remove our clones from the DOM after one second.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generateClones(button) {
  // 1. Generate clones and iterate over the set number
  let clones = randomInt(2, 4);
  for (let it = 1; it &amp;lt;= clones; it++) {
    // 2. Get the SVG tag clone in a variable and generate a random size
    let clone = button.querySelector("svg").cloneNode(true),
        size = randomInt(5, 16);
    // 3. Add our clone to the button and change its' width/height/position
    button.appendChild(clone);
    clone.setAttribute("width", size);
    clone.setAttribute("height", size);
    clone.style.position = "absolute";
    // 4. Add some flashy transitions
    clone.style.transition =
      "transform 0.5s cubic-bezier(0.12, 0.74, 0.58, 0.99) 0.3s, opacity 1s ease-out .5s";
    // 5. Animate our icon outwards with a setTimeout function so that CSS complies.
    let animTimeout = setTimeout(function() {
      clone.style.transform =
        "translate3d(" +
        plusOrMinus() * randomInt(10, 25) +
        "px," +
        plusOrMinus() * randomInt(10, 25) +
        "px,0)";
      clone.style.opacity = 0;
      clearTimeout(animTimeout);
    }, 1);
    // 6. Removing the clones after 0.9 seconds
    let removeNodeTimeout = setTimeout(function() {
      clone.parentNode.removeChild(clone);
      clearTimeout(removeNodeTimeout);
    }, 900);
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That’s it! We’ve made it through the end! Down below you’ll find the CodePen example:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/abaicus/embed/gNXdQP?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Thanks for going through this!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Other options to add micro-interactions to WordPress&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If writing code manually isn’t entirely your thing, there are actually quite a handful of WordPress plugins that you can use to get micro-interactions onto your site without needing to worry about how it all works under the hood.&lt;/p&gt;

&lt;p&gt;First, you can use the &lt;a href="https://wordpress.org/plugins/animate-it/"&gt;Animate It&lt;/a&gt;! plugin to animate pretty much any element on your pages using CSS3.&lt;/p&gt;

&lt;p&gt;For example, you can add a button, or a piece of text, and then set it to animate in a certain way on click.&lt;/p&gt;

&lt;p&gt;Here’s an example of what the plugin can do – &lt;a href="https://www.youtube.com/watch?v=Np_t43pfrh4"&gt;video&lt;/a&gt; 📹.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dg4CDY0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wuimqhh6f6uyguuxhgpq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dg4CDY0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wuimqhh6f6uyguuxhgpq.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another plugin, and one of our editor’s favorites, is &lt;a href="https://wordpress.org/plugins/shortcodes-ultimate/"&gt;Shortcodes Ultimate&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Among a whole plethora of different shortcodes, there’s one for simple animations. There are some presets as to how the animation should behave, and you can put pretty much anything inside the block that’s going to get animated.&lt;/p&gt;

&lt;p&gt;Here’s an example of an animated button:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2dwLivh1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/uolqrrsiyo4v4bbzvmaa.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2dwLivh1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/uolqrrsiyo4v4bbzvmaa.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h733Vscp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/szeyee2n70m3r5kshwy4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h733Vscp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/szeyee2n70m3r5kshwy4.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These two plugins should give you more than enough options to animate certain elements on your pages and make them pop a little more when the user is interacting with them. Of course, you don’t want to go overboard with those, but giving the user an additional nudge when they’re interacting with your key &lt;a href="https://www.codeinwp.com/blog/optimize-call-to-action-buttons/"&gt;call to actions&lt;/a&gt; might help a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you think of micro-interactions, are you considering putting this micro-interactions tutorial to good use and adding something to your site? Let us know in the comments.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The article was originally published on &lt;a href="https://www.codeinwp.com/blog/micro-interactions-tutorial/"&gt;CodeinWP.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdesign</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to Adapt Your Plugin for Gutenberg: Part 1 (Block API)</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Tue, 20 Aug 2019 08:41:13 +0000</pubDate>
      <link>https://dev.to/codeinwp/how-to-adapt-your-plugin-for-gutenberg-part-1-block-api-94d</link>
      <guid>https://dev.to/codeinwp/how-to-adapt-your-plugin-for-gutenberg-part-1-block-api-94d</guid>
      <description>&lt;p&gt;&lt;em&gt;“I have a plugin,” says you, “how do I make it Gutenberg-ready?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The story is straightforward; &lt;a href="https://www.codeinwp.com/blog/wordpress-gutenberg-guide/"&gt;Gutenberg&lt;/a&gt; is the new editor experience in WordPress, which is going to be merged into core in the next major release. A lot of plugins that do not keep up with this &lt;strong&gt;will become obsolete&lt;/strong&gt;. This makes it essential that you adapt your plugin for Gutenberg before it’s too late.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who’s affected?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Almost all the plugins&lt;/strong&gt; that have anything to do with the post editor will be affected by Gutenberg. For example, if your plugin adds a button in TinyMCE to then place a shortcode in the editor, bad news; it will be the end of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;“Do I need to adapt my plugins for Gutenberg?”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;So which plugins need updating for Gutenberg? Any plugins that work with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom metaboxes&lt;/li&gt;
&lt;li&gt;Shortcodes&lt;/li&gt;
&lt;li&gt;TinyMCE buttons&lt;/li&gt;
&lt;li&gt;or any editor feature at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While some plugins will still work with Gutenberg, like a plugin that adds a simple metabox, for instance, it will not be as smooth an experience for your users.&lt;/p&gt;

&lt;p&gt;Even shortcodes will keep working as before, but it will just be plain text node in the editor, while all the shortcode plugins for Gutenberg will follow its block UI and will be easier for users to use.&lt;/p&gt;

&lt;p&gt;So yes, users will prefer plugins that are crafted for the Gutenberg experience. And the ones to stay behind will be replaced by a competitor plugin.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Just to give you an idea, here’s an example of what the user’s standard old-editor experience looks like with a plugin of ours &lt;strong&gt;(a)&lt;/strong&gt;, and then what it looks like in Gutenberg &lt;strong&gt;(b)&lt;/strong&gt; – with the plugin optimized for it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--agCJvM9l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2018/07/Feedzy-Visual-Editor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--agCJvM9l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2018/07/Feedzy-Visual-Editor.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gO9-qm3O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2018/07/Feedzy-Gutenberg-Editor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gO9-qm3O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2018/07/Feedzy-Gutenberg-Editor.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fear not! We are here to help you with making your plugins Gutenberg-ready. There are many ways to integrate your plugin towards Gutenberg, depending on how your plugin works, which we are going to be discussing in this article.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Things worth knowing beforehand&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gutenberg is written on React. And Gutenberg plugins are coded in JavaScript, which also can be a rough transition for developers who only code in PHP. While you don’t need to have knowledge of React to make plugins for Gutenberg, you will need some basic understanding of JavaScript. If you have previously worked on React and JSX then it will be similar grounds for you.&lt;/p&gt;

&lt;p&gt;While there’s not enough &lt;a href="https://developer.wordpress.org/block-editor/"&gt;official documentation for Gutenberg&lt;/a&gt;, its Github repository has a lot of valuable information for developers. If you want to learn Gutenberg development deeply, you must keep your eyes open on everything that is going on in Gutenberg’s GitHub repository because the project is moving really fast, and things are changing every single day.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How to adapt your plugin for Gutenberg&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Gutenberg’s API provides us with &lt;a href="https://www.codeinwp.com/blog/build-for-gutenberg-how-others-do-it/"&gt;many ways to extend the editor&lt;/a&gt;, like Block API, Shortcode API, and more. Which API to use depends on what type of plugin we are building.&lt;/p&gt;

&lt;p&gt;If your plugin is a simple shortcode plugin, then Block API can be used to make a beautiful block for the editor. But if your plugin uses complex metaboxes where a block isn’t enough, we can use Sidebar API.&lt;/p&gt;

&lt;p&gt;Also, we will be using a modern stack of JavaScript development tools, such as NodeJS, NPM, webpack, and ESNext. We will be providing you with example files, so you don’t need to worry about setting up your development environment.&lt;/p&gt;

&lt;p&gt;In this post, we will be looking at &lt;strong&gt;how to make your plugin Gutenberg-compatible by using the Block API&lt;/strong&gt;. We’ll get into the other methods (Sidebar API, Publish Panel, Status Bar &amp;amp; similar APIs) in part two if needed.&lt;/p&gt;

&lt;p&gt;You can find all the mentioned examples in &lt;a href="https://github.com/HardeepAsrani/hello-gutenberg"&gt;this GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Gutenberg development environment&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Developing for Gutenberg requires you to setup bunch of tools, such as NPM, webpack, Babel, and JSX. It takes a lot of time and effort, so we have prepared the environment for you.&lt;/p&gt;

&lt;p&gt;Gutenberg Boilerplate is a plugin with minimal Gutenberg development setup and examples. It contains one block and sidebar example. You can use this to extend into your custom block.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rdBflXJi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2028/07/Gutenberg-Boilerplate.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rdBflXJi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2028/07/Gutenberg-Boilerplate.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can fork or clone &lt;a href="https://github.com/HardeepAsrani/gutenberg-boilerplate"&gt;Gutenberg Boilerplate repository&lt;/a&gt; to your &lt;strong&gt;/wp-content/plugins/&lt;/strong&gt; and use it as your development environment.&lt;br&gt;
After that, you need to install NodeJS to your machine to get started. Navigate to Gutenberg Boilerplate folder, and run &lt;em&gt;npm install&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;From this point on, you need to know three commands that you will be using during the development process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;npm install&lt;/em&gt; – Install project dependencies when you clone the project.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;npm run dev&lt;/em&gt; – Compile code during the development process. You need to run this once, and it will keep watching for the changes.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;npm run build&lt;/em&gt;  – Compile code for an optimized build once development process is finished.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Block API&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Blocks are the fundamental element of Gutenberg, it being a block-based editor. Block API allows you to make blocks for Gutenberg. You can make blocks that can render basic HTML, shortcodes, or even make dynamic blocks to display, for example, your latest posts.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;The process based on an existing plugin&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In our example, we will adopt a Click to Tweet shortcode to a Gutenberg block. This Click to Tweet shortcode renders a Tweet Box with your text, and a button to tweet that text. Like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oQCmi5L0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2028/07/Click-to-Tweet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oQCmi5L0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2028/07/Click-to-Tweet.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our shortcode looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[clicktotweet tweet="Text to be displayed" tweetsent="Text to be tweeted" button="Tweet" theme="click-to-tweet"]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Our shortcode has four parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;tweet&lt;/em&gt;: Text that appears on your site.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;tweetsent&lt;/em&gt;: Text that goes to Twitter.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;button&lt;/em&gt;: Tweet button text.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;theme&lt;/em&gt;: Either &lt;em&gt;click-to-tweet&lt;/em&gt; or &lt;em&gt;click-to-tweet-alt&lt;/em&gt; as box theme.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Adapting plugins for Gutenberg with Block API&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There are two ways of going about it with Gutenberg, either we can render the HTML to the front-end, or we can use our Gutenberg block to render the shortcode to front-end. For this article, we will be doing the latter.&lt;/p&gt;

&lt;p&gt;All the code is available in &lt;a href="https://github.com/HardeepAsrani/hello-gutenberg"&gt;Hello Gutenberg plugin repository on GitHub&lt;/a&gt;. You can clone the repository to see the plugin in action, or to modify the code.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Enqueue scripts/styles for Gutenberg&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;First, we need to enqueue our scripts and styles to Gutenberg editor using enqueue_block_assets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Enqueue front end and editor JavaScript and CSS
 */
function hello_gutenberg_scripts() {
    $blockPath = '/dist/block.js';
    $stylePath = '/dist/block.css';

    // Enqueue the bundled block JS file
    wp_enqueue_script(
        'hello-gutenberg-block-js',
        plugins_url( $blockPath, __FILE__ ),
        [ 'wp-i18n', 'wp-blocks', 'wp-editor', 'wp-components' ],
        filemtime( plugin_dir_path(__FILE__) . $blockPath )
    );

    // Enqueue frontend and editor block styles
    wp_enqueue_style(
        'hello-gutenberg-block-css',
        plugins_url( $stylePath, __FILE__ ),
        '',
        filemtime( plugin_dir_path(__FILE__) . $stylePath )
    );

}

// Hook scripts function into block editor hook
add_action( 'enqueue_block_assets', 'hello_gutenberg_scripts' );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We have added four dependencies to our script that we will be using in our block. Let’s learn about these dependencies first:&lt;br&gt;
wp-i18n is Gutenberg’s version of internationalization functions, such as &lt;a href="https://developer.wordpress.org/reference/functions/__/"&gt;__()&lt;/a&gt;. wp-blocks is used for the registerBlockType function which registers your block. We use wp-editor and wp-components scripts for various components in our block.&lt;/p&gt;

&lt;p&gt;Now that we have enqueued your assets, we can start writing our block in /&lt;strong&gt;src/block.js&lt;/strong&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importing dependencies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are using Gutenberg Boilerplate then your &lt;strong&gt;block.js&lt;/strong&gt; file should have a basic block structure that you can use to build plugins for Gutenberg:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Internal block libraries
 */
const { __ } = wp.i18n;

const { registerBlockType } = wp.blocks;

/**
 * Register block
 */
export default registerBlockType( 'gutenberg-boilerplate/block', {
    // Block Title
    title: __( 'Gutenberg Boilerplate' ),
    // Block Description
    description: __( 'An example block.' ),
    // Block Category
    category: 'common',
    // Block Icon
    icon: 'admin-site',
    // Block Keywords
    keywords: [
        __( 'Boilerplate' ),
        __( 'Hello World' ),
        __( 'Example' ),
    ],
    attributes: {
    },
    // Defining the edit interface
    edit: props =&amp;gt; {
        return (
            &amp;lt;h2&amp;gt;{ __( 'Hello Backend' ) }&amp;lt;/h2&amp;gt;
        );
    },
    // Defining the front-end interface
    save: props =&amp;gt; {
        return (
            &amp;lt;h2&amp;gt;{ __( 'Hello Frontend' ) }&amp;lt;/h2&amp;gt;
        );
    },
});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can run &lt;em&gt;npm run dev&lt;/em&gt; to start compiling our code in real time.&lt;/p&gt;

&lt;p&gt;First, we will import all the components and libraries that we need for the block on the top:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * Block dependencies
 */

import classnames from 'classnames';

/**
 * Internal block libraries
 */
const { __ } = wp.i18n;

const { registerBlockType } = wp.blocks;

const {
    RichText,
    InspectorControls,
    BlockControls,
} = wp.editor;

const {
    PanelBody,
    TextareaControl,
    TextControl,
    Dashicon,
    Toolbar,
    Button,
    Tooltip,
} = wp.components;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The first imports &lt;em&gt;classnames&lt;/em&gt; which we installed using npm to use multiple classes in our code, as JSX doesn’t allow multiple classes in elements.&lt;/p&gt;

&lt;p&gt;We will learn about other components that we have imported as we use them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Define attributes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we will define four attributes for our Gutenberg block, same as our shortcode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;attributes: {
    tweet: {
        type: 'string',
    },
    tweetsent: {
        type: 'string',
    },
    button: {
        type: 'string',
        default: __( 'Tweet' ),
    },
    theme: {
        type: 'boolean',
        default: false,
    },
},
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As you can see, all the attributes are same as our shortcode. All attributes have a type key, which tells Gutenberg its data type. You can use string, number, boolean &amp;amp; object as accepted types.&lt;/p&gt;

&lt;p&gt;Some of the attributes also contain a default value. Attributes can also have other properties, such as source and selectors, which we won’t be using in our example, but you can &lt;a href="https://developer.wordpress.org/block-editor/developers/block-api/block-attributes/"&gt;learn more about them here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit interface&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we will be building the edit interface of our block, which will be the display – users will see it while editing the block in Gutenberg.&lt;/p&gt;

&lt;p&gt;To get a basic idea, we can first hard-code our block and build upon it by replacing the following area in our code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Defining the edit interface
edit: props =&amp;gt; {
    return (
        &amp;lt;h2&amp;gt;{ __( 'Hello Backend' ) }&amp;lt;/h2&amp;gt;
    );
},
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;With the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Defining the edit interface
edit: props =&amp;gt; {
    return [
        &amp;lt;div className={ props.className }&amp;gt;
            &amp;lt;div className="click-to-tweet"&amp;gt;
                &amp;lt;div className="ctt-text"&amp;gt;Pumpkins and Penguins&amp;lt;/div&amp;gt;
                &amp;lt;p&amp;gt;&amp;lt;a href="https://twitter.com/intent/tweet?text=Pumpkins%20and%20Penguins" className="ctt-btn"&amp;gt;Tweet&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    ];
},
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This should give you an idea of our end result. It will look something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OTCnHyGy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2018/07/Gutenberg-Click-to-Tweet.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OTCnHyGy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2018/07/Gutenberg-Click-to-Tweet.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first element of the block is the tweet text area. We will replace it with an editable text field, similar to Gutenberg’s heading block.&lt;/p&gt;

&lt;p&gt;We will use &lt;strong&gt;RichText&lt;/strong&gt; component that we previously imported to replace our hard-coded text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div className="ctt-text"&amp;gt;
    &amp;lt;RichText
        format="string"
        formattingControls={ [] }
        placeholder={ __( 'Tweet, tweet!' ) }
        onChange={ onChangeTweet }
        value={ props.attributes.tweet }
    /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Our RichText component has five arguments. &lt;em&gt;format&lt;/em&gt; is a string, as we are going to use our shortcode to display the elements in the front-end. If we wanted to use a selector in our attribute, then format would have been an array.&lt;/p&gt;

&lt;p&gt;RichText has some formatting options by default, like bold and italic, which we have disabled by passing an empty array in &lt;em&gt;formattingControls&lt;/em&gt; argument.&lt;/p&gt;

&lt;p&gt;placeholder is the placeholder text when there is no text in the field, and onChange will trigger onChangeTweet function when a change event takes place.&lt;/p&gt;

&lt;p&gt;Finally, value will be the value of our field, which will be taken from tweet attribute that we defined earlier.&lt;/p&gt;

&lt;p&gt;Once that we have defined our RichText area, we need to build onChangeTweet function which will trigger when value changes in our text field.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Defining the edit interface
edit: props =&amp;gt; {
    const onChangeTweet = value =&amp;gt; {
        props.setAttributes( { tweet: value } );
    };
    return [
    ...rest of the code
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We pass value of RichText field to &lt;em&gt;onChangeTweet&lt;/em&gt; function, which uses &lt;strong&gt;props.setAttributes&lt;/strong&gt; function to update the value of tweet attribute.&lt;/p&gt;

&lt;p&gt;You will see the power of Gutenberg now when you use your block.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LM3q-SvR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2018/07/RichField-in-Gutenberg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LM3q-SvR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2018/07/RichField-in-Gutenberg.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isn’t it awesome?&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Block Inspector&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;When building plugins for Gutenberg, you don’t need to reinvent the wheel every time to make option panels for your plugins. Gutenberg provides us with a simplified way to allow block customization and ensures that every user has a consistent experience with built-in UI patterns.&lt;/p&gt;

&lt;p&gt;Similarly to RichText component, &lt;em&gt;InspectorControls&lt;/em&gt; component adds a sidebar when the block is selected. Something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e3wuZdDZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2028/07/Gutenberg-Inspector-Controls.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e3wuZdDZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2028/07/Gutenberg-Inspector-Controls.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will also be using &lt;em&gt;TextareaControl&lt;/em&gt; and &lt;em&gt;TextControl&lt;/em&gt; to add a textarea and text input field to our Inspector area.&lt;/p&gt;

&lt;p&gt;We will be adding the following code to your return statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!! props.isSelected &amp;amp;&amp;amp; (
    &amp;lt;InspectorControls key="inspector"&amp;gt;
        &amp;lt;PanelBody title={ __( 'Tweet Settings' ) } &amp;gt;
            &amp;lt;TextareaControl
                label={ __( 'Tweet Text' ) }
                value={ props.attributes.tweetsent }
                onChange={ onChangeTweetSent }
                help={ __( 'You can add hashtags and mentions here that will be part of the actual tweet, but not of the display on your post.' ) }
            /&amp;gt;
            &amp;lt;TextControl
                label={ __( 'Button Text' ) }
                value={ props.attributes.button }
                onChange={ onChangeButton }
            /&amp;gt;
        &amp;lt;/PanelBody&amp;gt;
    &amp;lt;/InspectorControls&amp;gt;
),
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;em&gt;props.isSelected&lt;/em&gt; checks to make sure that the Inspector only appears when the block is selected.&lt;br&gt;
TextareaControl and TextControl components, similarly to RichText, have a value and onChange method.&lt;/p&gt;

&lt;p&gt;We also need to change the code of your block display to accommodate new changes. In our case, we only need to add Button Text to our block as Tweet Text will be added to the link, so we don’t need to show it in our backend.&lt;/p&gt;

&lt;p&gt;You can replace hyperlink in our initial code with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;a className="ctt-btn"&amp;gt;
    { props.attributes.button }
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As mentioned before, we are removing hyperlink from our code because we don’t need to show it in the backend. This will make our block look like so:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hy-NTt52--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2028/07/Gutenberg-Click-to-Tweet-Inspector-Controls.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hy-NTt52--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2028/07/Gutenberg-Click-to-Tweet-Inspector-Controls.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Block Inspector can be a potent tool for your block. If your plugin has advanced options that are too complicated for editor area, then you can put them in the Inspector area.&lt;/p&gt;

&lt;p&gt;We will add one last option to our block to finish the JavaScript part in the next section.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Block Toolbar&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Block Toolbar is another pre-built UI component that we can use to add more options to our block. It will appear above your block when you select it. Example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Oa0kcJj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2028/07/Gutenberg-Block-Toolbar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Oa0kcJj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2028/07/Gutenberg-Block-Toolbar.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ideally, Block Toolbar should contain the primary controls of your block, with Inspector hosting the secondary controls. However, that is debatable and depends on your block.&lt;/p&gt;

&lt;p&gt;We will be using the Block Toolbar area to host our alternative style control.&lt;/p&gt;

&lt;p&gt;Similar to Block Inspector, we need to add the following code to our return statement to add Block Toolbar to our block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!! props.isSelected &amp;amp;&amp;amp; (
    &amp;lt;BlockControls key="custom-controls"&amp;gt;
        &amp;lt;Toolbar
            className='components-toolbar'
        &amp;gt;
            &amp;lt;Tooltip text={ __( 'Alternative Design' ) }&amp;gt;
                &amp;lt;Button
                    className={ classnames(
                        'components-icon-button',
                        'components-toolbar__control',
                        { 'is-active': props.attributes.theme },
                    ) }
                    onClick={ toggletheme }
                &amp;gt;
                    &amp;lt;Dashicon icon="tablet" /&amp;gt;
                &amp;lt;/Button&amp;gt;
            &amp;lt;/Tooltip&amp;gt;
        &amp;lt;/Toolbar&amp;gt;
    &amp;lt;/BlockControls&amp;gt;
),
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We use &lt;em&gt;BlockControls&lt;/em&gt; and &lt;em&gt;Toolbar&lt;/em&gt; components to add a toolbar to our block. Similar to Block Inspector, &lt;em&gt;props.isSelected&lt;/em&gt; makes sure our toolbar only appears when we put focus on our block.&lt;br&gt;
We also use &lt;em&gt;Tooltip&lt;/em&gt; and &lt;em&gt;Button&lt;/em&gt; components for our control. Tooltip component is wrapped around Button component to make sure there’s a tooltip when you hover over the control to give you more context.&lt;/p&gt;

&lt;p&gt;Button component is using classnames module that we imported earlier in the article. We used classnames function to give three classes to our control. The third class, &lt;em&gt;is-active&lt;/em&gt;, only appears when our &lt;em&gt;theme&lt;/em&gt; attribute value is true.&lt;/p&gt;

&lt;p&gt;Its &lt;em&gt;onChange&lt;/em&gt; function toggles the &lt;em&gt;theme&lt;/em&gt; attribute to true/false. In the end, &lt;em&gt;Dashicon&lt;/em&gt; components is used to display an icon for our control.&lt;/p&gt;

&lt;p&gt;We will also have to change our block code for it to work with the changes. We need to replace the following line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div className="click-to-tweet"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;With:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div className={ ( props.attributes.theme ? 'click-to-tweet-alt' : 'click-to-tweet' ) }&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We are checking if the &lt;em&gt;theme&lt;/em&gt; attribute is true or false, and assigning a class to our block accordingly.&lt;/p&gt;

&lt;p&gt;Now your block should look something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WQ-D9CxR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2018/07/Click-to-Tweet-Toolbar.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WQ-D9CxR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.codeinwp.com/wp-content/uploads/2018/07/Click-to-Tweet-Toolbar.gif" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have finished the JavaScript-side part of our Gutenberg block. You can find the entire source code of the file &lt;a href="https://github.com/HardeepAsrani/hello-gutenberg/blob/master/src/block.js"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now we will finish our block by handling the server-side output.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Server-side rendering&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Gutenberg allows you to use server-side rendering to show your blocks on the front-end. That server-side rendering makes it possible for us to create blocks for shortcodes.&lt;/p&gt;

&lt;p&gt;First, we will make our save method to return null by replacing it with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Defining the front-end interface
save() {
    // Rendering in PHP
    return null;
},
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We will use &lt;em&gt;register_block_type&lt;/em&gt; PHP function to register our block type in PHP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if ( function_exists( 'register_block_type' ) ) {
    // Hook server side rendering into render callback
    register_block_type(
        'hello-gutenberg/click-to-tweet', [
            'render_callback' =&amp;gt; 'hello_gutenberg_block_callback',
            'attributes'      =&amp;gt; array(
                'tweet'  =&amp;gt; array(
                    'type' =&amp;gt; 'string',
                ),
                'tweetsent' =&amp;gt; array(
                    'type' =&amp;gt; 'string',
                ),
                'button'    =&amp;gt; array(
                    'type'  =&amp;gt; 'string',
                    'default' =&amp;gt; 'Tweet',
                ),
                'theme'  =&amp;gt; array(
                    'type'  =&amp;gt; 'boolean',
                    'default' =&amp;gt; false,
                ),
            ),
        ]
    );
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Our &lt;em&gt;register_block_type&lt;/em&gt; function. We first pass our block name to it, along with an array of arguments.&lt;br&gt;
The first argument is the &lt;em&gt;render_callback&lt;/em&gt; function, which calls to our &lt;em&gt;hello_gutenberg_block_callback&lt;/em&gt; function for server-side rendering.&lt;/p&gt;

&lt;p&gt;After our render callback, we pass attributes as an array, similar to block.js file, which we use in our render callback function.&lt;/p&gt;

&lt;p&gt;Our render callback function looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function hello_gutenberg_block_callback( $attr ) {
    extract( $attr );
    if ( isset( $tweet ) ) {
        $theme = ( $theme === true ? 'click-to-tweet-alt' : 'click-to-tweet' );
        $shortcode_string = '[clicktotweet tweet="%s" tweetsent="%s" button="%s" theme="%s"]';
        return sprintf( $shortcode_string, $tweet, $tweetsent, $button, $theme );
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We extract all the attributes and then return it inside our shortcode. That is all it takes to adapt your shortcode plugins for Gutenberg.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can find all the code used in this article in this &lt;a href="https://github.com/HardeepAsrani/hello-gutenberg"&gt;hello-gutenberg&lt;/a&gt; repository.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;In the next part, we will take a look at others ways to adapt existing plugins for Gutenberg, including the Sidebar API.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;If you have any questions on how to adapt your plugin for Gutenberg, please ask them in the comments!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The article was originally published on &lt;a href="https://www.codeinwp.com/blog/adapt-your-plugin-for-gutenberg-block-api/"&gt;CodeinWP.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>gutenberg</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>9 of the Best Node.js Hosting Platforms of 2019 (Free and Paid)</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Mon, 29 Jul 2019 10:45:22 +0000</pubDate>
      <link>https://dev.to/codeinwp/9-of-the-best-node-js-hosting-platforms-of-2019-free-and-paid-286c</link>
      <guid>https://dev.to/codeinwp/9-of-the-best-node-js-hosting-platforms-of-2019-free-and-paid-286c</guid>
      <description>&lt;p&gt;Looking for the best Node.js hosting for your next application project? In this post, I’ll share a variety of premium and free Node.js hosting services for users of all knowledge levels.&lt;/p&gt;

&lt;p&gt;In total, the options that we’ll cover are:&lt;/p&gt;

&lt;p&gt;1) Heroku&lt;br&gt;
2) Amazon Web Services&lt;br&gt;
3) DigitalOcean&lt;br&gt;
3) A2 Hosting&lt;br&gt;
4) Glitch&lt;br&gt;
5) Google Cloud Platform&lt;br&gt;
6) Microsoft Azure&lt;br&gt;
7) Platform.sh&lt;br&gt;
8) NodeChef&lt;/p&gt;

&lt;p&gt;Keep reading for a more detailed look at each platform!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. &lt;a href="https://www.heroku.com/" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt; (Heroku.com)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fheroku-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fheroku-1.jpg" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Heroku is a cloud application platform that offers &lt;strong&gt;free Node.js hosting&lt;/strong&gt;, which is a pretty big draw by itself. Of course, there are some limitations, and, much like &lt;a href="https://www.codeinwp.com/blog/free-wordpress-hosting/" rel="noopener noreferrer"&gt;free WordPress hosting&lt;/a&gt;, you’ll probably want to go for paid hosting for a serious project. But if you’re okay with those limitations and are just looking for free Node.js hosting to play around with, it’s a good place to start!&lt;/p&gt;

&lt;p&gt;Heroku also offers paid plans, which are also a good option depending on your needs.&lt;/p&gt;

&lt;p&gt;So what are the limits for Heroku’s free Node.js hosting? Namely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;512MB of memory&lt;/li&gt;
&lt;li&gt;Sleeps after 30 minutes of inactivity&lt;/li&gt;
&lt;li&gt;Only one user&lt;/li&gt;
&lt;li&gt;Comes with a limit of 1,000 “dyno hours” for your entire account (if you verify + with a credit card – otherwise it’s only 550)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those restrictions get in the way of your plans, Heroku’s paid plans can still be affordable, starting at just $7.&lt;/p&gt;

&lt;p&gt;Heroku is well-documented, offers easy scaling, and is just generally pretty developer friendly.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;Amazon Web Services&lt;/a&gt; (AWS.Amazon.com)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Faws-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Faws-1.jpg" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ve probably heard of Amazon Web Services because it powers like…the entire Internet. &lt;em&gt;Okay, that’s a bit of an exaggeration, but it’s pretty, pretty popular.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Through its many integrated services, AWS makes a great option for hosting Node.js applications.&lt;/p&gt;

&lt;p&gt;While there are a lot of &lt;a href="https://www.codeinwp.com/blog/wordpress-s3-guide/" rel="noopener noreferrer"&gt;different services&lt;/a&gt; to choose from, you’ll most likely want to &lt;a href="https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs.html" rel="noopener noreferrer"&gt;start with Elastic Beanstalk&lt;/a&gt;, which “makes it easy to deploy, manage, and scale your Node.js web applications using Amazon Web Services.”&lt;/p&gt;

&lt;p&gt;You just need to upload your code, and then AWS handles deployment and provisioning. Plus, there’s no special charge for the Elastic Beanstalk service – you still only pay for the actual AWS services that you use.&lt;/p&gt;

&lt;p&gt;Another interesting option is Lambda, which offers a &lt;a href="https://www.codeinwp.com/blog/serverless-wordpress-shifter-vs-hardypress-top-headless-wordpress-hosting-options-compared/" rel="noopener noreferrer"&gt;serverless hosting&lt;/a&gt; approach.&lt;/p&gt;

&lt;p&gt;If you aren’t super familiar with AWS yet, you can check out the &lt;a href="https://aws.amazon.com/getting-started/projects/deploy-nodejs-web-app/" rel="noopener noreferrer"&gt;“Deploy a Node.js Web App” project guide&lt;/a&gt; to learn the basics and get your app up and running.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. &lt;a href="https://www.digitalocean.com/" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; (DigitalOcean.com)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fdigitalocean-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fdigitalocean-1.jpg" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DigitalOcean, the popular cloud infrastructure service, also makes a good option for Node.js hosting and lets you &lt;a href="https://marketplace.digitalocean.com/apps/nodejs" rel="noopener noreferrer"&gt;spin up a new Node.js Ubuntu droplet&lt;/a&gt; with just a few clicks. Or, you can also create your own droplet and set everything up yourself.&lt;/p&gt;

&lt;p&gt;It’s not the best option for inexperienced users because you’ll need to manage the infrastructure yourself, but the prices are affordable and DigitalOcean makes it super easy to scale your application as needed.&lt;/p&gt;

&lt;p&gt;You can get started with a new droplet for as little as $5 per month, and you’ll have your choice of eight different data centers on three different continents.&lt;/p&gt;

&lt;p&gt;DigitalOcean also recently acquired &lt;a href="https://nanobox.io/" rel="noopener noreferrer"&gt;Nanobox&lt;/a&gt;, which helps make it easier to deploy web apps – &lt;a href="https://www.digitalocean.com/nanobox/" rel="noopener noreferrer"&gt;you can sign up for the beta here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. &lt;a href="https://www.a2hosting.com/" rel="noopener noreferrer"&gt;A2 Hosting&lt;/a&gt; (A2Hosting.com)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fa2hosting.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fa2hosting.jpg" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A2 Hosting is one of the few “traditional” hosts to offer a dedicated Node.js hosting package. That is, you’re typically looking at cloud or dedicated options for &lt;a href="https://www.codeinwp.com/blog/learning-javascript-for-wordpress/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;, but A2 Hosting lets you use their shared plans.&lt;/p&gt;

&lt;p&gt;This makes A2 Hosting quite an affordable option, with plans starting at just $3.92 per month for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 website&lt;/li&gt;
&lt;li&gt;5 databases&lt;/li&gt;
&lt;li&gt;unlimited storage and transfer&lt;/li&gt;
&lt;li&gt;a free &lt;a href="https://www.codeinwp.com/blog/what-is-ssl-wordpress/" rel="noopener noreferrer"&gt;SSL certificate&lt;/a&gt; via Let’s Encrypt&lt;/li&gt;
&lt;li&gt;cPanel for server management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plans go up from there for more websites and better performance.&lt;/p&gt;

&lt;p&gt;However, the downside of A2 Hosting is that it won’t be as easy to scale your application as it would be with one of the many cloud Node.js hosting providers on this list.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. &lt;a href="https://glitch.com/" rel="noopener noreferrer"&gt;Glitch&lt;/a&gt; (Glitch.com)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fglitch-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fglitch-1.jpg" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re looking for free Node.js hosting for a fun project, Glitch might be the tool for you. It is &lt;em&gt;not&lt;/em&gt; a good option for a serious business, but it is great for fun apps or prototyping.&lt;/p&gt;

&lt;p&gt;You can even create an app anonymously, though you’ll need to log in via GitHub or Facebook if you want your projects to stay active (&lt;em&gt;anonymous apps expire in five days&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Glitch does not let you use your own domain, and there are some other restrictions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projects sleep after 5 minutes if not used and are automatically stopped after 12 hours. They wake when receiving another HTTP request.&lt;/li&gt;
&lt;li&gt;200MB disk space limit and 512MB assets storage space.&lt;/li&gt;
&lt;li&gt;512MB RAM, just like Heroku’s free Node.js hosting limits.&lt;/li&gt;
&lt;li&gt;Limited to 4,000 requests per hour.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Glitch is from the same team as Stack Overflow, Stack Exchange, and Trello (&lt;em&gt;before Trello was acquired by Atlassian&lt;/em&gt;), so it’s got some weight behind it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;6. &lt;a href="https://cloud.google.com/" rel="noopener noreferrer"&gt;Google Cloud Platform&lt;/a&gt; (Cloud.Google.com)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fcloud.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fcloud.jpg" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to host your Node.js app on the same infrastructure that powers Google Search and YouTube, Google Cloud Platform might just be the best Node.js hosting for you.&lt;/p&gt;

&lt;p&gt;Like Amazon Web Services, you’ll have your choice of a ton of different products and services. One that you’ll definitely want to consider is &lt;a href="https://cloud.google.com/appengine/" rel="noopener noreferrer"&gt;Google App Engine&lt;/a&gt;, which lets you “focus just on writing code, without the worry of managing the underlying infrastructure”.&lt;/p&gt;

&lt;p&gt;And, like AWS, you’ll only pay for the resources that you actually use.&lt;/p&gt;

&lt;p&gt;For a guide to getting started with hosting Node.js apps on Google Cloud Platform, &lt;a href="https://cloud.google.com/nodejs/getting-started/hello-world" rel="noopener noreferrer"&gt;check out Google’s Node.JS App Engine quick-start guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;7. &lt;a href="https://azure.microsoft.com/en-us/" rel="noopener noreferrer"&gt;Microsoft Azure&lt;/a&gt; (Azure.Microsoft.com)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fazure-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fazure-1.jpg" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another one of the big name cloud computing platforms, Microsoft Azure also offers a number of services that make it easy to host and deploy Node.js applications.&lt;/p&gt;

&lt;p&gt;Specifically, &lt;a href="https://azure.microsoft.com/en-in/services/app-service/" rel="noopener noreferrer"&gt;Azure’s App Service&lt;/a&gt; offers a fully managed solution for hosting Node.js applications.&lt;/p&gt;

&lt;p&gt;Another attractive thing about Microsoft Azure is that it offers 12 months of free core services, along with a $200 credit that you can use for additional services in your first 30 days. So while it’s not free forever, you can get a lot of mileage before you need to pay.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;8. &lt;a href="https://platform.sh/" rel="noopener noreferrer"&gt;Platform.sh&lt;/a&gt; (Platform.sh)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fplatform.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fplatform.jpg" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you hate managing infrastructure for your Node.js applications, Platform.sh might be the best Node.js hosting for your app.&lt;/p&gt;

&lt;p&gt;As the name suggests, it’s a platform-as-a-service (PaaS) that handles managing all of your app’s infrastructure.&lt;/p&gt;

&lt;p&gt;It’s not technically hosting itself because Platform.sh partners with AWS, Google Cloud Platform, Microsoft Azure, etc. But it does make it a lot easier for you to run Node.js applications on that cloud infrastructure.&lt;/p&gt;

&lt;p&gt;Platform.sh’s plans start at $50 per month and go up from there depending on your needs. You can also get a free trial to test it out – no credit card required.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;9. &lt;a href="https://www.nodechef.com/" rel="noopener noreferrer"&gt;NodeChef&lt;/a&gt; (NodeChef.com)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fnodechef-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fnodechef-1.jpg" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With plans starting at just $9 per month, NodeChef offers affordable Node.js hosting for your app using Docker containers on bare metal servers in your choice of four data centers on four continents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;US-East&lt;/li&gt;
&lt;li&gt;EU-West (Paris)&lt;/li&gt;
&lt;li&gt;Singapore&lt;/li&gt;
&lt;li&gt;Sydney&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ou can choose between SQL and NoSQL databases, and NodeChef also offers easy scaling and automated SSL certificate provisioning.&lt;/p&gt;

&lt;p&gt;NodeChef’s $9 per month entry-level plan gets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 CPU&lt;/li&gt;
&lt;li&gt;128 MB app memory&lt;/li&gt;
&lt;li&gt;100 MB database memory&lt;/li&gt;
&lt;li&gt;1 GB database storage&lt;/li&gt;
&lt;li&gt;Unmetered bandwidth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can then scale up individual resources as needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What’s the best Node.js hosting for your needs?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here’s a quick summary:&lt;/p&gt;

&lt;p&gt;Best Node.js hosting in the market&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HOST&lt;/th&gt;
&lt;th&gt;PRICE FORM&lt;/th&gt;
&lt;th&gt;PAY BY USAGE?*&lt;/th&gt;
&lt;th&gt;CLOUD-BASED?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Heroku&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A2 Hosting&lt;/td&gt;
&lt;td&gt;$3.92&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Glitch&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;N/A-Free&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud Platform&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Azure&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform.sh&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NodeChef&lt;/td&gt;
&lt;td&gt;$9&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;By “Pay by usage”, we mean that you pay based on the actual resources that you use, rather than some set amount every month.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To close out this post and help you pick the best Node.js hosting for your specific situation, let’s run through some scenarios:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, if you’re technically-savvy, the big cloud infrastructure services make a good option, and they usually give you services that help streamline managing your app and eliminate a lot of the more tedious infrastructure requirements.&lt;/p&gt;

&lt;p&gt;Of course, you have the big three here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;, along with Elastic Beanstalk&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cloud.google.com/" rel="noopener noreferrer"&gt;Google Cloud Platform&lt;/a&gt;, along with App Engine&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://azure.microsoft.com/en-us/" rel="noopener noreferrer"&gt;Microsoft Azure&lt;/a&gt;, along with App Service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.digitalocean.com/" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; and &lt;a href="https://www.heroku.com/" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt; also offer good options, and &lt;a href="https://platform.sh/" rel="noopener noreferrer"&gt;Platform.sh&lt;/a&gt; offers a PaaS to help you with end-to-end development.&lt;/p&gt;

&lt;p&gt;If you’re specifically looking for free Node.js hosting, &lt;a href="https://glitch.com/" rel="noopener noreferrer"&gt;Glitch&lt;/a&gt; is a good option for non-mission critical stuff, and &lt;a href="https://www.heroku.com/" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt;  also offers a limited free plan.&lt;/p&gt;

&lt;p&gt;Finally, if you don’t want to go the cloud route, &lt;a href="https://www.a2hosting.com/" rel="noopener noreferrer"&gt;A2 Hosting&lt;/a&gt; offers an affordable entry point at ~$4 per month and is one of the few hosts that will let you run &lt;a href="https://www.nodechef.com/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; without getting your own VPS or dedicated server. And NodeChef also offers an affordable price point with its Docker container approach on bare metal servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Any questions about picking the best hosting for Node.js? Ask away in the comments!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The article was originally published on &lt;a href="https://www.codeinwp.com/blog/best-nodejs-hosting/" rel="noopener noreferrer"&gt;CodeinWP.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>hosting</category>
    </item>
    <item>
      <title>Beginner’s Guide to Learning JavaScript as a WordPress Developer</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Mon, 22 Jul 2019 12:19:20 +0000</pubDate>
      <link>https://dev.to/codeinwp/beginner-s-guide-to-learning-javascript-as-a-wordpress-developer-4523</link>
      <guid>https://dev.to/codeinwp/beginner-s-guide-to-learning-javascript-as-a-wordpress-developer-4523</guid>
      <description>&lt;p&gt;If you have been following the happenings in the WordPress community for the past couple of months, you might already be aware of the rising importance of JavaScript.&lt;/p&gt;

&lt;p&gt;First up, the WordPress.com desktop app, Calypso, departed from the standard PHP route and has been coded using JavaScript (something CodeinWP &lt;a href="https://www.codeinwp.com/blog/december-2015-wordpress-news/" rel="noopener noreferrer"&gt;talked about recently&lt;/a&gt;). And if that was not enough, in his annual “State of the Word” address in December 2015, Matt Mullenweg kept it straight and simple:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Learn JavaScript, deeply."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Naturally, more and more WordPress developers are now turning towards JavaScript, and for all practical purposes, 2016 is going to be the year of JavaScript, at least from the perspective of WordPress developers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2016%2F01%2Flearn-js.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2016%2F01%2Flearn-js.jpg" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are an existing WordPress developer, how should you begin your journey with JavaScript? More importantly, what aspects of this diverse coding language should you care the most about? In this post, I will attempt to answer these questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your beginner’s guide to learning JavaScript as a WordPress developer&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Introducing JavaScript to WordPress developers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Once again, if you have been active in the WordPress community, you might have already familiarized yourself with the basics of JavaScript and as such, we probably do not need to remind ourselves that JavaScript is different from JAVA.&lt;/p&gt;

&lt;p&gt;Now, moving on to another question: &lt;strong&gt;is JavaScript really that unknown for WordPress?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not really.&lt;/p&gt;

&lt;p&gt;In fact, even before WordPress 4.4, JavaScript has had a role in WordPress – the js folder within &lt;em&gt;wp-includes&lt;/em&gt; and &lt;em&gt;wp-admin&lt;/em&gt; stands for JavaScript, which has so far, been mostly employed in theme development. Thus, even though JS has been around in the world of WordPress for quite a while, now with the first half of REST API on board and applications such as Calypso, its role has risen manifolds.&lt;/p&gt;

&lt;p&gt;Any WordPress developer starting off with JavaScript might feel confused, simply because JavaScript has a world of its own. For example, take up three very common terms that are associated with JS: &lt;a href="https://www.codeinwp.com/blog/learning-javascript-for-wordpress/" rel="noopener noreferrer"&gt;jQuery&lt;/a&gt;, AngularJS and Node.js.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2016%2F01%2FjQuery-AngularJS-Node.js_.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2016%2F01%2FjQuery-AngularJS-Node.js_.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All of the three above entities, even though related to JavaScript, are totally different from each other. JQuery is a JavaScript library, whereas AngularJS is a JavaScript framework, and Node.js is a JavaScript runtime environment.&lt;/p&gt;

&lt;p&gt;There are some coders who believe it is wiser to start off with plain vanilla JS, while others prefer relying on a framework or a library. And the talk doesn’t end there. If you decide to start with a JavaScript library, you will also have to learn about its add-ons or plugins (yes, there are plugins that extend the core functionality of libraries, much like libraries extend the core features of JavaScript).&lt;/p&gt;

&lt;p&gt;Confused already? Read on!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Know the fundamentals&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you are really serious about your JavaScript skills, you must focus heavily on the fundamentals. This is especially important because as a WordPress developer, you must already be aware of PHP, and JS is different from PHP in various aspects.&lt;/p&gt;

&lt;p&gt;Most PHP developers are accustomed to PHP’s functional approach, and while PHP does have a lot of object-oriented principles, it is, for the most part, a functional language. JavaScript, on the other hand, is a strictly object-oriented language. Mozilla Developer documentation talks about the &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects" rel="noopener noreferrer"&gt;OOP basics of JavaScript&lt;/a&gt; in detail.&lt;/p&gt;

&lt;p&gt;Once you have mastered the fundamentals and basics of JavaScript, you can get started with frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pick a JavaScript framework&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Learning a JavaScript framework is vital if you wish to get started with building JS applications and projects as quick as possible. If you have had some experience with theme development in WordPress, you might already be familiar with HTML and CSS, and more importantly, you will be aware of the ease of coding that a good framework can bring to the table.&lt;/p&gt;

&lt;p&gt;Experts and coders are divided when it comes to picking the perfect JavaScript framework for beginners. Personally, for users who are familiar with the MVC framework, such as concrete5 developers, I have always recommended &lt;a href="https://angularjs.org/" rel="noopener noreferrer"&gt;AngularJS&lt;/a&gt; as the better choice.&lt;/p&gt;

&lt;p&gt;Angular supports the MVC structure and is really easy to get started with. However, WordPress coders, at times, are not very familiar with the MVC structure and as such, React seems to be an easier and more apt option. Furthermore, since &lt;a href="https://github.com/reactjs" rel="noopener noreferrer"&gt;React&lt;/a&gt; uses just the View component, it is popular among designers as well.&lt;/p&gt;

&lt;p&gt;There are other options as well, but for the most part, any journey in the world of JavaScript frameworks should begin with either React or AngularJS. I once wrote a comparative article about the two frameworks, and for greater details, you can find that article &lt;a href="https://torquemag.io/2015/08/comparing-angularjs-react/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Decide what you need&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Much like any other skill, learning a new programming language is a matter of needs and requirements. After all, you are trying to learn JavaScript because you need it.&lt;/p&gt;

&lt;p&gt;In JavaScript, libraries and frameworks are defined on the basis of your needs. For example, Node.js is ideal for folks who have to deal with server-side programming. Similarly, while React is a great choice for web development, it is lacking when it comes to mobile app development.&lt;/p&gt;

&lt;p&gt;For WordPress developers, the needs can basically be split as backend or frontend.  &lt;strong&gt;If you are dealing with frontend development, frameworks such as &lt;a href="https://angularjs.org/" rel="noopener noreferrer"&gt;AngularJS&lt;/a&gt;, &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React&lt;/a&gt;, or &lt;a href="https://backbonejs.org/" rel="noopener noreferrer"&gt;Backbone.js&lt;/a&gt; will suffice for your needs&lt;/strong&gt;.  You can find a longer list with more options &lt;a href="https://github.com/collections/front-end-javascript-frameworks" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2016%2F01%2Fangular.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2016%2F01%2Fangular.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For  &lt;strong&gt;backend coders, however, especially ones who are already well-versed with PHP, &lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; is a skill worth acquiring.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2016%2F01%2Fnode.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2016%2F01%2Fnode.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Where to learn&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Thanks to the internet, there is no shortage of resources for anyone willing to learn something new, and JavaScript is no exception either. You can discuss your doubts at Stack Overflow, follow the tutorials at &lt;a href="https://www.udemy.com/" rel="noopener noreferrer"&gt;Udemy&lt;/a&gt; or &lt;a href="https://www.lynda.com/" rel="noopener noreferrer"&gt;Lynda.com&lt;/a&gt;, and of course, refer to the great literature produced by several WordPress blogs out there.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://javascriptissexy.com/" rel="noopener noreferrer"&gt;JavaScript is Sexy&lt;/a&gt; is a good resource for learning JavaScript, whether you are a beginner or an advanced learner. Unfortunately, this site has not been updated for quite a while, so you’ll need to proceed with caution. That said, certain threads such as &lt;a href="http://javascriptissexy.com/oop-in-javascript-what-you-need-to-know/" rel="noopener noreferrer"&gt;OOP in JavaScript&lt;/a&gt; is still useful and relevant.&lt;/p&gt;

&lt;p&gt;Codecademy’s &lt;a href="https://www.codecademy.com/learn/introduction-to-javascript" rel="noopener noreferrer"&gt;JavaScript Track&lt;/a&gt; is quite popular among beginners, and you should give it a spin. Similarly, if you are keen on learning jQuery, Code School’s &lt;a href="https://jquery.com/" rel="noopener noreferrer"&gt;Try jQuery&lt;/a&gt; plan is a good pick.&lt;/p&gt;

&lt;p&gt;For learning React, I have found &lt;a href="https://reactforbeginners.com/" rel="noopener noreferrer"&gt;React for Beginners&lt;/a&gt; to be the most well-planned and structured resource. &lt;a href="http://superherojs.com/" rel="noopener noreferrer"&gt;Superhero.js&lt;/a&gt; is another amazing collection of resources and tutorials that you can learn from.&lt;/p&gt;

&lt;p&gt;In terms of books, the options are plenty, and you can find some of the most useful and popular ones on &lt;a href="https://github.com/wesbos/ama/issues/61" rel="noopener noreferrer"&gt;this GitHub thread&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As a WordPress developer, your journey towards learning JavaScript will, more or less, be identical to the way you began with PHP.&lt;/p&gt;

&lt;p&gt;Practical knowledge of PHP is sufficient to tweak and get more out of WordPress and themes or plugins, but if you wish to seriously build something big, knowledge of PHP fundamentals is essential. Similarly, while mastering a framework in JavaScript will give you a quick start, you will also need to master the fundamentals of JS, in order to get the most out of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have you started learning JavaScript? How has your experience been so far?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The article was originally published on &lt;a href="https://www.codeinwp.com/blog/learning-javascript-for-wordpress/" rel="noopener noreferrer"&gt;CodeinWP.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Angular vs React vs Vue: Which Framework to Choose in 2019</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Tue, 16 Jul 2019 07:30:02 +0000</pubDate>
      <link>https://dev.to/codeinwp/angular-vs-react-vs-vue-which-framework-to-choose-in-2019-2pkb</link>
      <guid>https://dev.to/codeinwp/angular-vs-react-vs-vue-which-framework-to-choose-in-2019-2pkb</guid>
      <description>&lt;p&gt;Just about a year ago, developers were mainly debating on whether they should be using Angular or React for their projects. But over the course of 2018, we saw a growth of interest in a third player called Vue.js. Looking forward into 2019, this post is a comprehensive guide on which is perhaps the right solution for you: Angular vs React vs Vue.&lt;/p&gt;

&lt;p&gt;If you are a &lt;a href="https://www.codeinwp.com/blog/best-wordpress-dev-tools/" rel="noopener noreferrer"&gt;developer starting out&lt;/a&gt; on a project and cannot decide on which JavaScript framework to use, this guide should help you make a decision.&lt;/p&gt;

&lt;p&gt;We cover various aspects of Angular, Vue, and React to see how they suit your needs. This post is not just a guide on Angular vs React vs Vue but aims to provide a structure to help judge front-end JavaScript frameworks in general. In case a new framework arrives next year, you will know exactly what parameters to look at!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;* In this post, we assume that you have &lt;a href="https://www.codeinwp.com/blog/learning-javascript-for-wordpress/" rel="noopener noreferrer"&gt;basic knowledge of JavaScript&lt;/a&gt; and have used JavaScript frameworks as well.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s get started:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 1: A brief history of Vue vs React vs Angular&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Before we get into the technical details, let’s first talk &lt;a href="https://www.codeinwp.com/blog/default-wordpress-themes/" rel="noopener noreferrer"&gt;about the history&lt;/a&gt; behind these frameworks – just to better appreciate their philosophy and their evolution over time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A141%2Fh%3A146%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fangular-logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A141%2Fh%3A146%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fangular-logo.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://angular.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Angular&lt;/strong&gt;&lt;/a&gt;, developed by Google, was first released in 2010, making it the oldest of the lot. It is a TypeScript based JavaScript framework. A substantial shift occurred in 2016 on the release of Angular 2 (and the dropping of the “JS” from the original name – AngularJS). Angular 2+ is known as just Angular. Although AngularJS (version 1) still gets updates, we will focus the discussion on Angular. The latest stable version is Angular 7, which was released in October 2018.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A141%2Fh%3A122%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fvue-logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A141%2Fh%3A122%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fvue-logo.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vuejs.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Vue&lt;/strong&gt;&lt;/a&gt;, also known as Vue.js, is the youngest member of the group. It was developed by ex-Google employee Evan You in 2014. Over the last two years, Vue has seen a substantial shift in popularity, even though it doesn’t have the backing of a large company. The current stable version is 2.17, released in August 2018. Vue’s contributors are &lt;a href="https://www.patreon.com/evanyou" rel="noopener noreferrer"&gt;supported by Patreon&lt;/a&gt;. Vue 3, &lt;a href="https://medium.com/the-vue-point/plans-for-the-next-iteration-of-vue-js-777ffea6fabf" rel="noopener noreferrer"&gt;currently in the prototyping phase&lt;/a&gt; is planning to &lt;a href="https://hub.packtpub.com/vue-js-3-0-is-ditching-javascript-for-typescript-what-else-is-new/" rel="noopener noreferrer"&gt;move to TypeScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A141%2Fh%3A132%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Freact-logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A141%2Fh%3A132%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Freact-logo.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;React&lt;/strong&gt;&lt;/a&gt;, developed by Facebook, was initially released in 2013. Facebook uses React extensively in their products (Facebook, Instagram, and WhatsApp). The current stable version in 16.X, released in November 2018.&lt;/p&gt;

&lt;p&gt;Here’s a short summary of Angular vs React vs Vue, in terms of their status and history:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Angular&lt;/th&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;th&gt;Vue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Initial release&lt;/td&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;2013&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official site&lt;/td&gt;
&lt;td&gt;angular.io&lt;/td&gt;
&lt;td&gt;reactjs.org&lt;/td&gt;
&lt;td&gt;vuejs.org&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approx. size (KB)&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current version&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;16.6.3&lt;/td&gt;
&lt;td&gt;2.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Used by&lt;/td&gt;
&lt;td&gt;Google, Wix&lt;/td&gt;
&lt;td&gt;Facebook, Uber&lt;/td&gt;
&lt;td&gt;Alibaba, GitLab&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;License 👮‍♂️&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Before you use an open source framework, make sure you go through its license. Interestingly, all three frameworks use the &lt;a href="https://opensource.org/licenses/MIT" rel="noopener noreferrer"&gt;MIT license&lt;/a&gt;, which provides limited restrictions on reuse, even in proprietary software. Make sure you know the implications of the license before using any framework or software.&lt;/p&gt;

&lt;p&gt;Here is a &lt;a href="https://tldrlegal.com/license/mit-license" rel="noopener noreferrer"&gt;quick summary of the MIT license&lt;/a&gt; in plain English terms.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Popularity 🔥&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As “angular” and “react” are common words, it is difficult to grasp their popularity from Google Trends. Though, a good proxy for their popularity is &lt;a href="https://star-history.t9t.io/" rel="noopener noreferrer"&gt;the number of stars that their GitHub repositories get&lt;/a&gt;. A sudden shift in the number of stars of Vue occurred in mid-2016 and, recently, Vue has been up there with React as the most popular frameworks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2018%2F12%2Fimg-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2018%2F12%2Fimg-1.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let us check how the job market is for Angular vs React vs Vue, which is also a good measure of popularity:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Job market for Angular vs React vs Vue 👷‍♂️&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The best &lt;a href="https://medium.com/zerotomastery/tech-trends-showdown-react-vs-angular-vs-vue-61ffaf1d8706" rel="noopener noreferrer"&gt;sources of data&lt;/a&gt; that indicate the trends on the job market are the various job boards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxvri2witddgjcfkbomde.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxvri2witddgjcfkbomde.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As seen from the trends of late 2018, the number of jobs that require a skill set of Angular or React is roughly the same, whereas that of Vue’s is still only a fraction of this number (about 20%). This list is definitely not exhaustive but gives a good picture of the overall tech industry.&lt;/p&gt;

&lt;p&gt;If you are looking strictly from the point of view of the current job market, your best bet is to learn Angular or React. However, given that Vue has gained popularity over the last two years, it may take some time for projects to use Vue, or new projects that adopt Vue to reach a maturity level that commands a higher number of developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 2: Community and development&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now that you are familiar with the history and trends of each of these frameworks, we will look at the community to assess the development of these frameworks. We have already seen that for all of the frameworks, a major release has been shipped in the last four months, which indicates that development is going on in full swing.&lt;/p&gt;

&lt;p&gt;Let us look at Angular vs React vs Vue with respect to statistics on their GitHub repositories:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Angular&lt;/th&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;th&gt;Vue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;# Watchers&lt;/td&gt;
&lt;td&gt;3.3k&lt;/td&gt;
&lt;td&gt;3.7k&lt;/td&gt;
&lt;td&gt;5.7k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;# Stars&lt;/td&gt;
&lt;td&gt;43k&lt;/td&gt;
&lt;td&gt;71k&lt;/td&gt;
&lt;td&gt;122k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;# Forks&lt;/td&gt;
&lt;td&gt;11k&lt;/td&gt;
&lt;td&gt;16k&lt;/td&gt;
&lt;td&gt;17k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;# Commits in last month&lt;/td&gt;
&lt;td&gt;446&lt;/td&gt;
&lt;td&gt;339&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;# Contributors&lt;/td&gt;
&lt;td&gt;798&lt;/td&gt;
&lt;td&gt;1.8k&lt;/td&gt;
&lt;td&gt;240&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Vue has a huge number of watchers, stars and forks. This shows its popularity among users and its value when comparing Vue vs React. However, the number of commits and contributors for Vue are lower than Angular and React.&lt;/p&gt;

&lt;p&gt;One possible explanation is that &lt;strong&gt;Vue is driven entirely by the open source community, whereas Angular and React have a significant share of Google and Facebook employees contributing to the repositories.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From the statistics, all three projects show significant development activity, and this is surely going to continue in the future — just these statistics cannot be the basis of not deciding to use either of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 3: Migrations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As you’re working with your framework of choice, you don’t want to have to worry about a framework update coming along and messing up your code. Though in most cases you won’t encounter many issues from one version to another, it’s important to keep your finger on the pulse because some updates can be more significant and require tweaks to keep things compatible.&lt;/p&gt;

&lt;p&gt;Angular &lt;a href="https://angular.io/guide/releases" rel="noopener noreferrer"&gt;plans major updates&lt;/a&gt; every six months. There is also a period of another six months before any major APIs are deprecated, which gives you the time of two release cycles (one year) to make necessary changes if any.&lt;/p&gt;

&lt;p&gt;When it comes to Angular vs React, Facebook has stated that &lt;a href="https://reactjs.org/docs/design-principles.html#stability" rel="noopener noreferrer"&gt;stability is of utmost importance&lt;/a&gt; to them, as huge companies like Twitter and Airbnb use React. Upgrades through versions are generally the easiest in React, with scripts such as &lt;a href="https://github.com/reactjs/react-codemod" rel="noopener noreferrer"&gt;react-codemod&lt;/a&gt; helping you to migrate.&lt;/p&gt;

&lt;p&gt;In the FAQ section for Migration, Vue mentions that &lt;a href="https://vuejs.org/v2/guide/migration.html" rel="noopener noreferrer"&gt;90% of the APIs are same if you are migrating from 1.x to 2&lt;/a&gt;. There is a &lt;a href="https://github.com/vuejs/vue-migration-helper" rel="noopener noreferrer"&gt;migration helper tool&lt;/a&gt; that works on the console to assess the status of your app.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Part 4: Working with Vue vs Angular vs React&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There are a handful of important characteristics to look at here, chief of them being overall size and load times, the components available, and learning curve.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Size and load times ⏲️&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The sizes of the libraries are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular: 500+ KB&lt;/li&gt;
&lt;li&gt;React: 100 KB&lt;/li&gt;
&lt;li&gt;Vue: 80 KB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although there is a significant difference between the sizes of the frameworks, they are still small as compared to the average webpage size (2+ MB in 2018). Additionally, if you use a popular CDN to load these libraries, it is highly probable that a user has the library already loaded in their &lt;a href="https://www.codeinwp.com/blog/local-wordpress-development-tools/" rel="noopener noreferrer"&gt;local system&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Components 🏗️&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Components are integral parts of all three frameworks, no matter if we’re talking &lt;a href="https://www.codeinwp.com/blog/vue-ui-component-libraries/" rel="noopener noreferrer"&gt;Vue&lt;/a&gt;, &lt;a href="https://www.codeinwp.com/blog/react-ui-component-libraries-frameworks/" rel="noopener noreferrer"&gt;React&lt;/a&gt;, or Angular. A component generally gets an input, and changes behavior based on it. This behavior change generally manifests as a change in the UI of some part of the page. The use of components makes it easy to reuse code. A component may be a cart on an &lt;a href="https://www.codeinwp.com/blog/best-ecommerce-platform/" rel="noopener noreferrer"&gt;e-commerce site&lt;/a&gt; or a login box on a social network.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A52%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fangular-logo-copy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A52%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fangular-logo-copy.png" alt="Alt text of image"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;In Angular, components are referred to as &lt;a href="https://angular.io/api/core/Directive" rel="noopener noreferrer"&gt;directives&lt;/a&gt;. Directives are just markers on DOM elements, which Angular can track and attach specific behavior too. Therefore, Angular separates the UI part of components as attributes of HTML tags, and their behaviors in the form of JavaScript code, this is what sets it apart when looking at Angular vs React.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A47%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Freact-logo-copy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A47%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Freact-logo-copy.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React, interestingly, combines the UI and behavior of components. For instance, here is &lt;a href="https://gist.githubusercontent.com/derickbailey/4a7a6c4a899279d9c80b/raw/1821326777044958507c02dc54b2cab814738d90/react-1.js" rel="noopener noreferrer"&gt;the code to create a hello world component in React&lt;/a&gt;. In React, the same part of the code is responsible for creating a UI element and dictating its behavior.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A43%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fvue-logo-copy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A43%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fvue-logo-copy.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Vue, UI and behavior are also a part of components, which makes things more intuitive when looking at Vue vs React. Also, Vue is highly customizable, which allows you to combine the UI and behavior of components from within a script. Further, you can also &lt;a href="https://vue-loader.vuejs.org/guide/pre-processors.html" rel="noopener noreferrer"&gt;use pre-processors in Vue rather than CSS&lt;/a&gt;, which is a great functionality. Vue is great when it comes to integration with other libraries, &lt;a href="https://www.codeinwp.com/blog/best-vuejs-admin-templates-built-with-bootstrap/" rel="noopener noreferrer"&gt;like Bootstrap&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To compare how the same app looks with different libraries, here is a great post on &lt;a href="https://medium.com/javascript-in-plain-english/i-created-the-exact-same-app-in-react-and-vue-here-are-the-differences-e9a1ae8077fd" rel="noopener noreferrer"&gt;creating the same to do list app on React and Vue&lt;/a&gt; and contrasting the differences of the two frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Learning curve 🎓&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;So how difficult is it to learn each of these frameworks?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A52%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fangular-logo-copy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A52%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fangular-logo-copy.png" alt="Alt text of image"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://angular.io/docs" rel="noopener noreferrer"&gt;Angular&lt;/a&gt; has a steep learning curve, considering it is a complete solution, and mastering Angular requires you to learn associated concepts like TypeScript and MVC. Even though it takes time to learn Angular, the investment pays dividends in terms of understanding how the front end works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A47%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Freact-logo-copy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A47%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Freact-logo-copy.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React offers a &lt;a href="https://reactjs.org/docs/getting-started.html" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt; guide that should help one set up React in about an hour. The documentation is thorough and complete, with solutions to common issues already present on StackOverflow. React is not a complete framework and advanced features require the use of third-party libraries. This makes the learning curve of the core framework not so steep but depends on the path you take with additional functionality. However, learning to use React does not necessarily mean that you are using &lt;a href="https://americanexpress.io/clean-code-dirty-code/" rel="noopener noreferrer"&gt;the best practices&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A43%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fvue-logo-copy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A30%2Fh%3A43%2Fq%3Aauto%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fvue-logo-copy.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vuejs.org/v2/guide/#Getting-Started" rel="noopener noreferrer"&gt;Vue&lt;/a&gt; provides higher customizability and hence is easier to learn than Angular or React. Further, Vue has an overlap with Angular and React with respect to their functionality like the use of components. Hence, the transition to Vue from either of the two is an easy option. However, simplicity and flexibility of Vue is a double-edged sword — it allows poor code, making it difficult to debug and test.&lt;/p&gt;

&lt;p&gt;Although Angular, React and Vue have a significant learning curve, their uses upon mastery are limitless. For instance, you can integrate Angular and React &lt;a href="https://www.codeinwp.com/blog/progressive-web-apps-on-wordpress-and-woocommerce/" rel="noopener noreferrer"&gt;with WordPress and WooCommerce to create progressive web apps&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Angular vs React vs Vue: Who wins?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Towards the end of this post, let us recall the characteristic features of each framework to try to answer the question: Angular vs React vs Vue: which one should you choose?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A150%2Fh%3A150%2Fq%3Aauto%2Frt%3Afill%2Fg%3Ace%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fangular-logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A150%2Fh%3A150%2Fq%3Aauto%2Frt%3Afill%2Fg%3Ace%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fangular-logo.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Angular&lt;/strong&gt; is the most mature of the frameworks, has good backing in terms of contributors and is a complete package.&lt;/p&gt;

&lt;p&gt;However, the learning curve is steep and concepts of development in Angular may put off new developers.&lt;/p&gt;

&lt;p&gt;Angular is a good choice for companies with large teams and developers who already use TypeScript.&lt;/p&gt;

&lt;p&gt;Extra 👉 Here are some &lt;a href="https://www.codeinwp.com/blog/best-angular-admin-dashboard-templates/" rel="noopener noreferrer"&gt;Angular admin dashboard templates&lt;/a&gt; that you might be interested in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A150%2Fh%3A150%2Fq%3Aauto%2Frt%3Afill%2Fg%3Ace%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Freact-logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A150%2Fh%3A150%2Fq%3Aauto%2Frt%3Afill%2Fg%3Ace%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Freact-logo.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React&lt;/strong&gt; is just old enough to be mature and has a huge number of contributions from the community. It is gaining widespread acceptance. The job market for React is really good, and the future for this framework looks bright.&lt;/p&gt;

&lt;p&gt;React looks like a good choice for someone getting started with front-end JavaScript frameworks, startups and developers who like some flexibility. The ability to integrate with other frameworks seamlessly gives it a great advantage for those who would like some flexibility in their code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A150%2Fh%3A150%2Fq%3Aauto%2Frt%3Afill%2Fg%3Ace%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fvue-logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fiotvnaw69daj.i.optimole.com%2Fw%3A150%2Fh%3A150%2Fq%3Aauto%2Frt%3Afill%2Fg%3Ace%2Fhttps%3A%2F%2Fmk0codeinwp10tp0961a.kinstacdn.com%2Fwp-content%2Fuploads%2F2019%2F01%2Fvue-logo.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vue&lt;/strong&gt; is new to the arena, without the backing of a major company.&lt;/p&gt;

&lt;p&gt;However, it has done really well in the last few years to come out as a strong competitor for Angular and React. This is perhaps playing a role with a lot of Chinese giants like Alibaba and Baidu picking Vue as their primary front-end JavaScript framework.&lt;/p&gt;

&lt;p&gt;However, it remains to be seen how it does in the future and one is justified to be cautious with it. Vue should be your choice if you prefer simplicity, but also like flexibility.&lt;/p&gt;

&lt;p&gt;Extra 👉 Here are some &lt;a href="https://www.codeinwp.com/blog/best-vuejs-admin-templates-built-with-bootstrap/" rel="noopener noreferrer"&gt;Vue admin templates built with Bootstrap&lt;/a&gt; that you might be interested in.&lt;/p&gt;

&lt;p&gt;The answer to the debate of Angular vs React vs Vue is that there’s no absolute right choice, which you’ve probably expected.&lt;/p&gt;

&lt;p&gt;Each of these libraries has their own benefits and drawbacks. Based on the project you’re working on, and your individual requirements, one of them is going to be more suitable than the others. It’s always key to do your own research before deciding, especially if you’re going to be working on a business venture and not on a personal project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which framework do you think is the winner here – Angular vs React vs Vue?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The article was originally published on &lt;a href="https://www.codeinwp.com/blog/angular-vs-vue-vs-react/" rel="noopener noreferrer"&gt;CodeinWP.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>review</category>
    </item>
    <item>
      <title>A Vue.js Tutorial for Beginner Developers: Learn the Basics and Use This Starter Vue Structure</title>
      <dc:creator>Chris Fitzgerald</dc:creator>
      <pubDate>Fri, 12 Jul 2019 10:55:50 +0000</pubDate>
      <link>https://dev.to/codeinwp/a-vue-js-tutorial-for-beginner-developers-learn-the-basics-and-use-this-starter-vue-structure-2mii</link>
      <guid>https://dev.to/codeinwp/a-vue-js-tutorial-for-beginner-developers-learn-the-basics-and-use-this-starter-vue-structure-2mii</guid>
      <description>&lt;p&gt;Whenever you start using new technologies in your development flow, you might feel at least a bit intimidated. Especially when there’s a myriad of npm packages out there in the wild. Mixing and matching things can sometimes take a lot of time and effort, and is usually frustrating. &lt;strong&gt;This is where the following Vue.js tutorial for beginner developers comes into play.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is Vue.js? Why should you care?&lt;/strong&gt; 🤔
&lt;/h3&gt;

&lt;p&gt;Vue.js or Vue for short is a &lt;a href="https://www.codeinwp.com/blog/learning-javascript-for-wordpress/" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt; framework for building user interfaces. Compared to other frameworks, like &lt;a href="https://www.codeinwp.com/blog/angular-vs-vue-vs-react/" rel="noopener noreferrer"&gt;Angular or React&lt;/a&gt;, Vue is more approachable and has not as steep of a learning curve.&lt;/p&gt;

&lt;p&gt;Vue is also modular, and will allow you to split your code into reusable components. Each of them having their own HTML markup, CSS and JavaScript code.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is the scope of this Vue.js tutorial?&lt;/strong&gt; 🔍
&lt;/h3&gt;

&lt;p&gt;The purpose of this short Vue.js tutorial is to provide you with some scaffolding on which you can build and experiment with Vue. We’re going to take a look at a basic setup of a Vue app inside the &lt;a href="https://www.codeinwp.com/blog/evolution-of-wordpress-ui/" rel="noopener noreferrer"&gt;WordPress dashboard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(Note; We will not be teaching you Vue per se in this guide, but you can go ahead and learn more about the framework from the &lt;a href="https://vuejs.org/v2/guide/" rel="noopener noreferrer"&gt;official guide&lt;/a&gt; after you set up the project here – on which you can continue to experiment after we are done.)&lt;/p&gt;

&lt;p&gt;What we’re going to do is use a predefined template for WordPress plugins using Vue. You can find it in the following GitHub repository if you want to take a deeper look: &lt;a href="https://github.com/abaicus/vue-wp-bootstrap" rel="noopener noreferrer"&gt;https://github.com/abaicus/vue-wp-bootstrap&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Vue.js tutorial: Prerequisites&lt;/strong&gt; 🚀
&lt;/h3&gt;

&lt;p&gt;There are a few things that you should already have set up on your computer to continue following this guide:&lt;/p&gt;

&lt;p&gt;Firstly, you are going to need a LAMP stack – you can use XAMPP on Windows or Mac, or Local by Flywheel on Mac, and then set yourself up a fresh &lt;a href="https://www.codeinwp.com/blog/local-wordpress-development-tools/" rel="noopener noreferrer"&gt;local WordPress install&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Make sure you have the &lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;NodeJS package manager&lt;/a&gt; (npm) installed on your machine. You will also need to install two more packages via the terminal – the Vue CLI and the Vue template initializing tool. Like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install -g @vue/cli
$ npm install -g @vue/cli-init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you have installed these two dependencies, you need to change the active directory to your local WordPress instance’s wp-content/plugins directory and then run the following command there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ vue init abaicus/vue-wp-bootstrap my-vue-dashboard-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next up, you will be prompted to answer some questions regarding the setup of your project.&lt;/p&gt;

&lt;p&gt;For the Build prompt, just go ahead and choose the first option for now “Runtime + Compiler: recommended for most users”.&lt;/p&gt;

&lt;p&gt;You can enable ESLint linter if you want. It will detect any linting errors in your project, but you don’t necessarily have to worry about this right now.&lt;/p&gt;

&lt;p&gt;Commit Lint and Pre-Commit Hooks are meant to check your commit messages and the code before sending a commit to GitHub – to keep everything tidy and nicely formatted.&lt;/p&gt;

&lt;p&gt;You will end up with a terminal looking more or less like this after you are done:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fvue-bootstrap-terminal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fvue-bootstrap-terminal.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can go ahead and follow the instructions on the screen. Change the directory to the newly generated plugin directory and run the commands shown in the terminal prompt. This will get your application up and running, waiting for changes inside your code and it will transpile the Vue code to JavaScript.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What does it do?&lt;/strong&gt; 💻
&lt;/h3&gt;

&lt;p&gt;Not much. This is just a basic application that displays some data from the backend. Not much Vue under the hood. You can go ahead to the Plugins Dashboard page and activate it. It’s going to add a new page in your Admin Menu. Upon navigating to it, you’re going to find a dashboard page with two strings:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fvue-dashboard.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fvue-dashboard.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The plugin scaffolding structure&lt;/strong&gt; 👨🏼‍💻
&lt;/h3&gt;

&lt;p&gt;Let’s take a look at the file structure for the newly generated plugin. We’re going to ignore most of the config files in this Vue.js tutorial so that we can focus on the structure of the application:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fvue-file-tree.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codeinwp.com%2Fwp-content%2Fuploads%2F2019%2F06%2Fvue-file-tree.png" alt="Alt text of image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First, we’ve got the &lt;em&gt;plugin.php&lt;/em&gt; file, which is the entry point for the actual plugin. Here, we have the main &lt;strong&gt;Plugin&lt;/strong&gt; class. This is where the main components of the application are included and ran.&lt;/p&gt;

&lt;p&gt;Next up, there’s the &lt;em&gt;package.json&lt;/em&gt; file where all the dependencies and a bunch of other project info is defined. The part in which you may be interested lives under the “scripts” field. There, you have all the commands that you can run with the &lt;em&gt;npm run&lt;/em&gt; prefix. The important ones, for now, should be &lt;em&gt;npm run dev&lt;/em&gt; (which builds the application for development) and &lt;em&gt;npm run build&lt;/em&gt; (which you should run once you are ready to deploy your app for production). The other commands are adjacent to these two or do other stuff that you shouldn’t need to worry about at this moment.&lt;/p&gt;

&lt;p&gt;Inside the &lt;em&gt;includes&lt;/em&gt; directory, there are three files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The &lt;em&gt;rest.php&lt;/em&gt; class doesn’t do anything at the moment, but you already have a structure to add your RestAPI routes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;em&gt;assets.php&lt;/em&gt; class handles style and script enqueueing. Here, the JavaScript file is localized to pass starting data from PHP to our Vue app. At the moment, there are just two texts sent, but you can include anything you want.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;em&gt;admin.php&lt;/em&gt; file is the one that is taking care of adding a new page in the dashboard and rendering the actual plugin page. You’re going to notice the app itself is rendered just as two empty &lt;/p&gt; tags inside the plugin_page() function. That’s because the JavaScript will handle the actual rendering of the application after it loads.


&lt;p&gt;Inside the &lt;em&gt;assets&lt;/em&gt; directory, you’re going to find four more directories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;em&gt;src&lt;/em&gt; directory – the source files for our Vue app, which we’re going to talk about later.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;scss&lt;/em&gt; directory – the SCSS style files from which we generate the CSS stylesheet.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;js&lt;/em&gt; directory – the transpiled code which is generated from our files in the src directory.&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;css&lt;/em&gt; directory – the compiled style from the SCSS files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The &lt;em&gt;src&lt;/em&gt; directory and Vue template files&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Inside this directory, there are two files: &lt;em&gt;main.js&lt;/em&gt; and &lt;em&gt;App.vue&lt;/em&gt;. The main.js file is the entry point for the application. It attaches the Vue app component to the DOM element with the corresponding id.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* jshint esversion: 6 */
import Vue from 'vue'
import App from './App.vue'

window.addEventListener('load', function () {
  new Vue({ // eslint-disable-line no-new
    el: '#mvdp-app',
    components: { App },
    render: (h) =&amp;gt; h(App)
  })
})
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The actual application markup is inside the &lt;em&gt;App.vue&lt;/em&gt; template:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* jshint esversion: 6 */
&amp;lt;template&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;h1&amp;gt;{{this.strings.title}}&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;{{this.strings.description}}&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
  /* global MVDP */
  export default {
    data () {
      return {
        strings: MVDP.strings
      }
    },
    name: 'App.vue'
  }
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;

&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;You can see inside the snippet above that we’re using the strings we localized in the &lt;em&gt;Assets&lt;/em&gt; class. One of the great features of Vue is that the code of the component is neatly organized into template, script, and style making it easy to understand the structure.&lt;/p&gt;

&lt;p&gt;That’s it, you now have a solid starting point for whatever you want to develop further with Vue.js! I hope this Vue.js tutorial has been helpful.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The article was originally published on &lt;a href="https://www.codeinwp.com/blog/vue-js-tutorial/" rel="noopener noreferrer"&gt;CodeinWP.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>wordpress</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
