feature: adds Netlify Function and documentation

feature (#2): add example of Nuxt serverless function
This commit is contained in:
Tara Z. Manicsic 2022-02-22 21:55:19 -05:00 committed by GitHub
commit 310ec06ec7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 88 additions and 6 deletions

View File

@ -1,4 +1,4 @@
# Nuxt Toolbox Template # Nuxt Toolbox Template
## Build Setup ## Build Setup
@ -40,13 +40,15 @@ You can also use `netlify deploy (--prod)` to manually deploy and `netlify open`
### Running Locally ### Running Locally
You can use `netlify dev` from the command line to access project information like environment variables as well as You can use `netlify dev` from the command line to access project information like environment variables as well as
- test functions - test functions
- test redirects - test redirects
- share a live session via url with `netlify dev --live` - share a live session via url with `netlify dev --live`
- [and more](https://cli.netlify.com/netlify-dev/) :) - [and more](https://cli.netlify.com/netlify-dev/) :)
### Deployment Resources ### Deployment Resources
- [CLI docs](https://docs.netlify.com/cli/get-started/) - [CLI docs](https://docs.netlify.com/cli/get-started/)
- [File-based Netlify Configuration](https://docs.netlify.com/configure-builds/file-based-configuration/) - [File-based Netlify Configuration](https://docs.netlify.com/configure-builds/file-based-configuration/)
- [Netlify Dev Overview](https://www.youtube.com/watch?v=RL_gtVZ_79Q&t=812s) - [Netlify Dev Overview](https://www.youtube.com/watch?v=RL_gtVZ_79Q&t=812s)
@ -110,10 +112,13 @@ For this to work we also need to add a `netlify-honeypot` attribute to the form
In the [`netlify.toml`](./netlify.toml) configuration file there is an example of how to implement redirects. Redirects can be used to do many things from redirecting Single Page Apps more predictably, redirecting based on country/language to leveraging On-Demand Builders for [Distributed Persistant Rendering](https://www.netlify.com/blog/2021/04/14/distributed-persistent-rendering-a-new-jamstack-approach-for-faster-builds/). In the [`netlify.toml`](./netlify.toml) configuration file there is an example of how to implement redirects. Redirects can be used to do many things from redirecting Single Page Apps more predictably, redirecting based on country/language to leveraging On-Demand Builders for [Distributed Persistant Rendering](https://www.netlify.com/blog/2021/04/14/distributed-persistent-rendering-a-new-jamstack-approach-for-faster-builds/).
In the example we'll be using redirects to have a shorter endpoint to Netlify functions. By default, you call a Netlify function when requesting a path like `https://yoursite.netlify.com/.netlify/functions/functionName`. Instead, we'll redirect all calls from a path including `/api` to call on the Netlify functions. So the path will be `https://yoursite.netlify.com/api/functionName`, a lot easier to remember too.
In the [`netlify.toml`](./netlify.toml) configuration file there is an example of how to implement redirects. Redirects can be used to do many things from redirecting Single Page Apps more predictably, redirecting based on country/language to leveraging On-Demand Builders for [Distributed Persistant Rendering](https://www.netlify.com/blog/2021/04/14/distributed-persistent-rendering-a-new-jamstack-approach-for-faster-builds/).
In the example we'll be using redirects to have a shorter endpoint to Netlify functions. By default, you call a Netlify function when requesting a path like `https://yoursite.netlify.com/.netlify/functions/functionName`. Instead, we'll redirect all calls from a path including `/api` to call on the Netlify functions. So the path will be `https://yoursite.netlify.com/api/functionName`, a lot easier to remember too.
### Example ### Example
```toml ```toml
[[redirects]] [[redirects]]
from = "/api/*" from = "/api/*"
@ -135,3 +140,22 @@ There are many ways to use redirects. Check out the resouces below to learn more
- [Creating better, more predicatable redirect rules for SPAs](https://www.netlify.com/blog/2020/04/07/creating-better-more-predictable-redirect-rules-for-spas/) - [Creating better, more predicatable redirect rules for SPAs](https://www.netlify.com/blog/2020/04/07/creating-better-more-predictable-redirect-rules-for-spas/)
- [Redirect by country or language](https://docs.netlify.com/routing/redirects/redirect-options/#redirect-by-country-or-language) - [Redirect by country or language](https://docs.netlify.com/routing/redirects/redirect-options/#redirect-by-country-or-language)
- [On-Demand Builders](https://docs.netlify.com/configure-builds/on-demand-builders/) - [On-Demand Builders](https://docs.netlify.com/configure-builds/on-demand-builders/)
## Serverless Functions
With Netlify, you can build out server-side code without having to setup and maintain a dedicated server. Inside of our default folder path, [`netlify/functions`](./netlify/functions) you can see an example of the format for JavaScript functions with the [`joke.js`](./netlify/functions/joke.js) file.
The function format expects a function named `handler` to be exported. This will be the function that will be invoked whenever a client makes a request to the generated endpoints. The endpoint's format is followed as `/.netlify/functions/joke`. So whenever the site is deployed, if you go to `https://<site base url>/.netlify/functions/joke` you will see a random joke!
> Side note: In our example, we're using `import` to include data from another location and `export const const handler` to let our function be consumed by Netlify. We're able to do this because of [esbuild](https://esbuild.github.io). This is a bundler configuration we set in our `netlify.toml` under `[functions]`.
### Serverless Functions Resources
There is quite a bit you can do with these functions, so here are some additional resources to learn more!
- [Netlify Function Format](https://docs.netlify.com/functions/build-with-javascript/#synchronous-function-format)
- [Build Netlify Functions with TypeScript](https://docs.netlify.com/functions/build-with-typescript/)
- [Event-triggered Functions](https://docs.netlify.com/functions/trigger-on-events/)
- [What are Background Functions](https://www.netlify.com/blog/2021/01/07/what-are-background-functions/)
- [Netlify Functions - Examples](https://functions.netlify.com/examples/)
- [Using esbuild as your bundler for new ECMAScript Features](https://www.netlify.com/blog/2021/04/02/modern-faster-netlify-functions/)

25
components/JokeBlock.vue Normal file
View File

@ -0,0 +1,25 @@
<script>
export default {
data: () => ({
joke: '',
}),
async mounted() {
this.joke = await fetch('/api/joke').then((res) => res.json())
},
}
</script>
<template>
<article>
<blockquote>
<p>{{ joke }}</p>
</blockquote>
</article>
</template>
<style scoped>
blockquote {
border-left: 5px solid #ccc;
padding: 0.5rem;
}
</style>

View File

@ -3,7 +3,6 @@
<form <form
netlify netlify
netlify-honeypot netlify-honeypot
action="/testpage"
method="post" method="post"
> >
<p class="hidden"> <p class="hidden">

View File

@ -1,4 +1,4 @@
## This is the configuration file for Netlify ## This is the configuration file for Netlify
## https://docs.netlify.com/configure-builds/file-based-configuration/ ## https://docs.netlify.com/configure-builds/file-based-configuration/
[build] [build]
@ -15,3 +15,6 @@
to = "/.netlify/functions/:splat" # all function calls will go to this path to = "/.netlify/functions/:splat" # all function calls will go to this path
status = 200 # ok code status = 200 # ok code
force = true # ensure to always redirect force = true # ensure to always redirect
[functions]
node_bundler = "esbuild"

15
netlify/functions/joke.js Normal file
View File

@ -0,0 +1,15 @@
// Jokes provided from the lovely folks at https://icanhazdadjoke.com
import jokes from './jokes.json'
export const handler = (event) => {
// Generates a random index based on the length of the jokes array
const randomIndex = Math.floor(Math.random() * jokes.length)
const randomJoke = jokes[randomIndex]
// Netlify Functions need to return an object with a statusCode
// Other properties such as headers or body can also be included.
return {
statusCode: 200,
body: JSON.stringify(randomJoke),
}
}

View File

@ -0,0 +1,7 @@
[
"My New Years resolution is to stop leaving things so late.",
"Child: Dad, make me a sandwich. Dad: Poof! You're a sandwich.",
"The invention of the wheel was what got things rolling",
"What kind of music do mummy's like? Rap",
"What do you get when you cross a chicken with a skunk? A fowl smell!"
]

5
pages/.eslintrc.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
rules: {
'vue/multi-word-component-names': 'off',
},
}

View File

@ -1,6 +1,10 @@
<template> <template>
<FeedbackForm /> <main>
<FeedbackForm />
<JokeBlock />
</main>
</template> </template>
<style> <style>
* { * {
font-family: 'Helvetica', sans-serif; font-family: 'Helvetica', sans-serif;