docs: document auto-imports and avoid #app and #imports in examples (#3296)

This commit is contained in:
Clément Ollivier 2022-02-18 19:20:55 +01:00 committed by GitHub
parent 916ab563ce
commit 22c3e33c1e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 76 additions and 50 deletions

View File

@ -136,7 +136,7 @@ You may also need to add `@vue/runtime-dom` as a devDependency if you are strugg
:: ::
::alert ::alert
Keep in mind that all options extended from `./.nuxt/tsconfig.json` will be overwritten by the options defined in your `tsconfig.json`. Keep in mind that all options extended from `./.nuxt/tsconfig.json` will be overwritten by the options defined in your `tsconfig.json`.
Overwriting options such as `"compilerOptions.paths"` with your own configuration will lead Typescript to not factor in the module resolutions from `./.nuxt/tsconfig.json`. This can lead to module resolutions such as `#app` not being recognized. Overwriting options such as `"compilerOptions.paths"` with your own configuration will lead Typescript to not factor in the module resolutions from `./.nuxt/tsconfig.json`. This can lead to module resolutions such as `#imports` not being recognized.
In case you need to extend options provided by `./.nuxt/tsconfig.json` further, you can use the `alias` property withing your `nuxt.config`. `nuxi` will pick them up and extend `./.nuxt/tsconfig.json` accordingly. In case you need to extend options provided by `./.nuxt/tsconfig.json` further, you can use the `alias` property withing your `nuxt.config`. `nuxi` will pick them up and extend `./.nuxt/tsconfig.json` accordingly.
:: ::
@ -184,8 +184,6 @@ You can now migrate to the Nuxt 3 plugins API, which is slightly different in fo
Plugins now take only one argument (`nuxtApp`). You can find out more in [the docs](/docs/directory-structure/plugins). Plugins now take only one argument (`nuxtApp`). You can find out more in [the docs](/docs/directory-structure/plugins).
```js ```js
import { defineNuxtPlugin } from '#app'
export default defineNuxtPlugin(nuxtApp => { export default defineNuxtPlugin(nuxtApp => {
nuxtApp.provide('injected', () => 'my injected function') nuxtApp.provide('injected', () => 'my injected function')
// now available on `nuxtApp.$injected` // now available on `nuxtApp.$injected`
@ -202,7 +200,6 @@ Nuxt Bridge provides a new Nuxt 3 meta API that can be accessed with a new `useM
```vue ```vue
<script setup> <script setup>
import { useMeta } from '#app'
useMeta({ useMeta({
title: 'My Nuxt App', title: 'My Nuxt App',
}) })

View File

@ -35,11 +35,14 @@ Because some composables have been removed and don't yet have a replacement, thi
* `useStatic` has been removed. There is no current replacement. Feel free to raise a discussion if you have a use case for this. * `useStatic` has been removed. There is no current replacement. Feel free to raise a discussion if you have a use case for this.
* `reqRef` and `reqSsrRef`, which were deprecated, have now been removed entirely. Follow the instructions below regarding [ssrRef](#ssrref-and-shallowssrref) to replace this. * `reqRef` and `reqSsrRef`, which were deprecated, have now been removed entirely. Follow the instructions below regarding [ssrRef](#ssrref-and-shallowssrref) to replace this.
2. Remove any explicit imports of the basic Vue Composition API composables, or move them to import from `#imports` or `vue`. 2. Remove any explicit imports of the basic Vue Composition API composables.
::alert{type=info}
Nuxt Bridge [auto-imports](/concepts/auto-imports) Vue composables, you don't have to explicitly import them.
::
```diff ```diff
- import { ref, useContext } from '@nuxtjs/composition-api` - import { ref, useContext } from '@nuxtjs/composition-api`
+ import { ref } from '#imports'
``` ```
3. For each other composable you are using from `@nuxtjs/composition-api`, follow the steps below. 3. For each other composable you are using from `@nuxtjs/composition-api`, follow the steps below.
@ -48,7 +51,7 @@ Because some composables have been removed and don't yet have a replacement, thi
This was a type-helper stub function that is now removed. This was a type-helper stub function that is now removed.
Simply remove the `defineNuxtMiddleware` wrapper: Remove the `defineNuxtMiddleware` wrapper:
```diff ```diff
- import { defineNuxtMiddleware } from '@nuxtjs/composition-api` - import { defineNuxtMiddleware } from '@nuxtjs/composition-api`
@ -68,9 +71,9 @@ export default <Middleware> function (ctx) { }
This was a type-helper stub function that is now removed. This was a type-helper stub function that is now removed.
You may also keep using Nuxt 2-style plugins, by simply removing the function (as with [defineNuxtMiddleware](#definenuxtmiddleware)). You may also keep using Nuxt 2-style plugins, by removing the function (as with [defineNuxtMiddleware](#definenuxtmiddleware)).
Simply remove the `defineNuxtPlugin` wrapper: Remove the `defineNuxtPlugin` wrapper:
```diff ```diff
- import { defineNuxtPlugin } from '@nuxtjs/composition-api` - import { defineNuxtPlugin } from '@nuxtjs/composition-api`
@ -96,7 +99,6 @@ This function has been removed, but its use cases can be met by using `useNuxtAp
```diff ```diff
- import { onGlobalSetup } from '@nuxtjs/composition-api' - import { onGlobalSetup } from '@nuxtjs/composition-api'
+ import { defineNuxtPlugin } from '#app'
- export default () => { - export default () => {
- onGlobalSetup(() => { - onGlobalSetup(() => {
@ -116,7 +118,6 @@ The key differences are that you must provide a _key_ for this state (which prev
```diff ```diff
- import { ssrRef } from '@nuxtjs/composition-api' - import { ssrRef } from '@nuxtjs/composition-api'
+ import { useState } from '#app'
- const ref1 = ssrRef('initialData') - const ref1 = ssrRef('initialData')
- const ref2 = ssrRef(() => 'factory function') - const ref2 = ssrRef(() => 'factory function')
@ -142,7 +143,6 @@ The only key difference is that `useRoute` no longer returns a computed property
```diff ```diff
- import { useRouter, useRoute } from '@nuxtjs/composition-api' - import { useRouter, useRoute } from '@nuxtjs/composition-api'
+ import { useRouter, useRoute } from '#imports'
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
@ -157,34 +157,18 @@ In order to access Vuex store instance, you can use `useNuxtApp().$store`.
```diff ```diff
- import { useStore } from '@nuxtjs/composition-api` - import { useStore } from '@nuxtjs/composition-api`
+ import { useNuxtApp } from '#app'
+ const { $store } = useNuxtApp() + const { $store } = useNuxtApp()
``` ```
```vue
<script>
import { useNuxtApp } from '#app'
const { $store } = useNuxtApp()
</script>
```
### `useContext` and `withContext` ### `useContext` and `withContext`
You can access injected helpers using `useNuxtApp`. You can access injected helpers using `useNuxtApp`.
```diff ```diff
- import { useContext } from '@nuxtjs/composition-api` - import { useContext } from '@nuxtjs/composition-api`
+ import { useNuxtApp } from '#app'
+ const { $axios } = useNuxtApp() + const { $axios } = useNuxtApp()
``` ```
```vue
<script>
import { useNuxtApp } from '#app'
const { $axios } = useNuxtApp()
</script>
```
::alert{icon=👉} ::alert{icon=👉}
`useNuxtApp()` also provides a key called `nuxt2Context` which contains all the same properties you would normally access from Nuxt 2 context, but it's advised _not_ to use this directly, as it won't exist in Nuxt 3. Instead, see if there is another way to access what you need. (If not, please raise a feature request or discussion.) `useNuxtApp()` also provides a key called `nuxt2Context` which contains all the same properties you would normally access from Nuxt 2 context, but it's advised _not_ to use this directly, as it won't exist in Nuxt 3. Instead, see if there is another way to access what you need. (If not, please raise a feature request or discussion.)
:: ::
@ -213,7 +197,6 @@ Migrating to the new composables from `useAsync`:
```diff ```diff
<script setup> <script setup>
- import { useAsync } from '@nuxtjs/composition-api' - import { useAsync } from '@nuxtjs/composition-api'
+ import { useLazyAsyncData, useLazyFetch } from '#app'
- const posts = useAsync(() => $fetch('/api/posts')) - const posts = useAsync(() => $fetch('/api/posts'))
+ const { data: posts } = useLazyAsyncData('posts', () => $fetch('/api/posts')) + const { data: posts } = useLazyAsyncData('posts', () => $fetch('/api/posts'))
+ // or, more simply! + // or, more simply!
@ -226,7 +209,6 @@ Migrating to the new composables from `useFetch`:
```diff ```diff
<script setup> <script setup>
- import { useFetch } from '@nuxtjs/composition-api' - import { useFetch } from '@nuxtjs/composition-api'
+ import { useLazyAsyncData, useLazyFetch } from '#app'
- const posts = ref([]) - const posts = ref([])
- const { fetch } = useFetch(() => { posts.value = await $fetch('/api/posts') }) - const { fetch } = useFetch(() => { posts.value = await $fetch('/api/posts') })
+ const { data: posts, refresh } = useLazyAsyncData('posts', () => $fetch('/api/posts')) + const { data: posts, refresh } = useLazyAsyncData('posts', () => $fetch('/api/posts'))
@ -246,7 +228,6 @@ In order to interact with `vue-meta`, you may use `useNuxt2Meta`, which will wor
```diff ```diff
<script setup> <script setup>
- import { useMeta } from '@nuxtjs/composition-api' - import { useMeta } from '@nuxtjs/composition-api'
+ import { useNuxt2Meta } from '#app'
useNuxt2Meta({ useNuxt2Meta({
title: 'My Nuxt App', title: 'My Nuxt App',
}) })
@ -257,7 +238,6 @@ You can also pass in computed values or refs, and the meta values will be update
```ts ```ts
<script setup> <script setup>
import { useNuxt2Meta } from '#app'
const title = ref('my title') const title = ref('my title')
useNuxt2Meta({ useNuxt2Meta({
title, title,
@ -275,7 +255,6 @@ Nuxt Bridge also provides a Nuxt 3-compatible meta implementation that can be ac
```diff ```diff
<script setup> <script setup>
- import { useMeta } from '@nuxtjs/composition-api' - import { useMeta } from '@nuxtjs/composition-api'
+ import { useMeta } from '#app'
useMeta({ useMeta({
title: 'My Nuxt App', title: 'My Nuxt App',
}) })

View File

@ -0,0 +1,58 @@
# Auto imports
Nuxt auto-imports helper functions, composables and Vue APIs to use across your application without explicitly importing them. Based on the directory structure, every Nuxt application can also use auto-imports for its own components, composables and plugins.
Contrary to a classic global declaration, Nuxt preserves typings and IDEs completions and hints, and only includes what is actually used in your production code.
::alert{type=info}
💡 In the documentation, every function that is not explicitly imported is auto-imported by Nuxt and can be used as-is in your code.
::
::alert{type=info}
🚧 We are working on a proper API reference that will include every Nuxt auto-imports. For now, you can find a reference on the framework repository: [github.com/nuxt/framework/blob/main/packages/nuxt3/src/auto-imports/imports.ts](https://github.com/nuxt/framework/blob/main/packages/nuxt3/src/auto-imports/imports.ts)
::
## Nuxt auto-imports
Nuxt auto-imports functions and composables to perform [data fetching](/docs/usage/data-fetching), get access to the [app context](/docs/usage/nuxt-app) and [runtime config](/docs/usage/runtime-config), manage [state](/docs/usage/state) or define components and plugins.
These functions can be used in components, composables or plugins.
```vue
<script setup>
/* useAsyncData() and $fetch() are auto-imported */
const { data, refresh, pending } = await useAsyncData('/api/hello', () => $fetch('/api/hello'))
</script>
```
## Vue auto-imports
Vue 3 exposes Reactivity APIs like `ref` or `computed`, as well as lifecycle hooks and helpers that are auto-imported by Nuxt.
```vue
<script setup>
/* ref() and computed() are auto-imported */
const count = ref(1)
const double = computed(() => count.value * 2)
</script>
```
## Directory based auto-imports
Nuxt directly auto-imports files created in defined directories:
- `components/` for [Vue components](/docs/directory-structure/components).
- `composables/` for [Vue composables](/docs/directory-structure/composables).
## Explicit imports
Every Nuxt auto-import is exposed by the `#imports` alias that can be used to make the import explicit if needed:
```vue
<script setup>
import { ref, computed } from '#imports'
const count = ref(1)
const double = computed(() => count.value * 2)
</script>
```

View File

@ -31,7 +31,7 @@ Nitro also [auto-generates types](/concepts/server-engine#typed-api-routes) for
:: ::
::alert ::alert
Keep in mind that all options extended from `./.nuxt/tsconfig.json` will be overwritten by the options defined in your `tsconfig.json`. Keep in mind that all options extended from `./.nuxt/tsconfig.json` will be overwritten by the options defined in your `tsconfig.json`.
Overwriting options such as `"compilerOptions.paths"` with your own configuration will lead Typescript to not factor in the module resolutions from `./.nuxt/tsconfig.json`. This can lead to module resolutions such as `#app` not being recognized. Overwriting options such as `"compilerOptions.paths"` with your own configuration will lead Typescript to not factor in the module resolutions from `./.nuxt/tsconfig.json`. This can lead to module resolutions such as `#imports` not being recognized.
In case you need to extend options provided by `./.nuxt/tsconfig.json` further, you can use the `alias` property within your `nuxt.config`. `nuxi` will pick them up and extend `./.nuxt/tsconfig.json` accordingly. In case you need to extend options provided by `./.nuxt/tsconfig.json` further, you can use the `alias` property within your `nuxt.config`. `nuxi` will pick them up and extend `./.nuxt/tsconfig.json` accordingly.
:: ::

View File

@ -9,8 +9,6 @@ In Nuxt 2, this was referred to as [Nuxt context](https://nuxtjs.org/docs/intern
Within composables, plugins and components you can access `nuxtApp` with `useNuxtApp`: Within composables, plugins and components you can access `nuxtApp` with `useNuxtApp`:
```js ```js
import { useNuxtApp } from '#app'
function useMyComposable () { function useMyComposable () {
const nuxtApp = useNuxtApp() const nuxtApp = useNuxtApp()
// access runtime nuxt app instance // access runtime nuxt app instance

View File

@ -48,11 +48,8 @@ admins 123
If you want to access the route using Composition API, there is a global `useRoute` function that will allow you to access the route just like `this.$route` in the Options API. If you want to access the route using Composition API, there is a global `useRoute` function that will allow you to access the route just like `this.$route` in the Options API.
```js ```vue
<script setup> <script setup>
// This import statement is optional since it's automatically imported by Nuxt.
// import { useRoute } from '#imports'
const route = useRoute() const route = useRoute()
if (route.params.group === 'admins' && !route.params.id) { if (route.params.group === 'admins' && !route.params.id) {

View File

@ -34,8 +34,6 @@ Only `myPlugin.ts` and `myOtherPlugin/index.ts` would be registered.
The only argument passed to a plugin is [`nuxtApp`](/docs/usage/nuxt-app). The only argument passed to a plugin is [`nuxtApp`](/docs/usage/nuxt-app).
```ts ```ts
import { defineNuxtPlugin } from '#app'
export default defineNuxtPlugin(nuxtApp => { export default defineNuxtPlugin(nuxtApp => {
// Doing something with nuxtApp // Doing something with nuxtApp
}) })
@ -46,8 +44,6 @@ export default defineNuxtPlugin(nuxtApp => {
If you would like to provide a helper on the `NuxtApp` instance, just return it from the plugin under a `provide` key. For example: If you would like to provide a helper on the `NuxtApp` instance, just return it from the plugin under a `provide` key. For example:
```ts ```ts
import { defineNuxtPlugin } from '#app'
export default defineNuxtPlugin(() => { export default defineNuxtPlugin(() => {
return { return {
provide: { provide: {
@ -115,7 +111,6 @@ yarn add --dev vue-gtag-next
Then create a plugin file `plugins/vue-gtag.client.js`. Then create a plugin file `plugins/vue-gtag.client.js`.
```ts ```ts
import { defineNuxtPlugin } from '#app'
import VueGtag from 'vue-gtag-next' import VueGtag from 'vue-gtag-next'
export default defineNuxtPlugin((nuxtApp) => { export default defineNuxtPlugin((nuxtApp) => {

View File

@ -6,7 +6,7 @@ head.title: Composables directory
# Composables directory # Composables directory
Nuxt 3 supports `composables/` directory to automatically import your Vue composables into your application using auto-imports! Nuxt 3 supports `composables/` directory to automatically import your Vue composables into your application using [auto-imports](/concepts/auto-imports)!
## How files are scanned ## How files are scanned
@ -27,8 +27,6 @@ Only `useFoo.ts` and `useBar/index.ts` would be searched for imports - and if th
## Example: (using named export) ## Example: (using named export)
```js [composables/useFoo.ts] ```js [composables/useFoo.ts]
import { useState } from '#app'
export const useFoo = () => { export const useFoo = () => {
return useState('foo', () => 'bar') return useState('foo', () => 'bar')
} }
@ -37,8 +35,6 @@ export const useFoo = () => {
## Example: (using default export) ## Example: (using default export)
```js [composables/use-foo.ts or composables/useFoo.ts] ```js [composables/use-foo.ts or composables/useFoo.ts]
import { useState } from '#app'
// It will be available as useFoo() (camelCase of file name without extension) // It will be available as useFoo() (camelCase of file name without extension)
export default function () { export default function () {
return useState('foo', () => 'bar') return useState('foo', () => 'bar')

View File

@ -72,6 +72,8 @@ export default defineNuxtConfig({
Creating Nuxt modules involves tedious and common tasks. [Nuxt Kit](/docs/advanced/kit), provides a convenient and standard API to define Nuxt modules using `defineNuxtModule`: Creating Nuxt modules involves tedious and common tasks. [Nuxt Kit](/docs/advanced/kit), provides a convenient and standard API to define Nuxt modules using `defineNuxtModule`:
```js ```js
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({ export default defineNuxtModule({
meta: { meta: {
// Usually npm package name of your module // Usually npm package name of your module
@ -190,6 +192,8 @@ export default defineNuxtModule<ModuleOptions>({
If your module will provide a CSS library, make sure to check if the user already included the library to avoid duplicates and add an option to disable the CSS library in the module. If your module will provide a CSS library, make sure to check if the user already included the library to avoid duplicates and add an option to disable the CSS library in the module.
```ts ```ts
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({ export default defineNuxtModule({
setup (options, nuxt) { setup (options, nuxt) {
nuxt.options.css.push('font-awesome/css/font-awesome.css') nuxt.options.css.push('font-awesome/css/font-awesome.css')
@ -202,6 +206,8 @@ export default defineNuxtModule({
If your module opens handles or starts a watcher, we should close it when the nuxt lifecycle is done. For this, we can use the `close` hook: If your module opens handles or starts a watcher, we should close it when the nuxt lifecycle is done. For this, we can use the `close` hook:
```ts ```ts
import { defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({ export default defineNuxtModule({
setup (options, nuxt) { setup (options, nuxt) {
nuxt.hook('close', async nuxt => { nuxt.hook('close', async nuxt => {