Using the Web Share API and meta tags for native sharing
Adding share links for all the various places users can share content from Twitter, to LinkedIn or Reddit and many more, can be a real pain. The Web Share API is growing in support, making sharing content on the web easier than ever. For browsers that don’t support the API you can fall back to self generated share targets.
Supporting all of various places that content can be shared on a web site is tricky, all sites have their own mechanisms for doing it, and you can never support all of the places that a user may want to share content.
Thats where the Web Share API comes in, with it, sharing content on the Web is much more straight forward, using this API also gives your users the freedom to share content wherever they like, from chat apps and social media to a notes app.
At the end of the article I go into the all important html meta tags, to make sure that sites/apps can pick up nice previews for your content.
And your user will end up with a “share sheet”, where they can decide where they want to share.
At this point you’re probably thinking yeah, this is great and all but the browser support is terrible, but I think you might be surprised, the browser support is good in the place it matters most: mobile.
Yeah that is a lot of red, but if you analyze the data, the support is decent in key places:
- Safari 14 on IOS AND Safari on Mac OS.
- Chrome for Android
- Firefox for Android
- Edge (Windows only)
- Samsung Internet
We’re at around 55% of global users, however if you filter to just mobile you’re looking at 91.96% according to caniuse.com. Sure, the obvious missing pieces are cross platform support for Chrome and Firefox, as well as key OSs to capture non Western demographics, but you can always fallback to the older methods of sharing on browsers that don’t support the API, and thats what i’ll go into next.
Web Share API as progressive enhancement
The rest of this article describes the approach that I took for implementing the Web Share API as a progressive enhancement to my blog. For browsers where the API is supported the option is offered, otherwise I added share buttons for common places where I might expect people to share e.g. Twitter.
For my blog i’m using 11ty, a really flexible static site generator which encourages you to build lightweight and fast websites. I wrote about my journey with 11ty over here:
How I got started with 11ty
I work with React and painfully slow Webpack builds every day, using 11ty for my blog was a breath of fresh air. By…
Doing things the old way
Supporting lots of different websites for share targets is quite time consuming, each does it in different ways.
I started out with a bit of html templating:
sharing array of objects and each object has the following:
- url function: passing in the page title, tags for my blog post and the current 11ty page object.
Let’s take a look at how this is implemented; I have the following file
src/_data/external.js, this is where the code earlier gets
external from as its variable name.
The file looks like this.
genericShare.data is missing, you'd be right.
Let’s take a look at that function:
In this function i’m getting the full url for my website
siteMeta.url from a
metadata.json and appending that to the current
page.url. Also in my metadata.json I have some more data about myself e.g. my twitter handle, when people share my posts I can get automatically tagged.
Finally, I added all of the tags from my front matter, that are on the blog post, over to the text for the share content too, I filter out tags that I don’t want, for example tags for my 11ty collection names.
If you aren’t sure what i mean by front matter it’s the metadata at the top of my markdown files:
For a full implementation reference, checkout my Github repo for my blog:
Adding in the Web Share API
Now we’ve implemented the basic behaviour for everyone, we can progressively enhance the website for browsers that support the Web Share API.
Updating the HTML template:
The key thing that has changed from the original example is the addition of:
You’ll see that similar to the example above i’m passing
data-* attributes, and executing a function my global data object
external.genericShare.data(title, tags, page).
By default this content is hidden with
First, i’m checking that we have access to
navigator.share. If its available, the button is made visible, a
click handler is added and on click the
data-* attributes are read, finally
navigator.share is called.
If you wanted to, you could hide your fallback links when
navigator.share is available, I chose not to just yet, but might do down the road, when more desktop site get support for the Web Share API.
To round all of this work out you will want to make sure that you have all of the appropriate meta tags set on your website so that sites can put the correct images/description in share link previews.
You can see my full metadata over on Github.
Support for the Web Share API is growing and with it progressive enhancement is a really great approach to building modern websites, I wrote about using this approach for fast sites, with interactivity sprinkled in: