API: The generate Property

  • Type: Object

Configure the generation of your universal web application to a static web application.

When launching nuxt generate or calling nuxt.generate(), Nuxt.js will use the configuration defined in the generate property.

nuxt.config.js

  1. export default {
  2. generate: {
  3. ...
  4. }
  5. }

concurrency

  • Type: Number
  • Default: 500

The generation of routes are concurrent, generate.concurrency specifies the amount of routes that run in one thread.

dir

  • Type: String
  • Default: 'dist'

Directory name created when building the web application in static mode with nuxt generate or in SPA mode with nuxt build.

devtools

  • Type: boolean
  • Default: false

Configure whether to allow vue-devtools inspection.

If you already activated through nuxt.config.js or otherwise, devtools enable regardless of the flag.

exclude

  • Type: Array

It accepts an array of regular expressions and will prevent generation of routes matching them. The routes will still be accessible when generate.fallback is used.

By default, running nuxt generate will create a file for each route.

  1. -| dist/
  2. ---| index.html
  3. ---| ignore/
  4. -----| about.html
  5. -----| item.html

When adding a regular expression which matches all routes with "ignore", it will prevent the generation of these routes.

nuxt.config.js

  1. export default {
  2. generate: {
  3. exclude: [
  4. /^(?=.*\bignore\b).*$/
  5. ]
  6. }
  7. }
  1. -| dist/
  2. ---| index.html

fallback

  • Type: String or Boolean
  • Default: 200.html
  1. export default {
  2. generate: {
  3. fallback: true
  4. }
  5. }

The path to the fallback HTML file. It should be set as the error page, so that also unknown routes are rendered via Nuxt.If unset or set to a falsy value, the name of the fallback HTML file will be 200.html. If set to true, the filename will be 404.html. If you provide a string as a value, it will be used instead.

When running a SPA it is more idiomatic to use a 200.html, as it's the only file necessary as no other routes are generated.

  1. fallback: false

If working with statically generated pages then it is recommended to use a 404.html for error pages and for those covered by excludes (the files that you do not want generated as static pages).

  1. fallback: true

However, Nuxt allows you to configure any page you like so if you don't want to use the 200.html or 404.html you can add a string and then you just have to make sure you redirect to that page instead. This is of course not necessary and is best to redirect to 200.html/404.html.

  1. fallback: 'fallbackPage.html'

Note: Multiple services (e.g. Netlify) detect a 404.html automatically. If you configure your webserver on your own, please consult it's documentation to find out how to set up an error page (and set it to the 404.html file)

interval

  • Type: Number
  • Default: 0

Interval between two render cycles to avoid flooding a potential API with API calls from the web application.

minify

routes

  • Type: Array

Dynamic routes are ignored by the generate command (yarn generate). Nuxt does not know what these routes will be so it can't generate them.

Example:

  1. -| pages/
  2. ---| index.vue
  3. ---| users/
  4. -----| _id.vue

Only the route / will be generated by Nuxt.js.

If you want Nuxt.js to generate routes with dynamic params, you need to set the generate.routes property to an array of dynamic routes.

We add routes for /users/:id in nuxt.config.js:

  1. export default {
  2. generate: {
  3. routes: [
  4. '/users/1',
  5. '/users/2',
  6. '/users/3'
  7. ]
  8. }
  9. }

Then when we launch nuxt generate:

  1. [nuxt] Generating...
  2. [...]
  3. nuxt:render Rendering url / +154ms
  4. nuxt:render Rendering url /users/1 +12ms
  5. nuxt:render Rendering url /users/2 +33ms
  6. nuxt:render Rendering url /users/3 +7ms
  7. nuxt:generate Generate file: /index.html +21ms
  8. nuxt:generate Generate file: /users/1/index.html +31ms
  9. nuxt:generate Generate file: /users/2/index.html +15ms
  10. nuxt:generate Generate file: /users/3/index.html +23ms
  11. nuxt:generate HTML Files generated in 7.6s +6ms
  12. [nuxt] Generate done

Great, but what if we have dynamic params?

  • Use a Function which returns a Promise.
  • Use a Function with a callback(err, params).

Function which returns a Promise

nuxt.config.js

  1. import axios from 'axios'
  2. export default {
  3. generate: {
  4. routes () {
  5. return axios.get('https://my-api/users')
  6. .then((res) => {
  7. return res.data.map((user) => {
  8. return '/users/' + user.id
  9. })
  10. })
  11. }
  12. }
  13. }

Function with a callback

nuxt.config.js

  1. import axios from 'axios'
  2. export default {
  3. generate: {
  4. routes (callback) {
  5. axios.get('https://my-api/users')
  6. .then((res) => {
  7. const routes = res.data.map((user) => {
  8. return '/users/' + user.id
  9. })
  10. callback(null, routes)
  11. })
  12. .catch(callback)
  13. }
  14. }
  15. }

Speeding up dynamic route generation with payload

In the example above, we're using the user.id from the server to generate the routes but tossing out the rest of the data. Typically, we need to fetch it again from inside the /users/_id.vue. While we can do that, we'll probably need to set the generate.interval to something like 100 in order not to flood the server with calls. Because this will increase the run time of the generate script, it would be preferable to pass along the entire user object to the context in _id.vue. We do that by modifying the code above to this:

nuxt.config.js

  1. import axios from 'axios'
  2. export default {
  3. generate: {
  4. routes () {
  5. return axios.get('https://my-api/users')
  6. .then((res) => {
  7. return res.data.map((user) => {
  8. return {
  9. route: '/users/' + user.id,
  10. payload: user
  11. }
  12. })
  13. })
  14. }
  15. }
  16. }

Now we can access the payload from /users/_id.vue like so:

  1. async asyncData ({ params, error, payload }) {
  2. if (payload) return { user: payload }
  3. else return { user: await backend.fetchUser(params.id) }
  4. }

subFolders

  • Type: Boolean
  • Default: true

By default, running nuxt generate will create a directory for each route & serve an index.html file.

Example:

  1. -| dist/
  2. ---| index.html
  3. ---| about/
  4. -----| index.html
  5. ---| products/
  6. -----| item/
  7. -------| index.html

When set to false, HTML files are generated according to the route path:

nuxt.config.js

  1. export default {
  2. generate: {
  3. subFolders: false
  4. }
  5. }
  1. -| dist/
  2. ---| index.html
  3. ---| about.html
  4. ---| products/
  5. -----| item.html