DEV Community

Chris Dixon
Chris Dixon

Posted on • Originally published at blog.chrisdixon.io

How to add a Gravatar in Vue.js

Adding a Gravatar (Globally Recognised Avatar) is a nice way to personalise the users experience.

It adds a familiar image, which the user uploads, to each site they visit which has it enabled:

gravatar example image

First of all, if you want to upload your own Gravatar image, head over to http://en.gravatar.com/, sign in and upload from here.

We are going to be focusing on the developer side, and how to enable it on your Vue.js website or app.

The process is pretty simple, not authentication is needed, and there is only a few steps to take:

  1. Get the users email (we will already assume you have this)
  2. Trim all of the email's leading and trailing whitespace
  3. Set email to lower case
  4. md5 hash the string

Since we are using Vue.js, we will assume you have the user stored as a data property called user:

  data() {
    return {
      user: {
        email: "awesome@coolcompany.com"
      }
    };
  },
Enter fullscreen mode Exit fullscreen mode

To hash, I am going to use the md5 NPM package, and install in our Vue project:

// npm
npm i md5

// yarn
yarn add md5
Enter fullscreen mode Exit fullscreen mode

Then import into our component's script section:

<script>
import md5 from "md5";

export default { ...
Enter fullscreen mode Exit fullscreen mode

Next, we can use a computed property to calculate the value we need. This will also mean it will watch out for any changes in the user, and update the UI:

  computed: {
    gravatar() {

    }
  }
Enter fullscreen mode Exit fullscreen mode

Using the md5 package, we can hash the users email:

  computed: {
    gravatar() {
      const hash = md5(this.user.email)
    }
  }
Enter fullscreen mode Exit fullscreen mode

We then call the trim() method to remove the whitespace, and lower case the email too:

  computed: {
    gravatar() {
      const hash = md5(this.user.email.trim().toLowerCase());
    }
  }
Enter fullscreen mode Exit fullscreen mode

Now we have the hash, we use it to create a URL to make a "GET" request, which looks like this:

https://www.gravatar.com/avatar/HASH

To create this, we just need to return the URL as our computed value:

  computed: {
    gravatar() {
      const hash = md5(this.user.email.trim().toLowerCase());
      return `https://www.gravatar.com/avatar/${hash}`;
    }
  }
Enter fullscreen mode Exit fullscreen mode

Then in the template, we use the computed value as the image src (don't forget the colon before src since we are using a dynamic value):

<img :src="gravatar" alt="user profile image"  />
Enter fullscreen mode Exit fullscreen mode

And you should see a Gravatar in the browser!

If you don't have your own Gravatar image set, you may see the default image. Personally, I like to change this.

You can either use your own alternative default image, or change the default set by Gravatar.

To use your own, you can add the ?d= parameter, with a URL to your chosen image:

return `https://www.gravatar.com/avatar/${hash}?d=https://upload.wikimedia.org/wikipedia/en/0/02/Homer_Simpson_2006.png`;
Enter fullscreen mode Exit fullscreen mode

Or, use one of the other defaults provided by Gravatar (http://en.gravatar.com/site/implement/images/) like this:

return `https://www.gravatar.com/avatar/${hash}?d=robohash`;
Enter fullscreen mode Exit fullscreen mode

And you can also use the "s" parameter too, which will set the Gravatar size:

return `https://www.gravatar.com/avatar/${hash}?d=robohash&s=200`;
Enter fullscreen mode Exit fullscreen mode

Above we set the width to be 200px x 200px, but the accepted range can be 1px-2048px.

You can also find some more options at http://en.gravatar.com/site/implement/images/, which is worth checking if you want further customisation.

Top comments (2)

Collapse
 
teekatwo profile image
Tori Pugh

I was looking for how to do this and this article was even more helpful than I thought. Thanks for writing it!

Collapse
 
chrisdixon161 profile image
Chris Dixon

yeah it's amazing the things we use everyday but never think about its meaning!