Skip to content

functions/ directory #35

Description

@atinux

Update: Implementation specs: https://gist.github.com/pi0/76bd2991ebe0b575a0eac08bb7a2e668

Introduction

Introducing a functions/ directory could have a powerful effect for users that want to add server functions but without having to go through the serverMiddleware.

functions/helloWorld.js

export default async function ({ req, res, data, nuxt }) {
  // data is parsed from req.body
  // nuxt is actual Nuxt instance
  return { title: 'Hello world!' }
})

On the app side, it will expose a $functions object with $functions.<functionName> method (asynchronous).

pages/hello.vue

<template>
  <h1>{{ title }}</h1>
</template>

<script>
export default {
  async asyncData ({ $functions }) {
    const { title } = await $functions.helloWorld()

    return { title }
  }
}
</script>

How does it work?

@nuxt/functions will:

  1. Create a serverMiddleware on /_nuxt/functions/:functionName
  2. Read and watch ${srcDir}/functions/**/*.js|ts files with chokidar and add to nuxt.$functions (kind of inject but for nuxt instance + ssrContext)
  3. Inject $functions in the Nuxt app with this.addPlugin (server = call ssrContext.$functions method, client, call in POST /_nuxt/function/${functionName} with fetch)

With this system, we could leverage HMR for functions/ in dev mode. Also, we can imagine a way to export this functions as serverless (for client-side call) when running nuxt build with target: 'serverless' or static``, see target pr. We could imagine some community modules to support transforming theses functions to Now V2, Netlify Functions, AWS Lambda, etc.

I believe this could be an official Nuxt module without having to be installed right away, combined with lmify inside Nuxt, it could be installed automatically if a functions/ directory is detected 🔥

In this area, we can leverage a @nuxt/sse module to expose nuxt.$sse in functions and this.$sse in the Vue app.

PS: 0 breaking change 😇
PS2: We could also add req.nuxt for serverMiddleware to get access to nuxt.$sse

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions