Hello friends. Today I will introduce you to a new framework that is Nuxtjs. Specifically, I will introduce you to the Routing of NuxtJs.
Introduce a little bit about Nuxt.js
It is a framework used to build applications from Vue.js
Nuxt.js
was released on October 25, 2016 by zeit.co. If anyone is already working with Reactjs
and probably knows Next.js
, this Nuxt.js
is almost the same.
Now I started to enter the main owner of the Routing offline.
Basic Routes
File path:
1 | pages/ --| user/ -----| index.vue -----| one.vue --| index.vue |
It will automatically generate the Router:
1 | router <span class="token punctuation">:</span> <span class="token punctuation">{</span> routes <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token single-quoted-string string">'index'</span> <span class="token punctuation">,</span> path <span class="token punctuation">:</span> <span class="token single-quoted-string string">'/'</span> <span class="token punctuation">,</span> component <span class="token punctuation">:</span> <span class="token single-quoted-string string">'pages/index.vue'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token single-quoted-string string">'user'</span> <span class="token punctuation">,</span> path <span class="token punctuation">:</span> <span class="token single-quoted-string string">'/user'</span> <span class="token punctuation">,</span> component <span class="token punctuation">:</span> <span class="token single-quoted-string string">'pages/user/index.vue'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token single-quoted-string string">'user-one'</span> <span class="token punctuation">,</span> path <span class="token punctuation">:</span> <span class="token single-quoted-string string">'/user/one'</span> <span class="token punctuation">,</span> component <span class="token punctuation">:</span> <span class="token single-quoted-string string">'pages/user/one.vue'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
Nested Routes
Nuxt.js allows you to create nested routes using sub-routes of vue-router.
To determine the parent component of nested routes, you need to create the Vue file with the same name as the folder containing the sub containers.
File path:
1 | pages/ --| users/ -----| _id.vue -----| index.vue --| users.vue |
It will automatically generate the Router:
1 | router <span class="token punctuation">:</span> <span class="token punctuation">{</span> routes <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> path <span class="token punctuation">:</span> <span class="token single-quoted-string string">'/users'</span> <span class="token punctuation">,</span> component <span class="token punctuation">:</span> <span class="token single-quoted-string string">'pages/users.vue'</span> <span class="token punctuation">,</span> children <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> path <span class="token punctuation">:</span> <span class="token single-quoted-string string">''</span> <span class="token punctuation">,</span> component <span class="token punctuation">:</span> <span class="token single-quoted-string string">'pages/users/index.vue'</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token single-quoted-string string">'users'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> path <span class="token punctuation">:</span> <span class="token single-quoted-string string">':id'</span> <span class="token punctuation">,</span> component <span class="token punctuation">:</span> <span class="token single-quoted-string string">'pages/users/_id.vue'</span> <span class="token punctuation">,</span> name <span class="token punctuation">:</span> <span class="token single-quoted-string string">'users-id'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
Named Views
To display named views, you can use the <nuxt name="top"/>
or <nuxt-child name="top"/>
in your layout / page. To specify the named view of the page, expand the router configuration in the nuxt.config.js
file:
1 | export <span class="token keyword">default</span> <span class="token punctuation">{</span> router <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token function">extendRoutes</span> <span class="token punctuation">(</span> routes <span class="token punctuation">,</span> resolve <span class="token punctuation">)</span> <span class="token punctuation">{</span> let index <span class="token operator">=</span> routes <span class="token punctuation">.</span> <span class="token function">findIndex</span> <span class="token punctuation">(</span> route <span class="token operator">=</span> <span class="token operator">></span> route <span class="token punctuation">.</span> name <span class="token operator">===</span> <span class="token single-quoted-string string">'main'</span> <span class="token punctuation">)</span> routes <span class="token punctuation">[</span> index <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> routes <span class="token punctuation">[</span> index <span class="token punctuation">]</span> <span class="token punctuation">,</span> components <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token keyword">default</span> <span class="token punctuation">:</span> routes <span class="token punctuation">[</span> index <span class="token punctuation">]</span> <span class="token punctuation">.</span> component <span class="token punctuation">,</span> top <span class="token punctuation">:</span> <span class="token function">resolve</span> <span class="token punctuation">(</span> __dirname <span class="token punctuation">,</span> <span class="token single-quoted-string string">'components/mainTop.vue'</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> chunkNames <span class="token punctuation">:</span> <span class="token punctuation">{</span> top <span class="token punctuation">:</span> <span class="token single-quoted-string string">'components/mainTop'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
It requires expanding the router with 2 components
and chunkNames
.
For a more specific understanding, see the example-view example .
Prevention of SPA
You can also enable redundant SPA for the route. Nuxt.js will output an additional file like index.html
will be used in mode: 'spa'
. Most storage services can be configured to use SPA if no files match. It will not include the information head
or any HTML, but it will still resolve and load data from the API.
You can enable this feature in the nuxt.config.js
file:
1 | export <span class="token keyword">default</span> <span class="token punctuation">{</span> generate <span class="token punctuation">:</span> <span class="token punctuation">{</span> fallback <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> <span class="token comment">// if you want to use '404.html' instead of the default '200.html'</span> fallback <span class="token punctuation">:</span> <span class="token single-quoted-string string">'my-fallback/file.html'</span> <span class="token comment">// if your hosting needs a custom location</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Made for Surge
Surge can handle . both 200.html
and 404.html. generate.fallback
the 200.html` default, so there is no need to change it.
Deploying the GitHub page and Netlify
The GitHub and Netlify pages automatically recognize the 404.html
file, so what we have to do is just set generate.fallback
to true
.
Deploy for Firebase Hosting.
To use backup on Firebase Hosting, you need to configure generate.fallback
to true
and use the following configuration ( for more details ):
1 | <span class="token punctuation">{</span> <span class="token double-quoted-string string">"hosting"</span> <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token double-quoted-string string">"public"</span> <span class="token punctuation">:</span> <span class="token double-quoted-string string">"dist"</span> <span class="token punctuation">,</span> <span class="token double-quoted-string string">"ignore"</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token double-quoted-string string">"firebase.json"</span> <span class="token punctuation">,</span> <span class="token double-quoted-string string">"**/.*"</span> <span class="token punctuation">,</span> <span class="token double-quoted-string string">"**/node_modules/**"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token double-quoted-string string">"rewrites"</span> <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token double-quoted-string string">"source"</span> <span class="token punctuation">:</span> <span class="token double-quoted-string string">"**"</span> <span class="token punctuation">,</span> <span class="token double-quoted-string string">"destination"</span> <span class="token punctuation">:</span> <span class="token double-quoted-string string">"/404.html"</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Forward
Nuxt.js uses the <transition> component to allow creating transitions / animations between your routes.
General settings
To add a fading transition to each page in your application, a shared CSS file is needed on all routes, so start by creating a file in the assets folder.
css is written in assets/main.css
:
1 | <span class="token punctuation">.</span> page <span class="token operator">-</span> enter <span class="token operator">-</span> active <span class="token punctuation">,</span> <span class="token punctuation">.</span> page <span class="token operator">-</span> leave <span class="token operator">-</span> active <span class="token punctuation">{</span> transition <span class="token punctuation">:</span> opacity <span class="token number">.5</span> s <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span> page <span class="token operator">-</span> enter <span class="token punctuation">,</span> <span class="token punctuation">.</span> page <span class="token operator">-</span> leave <span class="token operator">-</span> to <span class="token punctuation">{</span> opacity <span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
After that, we add its path to css
in the nuxt.config.js file:
1 | export <span class="token keyword">default</span> <span class="token punctuation">{</span> css <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'~/assets/main.css'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
Page settings
You can also define custom conversions for a specific page with the transition
attribute.
We add a new class and write css in assets/main.css
:
1 | <span class="token punctuation">.</span> test <span class="token operator">-</span> enter <span class="token operator">-</span> active <span class="token punctuation">,</span> <span class="token punctuation">.</span> test <span class="token operator">-</span> leave <span class="token operator">-</span> active <span class="token punctuation">{</span> transition <span class="token punctuation">:</span> opacity <span class="token number">.5</span> s <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span> test <span class="token operator">-</span> enter <span class="token punctuation">,</span> <span class="token punctuation">.</span> test <span class="token operator">-</span> leave <span class="token operator">-</span> active <span class="token punctuation">{</span> opacity <span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Then we will use the conversion property to determine the class name that will be used for this page conversion process:
1 | export <span class="token keyword">default</span> <span class="token punctuation">{</span> transition <span class="token punctuation">:</span> <span class="token single-quoted-string string">'test'</span> <span class="token punctuation">}</span> |
Middleware
Each Middleware should be placed in the directory middleware/
. The file name will be the name of Middleware ( middleware/auth.js
).
1 | export <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> context <span class="token punctuation">)</span> <span class="token punctuation">{</span> context <span class="token punctuation">.</span> userAgent <span class="token operator">=</span> process <span class="token punctuation">.</span> server <span class="token operator">?</span> context <span class="token punctuation">.</span> req <span class="token punctuation">.</span> headers <span class="token punctuation">[</span> <span class="token single-quoted-string string">'user-agent'</span> <span class="token punctuation">]</span> <span class="token punctuation">:</span> navigator <span class="token punctuation">.</span> userAgent <span class="token punctuation">}</span> |
Middleware will be done in order:
nuxt.config.js
(in order of file)- Matching layouts
- Suitable page
A middleware may be out of sync. To do this, simply return a Promise
or use the second callback
:
middleware/stats.js
1 | import axios from <span class="token single-quoted-string string">'axios'</span> export <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> route <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> axios <span class="token punctuation">.</span> <span class="token function">post</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'http://my-stats-api.com'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> url <span class="token punctuation">:</span> route <span class="token punctuation">.</span> fullPath <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Then, in nuxt.config.js
, use the router.middleware
lock:
nuxt.config.js
1 | export <span class="token keyword">default</span> <span class="token punctuation">{</span> router <span class="token punctuation">:</span> <span class="token punctuation">{</span> middleware <span class="token punctuation">:</span> <span class="token single-quoted-string string">'stats'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
The status
of the middleware will now be called for each route change.
You can also add your middleware to a specific layout or page:
pages/index.vue
or layouts/default.vue
1 | export <span class="token keyword">default</span> <span class="token punctuation">{</span> middleware <span class="token punctuation">:</span> <span class="token single-quoted-string string">'stats'</span> <span class="token punctuation">}</span> |
Below I have introduced you to Nuxt.js as well as basic concepts and examples of Routing in Nuxt.js n. If you have any questions, please leave a comment below.