Nuxt.js快速入门

1,337 阅读6分钟

相信大家肯定对SSR,CSR等概念再熟悉不过了。但假如面试的时候面试官问:如果让你去实现一个SSR项目,你该如何去做?你会如何回答?我认为,我们不妨尝试一下Nuxt.js。

什么是Nuxt.js

这里我们看一下Nuxt官方给出的定义

Nuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.

Nuxt.js是一款基于Vue.js的,可以以直观且可拓展的方式创建类型安全,高性能生产级的全栈web应用框架。但是在我看来,通常我们选择采用nuxt.js框架开发的原因无非是以下几点:

  1. SSR
  2. 更好的SEO
  3. 框架基于Vue3,继承了Vue3的所有优势,如:Composition API、性能优化、响应式编程等
  4. 文件系统路由:你可以通过目录结构来组织你的页面路由
  5. ...

可以说,Nuxt.js的优点不胜枚举,接下来,让我们一起走进Nuxt的世界吧!在此之前,让我们先来复习一下SSR、CSR等相关概念

相关概念

考虑到此篇文章面向的是Nuxt初学者或对Nuxt感兴趣,想要了解一下的朋友们。这里简单介绍一下SSR、CSR、SEO、SPA这些基础概念,为后续深入了解打下基础

SEO

SEO(search engine optimization)即搜索引擎优化的一种方式,是利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名,目的是让搜索引擎的爬虫更容易收集到你网站的内容,并把它们编写进自己的索引库中。这样你的目标用户就更容易发现你的产品和你提供的服务,所以,某些项目就会千方百计的去做SEO,以期获得在搜索引擎上更高的排名。

SPA

SPA(single-page application)即单页面应用。

SPA是一种网络应用程序或网站的模型,它通过动态重写当前页面来与用户交互,这种方法避免了页面之间切换打断用户体验 在单页应用中,所有必要的代码(HTML、JavaScript和CSS)都通过单个页面的加载而检索,或者根据需要(通常是为响应用户操作)动态装载适当的资源并添加到页面

页面在任何时间点都不会重新加载,也不会将控制转移到其他页面

举例来说,在你的面前有一个碗,早上装的是油条与豆浆,中午装的是螺蛳粉,晚上装的是兰州牛肉面,但无论什么时候,碗还是那个碗,变化的是碗里的内容

单页面应用优缺点

优点:

  • 对前后端分离开发更友好,项目分工更明确
  • 页面更新快,内容的改变不需要重新加载整个页面,用户体验感更好

缺点:

  • 不利于搜索引擎的抓取
  • 首次渲染速度相对较慢

SSR与CSR

SSR(Server Side Render)即服务端渲染,与之相对的则是CSR(Client Side Rendering)客户端渲染。 SSR为传统的渲染方式,服务端把渲染的完成的页面直接返回给客户端。这样减少了一次客户端到服务端的一次http请求,加快相应速度,一般用于首屏的性能优化。而CSR依赖的是运行在客户端的JS,用户首次发送请求只能得到小部分的指引性HTML代码。第二次请求将会请求更多包含HTML字符串的JS文件。

简而言之,就是数据拼接HTML字符串这件事放在服务端还是客户端造成了两者区别。

Nuxt的安装与使用

这里使用官网提供的方法来安装

  • 由于Nuxt.js的服务端是基于node.js的,推荐安装16版本以上的node.js
  • 推荐使用VScode
  • 终端 为了运行Nuxt命令 方便起见,可以使用VScode的内置终端

59f5c37afe9fab41eed56d1f2e7c200.png

这里使用pnpm来安装 在终端输入pnpm dlx nuxi@latest init 项目名

例如我输入的是dlx nuxi@latest init mynuxt

bfb9a7e82c325336547e3c7384e18d3.png 等待安装 便可看到项目结构了

3d4335b6a97e5534fc221e6ab0528d6.png

运行你的第一个Nuxt项目

根据提示,在终端输入cd mynuxt将目录切换到mynuxt下,接着执行npm install安装依赖,最后执行npm run dev运行项目,当出现如下界面时,恭喜!你的Nuxt项目已经运行成功了!

68e80c1b1b82295ad4570763d81cab2.png 接下来让我们体验一下Nuxt中的响应式编程

响应式

将app.vue文件代码稍作修改

<template>
  <div>
    <h1>My name is {{ nick }}</h1>
    <input type="text" v-model="nick">
  </div>
</template>
<script setup>
const nick = ref('jack')
</script>

video-2023-07-23-211402.gif

可以看到,数据发生变化的同时,依赖该数据的dom也发生了更新,说明数据是响应式的

组件

接下来介绍一下如何使用组件,在项目根目录下创建一个名为components的文件夹,由于nuxt的组件是根据目录结构组织的,所以我们放在components文件夹下的组件会被自动引入注册,无需手动操作

在这里创建一个名叫test.vue的文件作为我们的组件

247b4d4c48269b44b0b2916c668cf37.png

test.vue

<template>
    <div>
        <h1>
            这是我的小猫,它叫<slot>xxx</slot>
        </h1>
    </div>
</template>

app.vue

<template>
  <div>
    <h1>My name is {{ nick }}</h1>
    <input type="text" v-model="nick">
    <test>糯米</test>
  </div>
</template>
<script setup>
const nick = ref('jack')
</script>

可以看到,组件已经被成功挂载到了页面上

3468a5353151cb70815cd976ec2f964.png

路由

由于在Nuxt中路由也是基于目录结构的,使用方式和组件的使用方式大同小异,这里就简单介绍一下。首先在项目根路径下创建一个pages文件夹,新建一个about.vue文件作为我们的一个页面,需要注意的是,创建/pages目录开启路由后,/app.vue会影响路由与页面,最好将它删除,然后在/pages下建立新主页/pages/index.vue,此时如果项目报错的话,只需要重新启动下服务就OK了

216fc8fe27a87d9688f5c838ad936a7.png

about.vue

<template>
    <div>
        <h1>欢迎来到about页面</h1>
        <nuxtLink to="/">go home</nuxtLink>
    </div>
</template>

index.vue

<template>
    <div>
        <h1>这是我的主页</h1>
        <nuxtLink to="/about">go about</nuxtLink>
    </div>
</template>

运行结果

video-2023-07-23-214523.gif

服务端

要建立服务端接口,首先在/server/api路径下创建一个myapi.js文件,当然,如果你对TypeScript比较熟悉的话,也可以使用ts

0fbdc9b2c5723942143950675946774.png

实现一个简单api

myapi.js

export default defineEventHandler((event) => {
    return {
        status: 1,
        msg: 'success'
    }
})

在地址栏中输入/api/myapi,以/api开头是为了表明传入的是api的地址,按下回车可以看到数据被成功返回了

6e9e83913e7bfd6ad13d980fca87272.png

这时的你可能会发出疑问,如果我们想传参该怎么办呢? 比如这样http://localhost:3000/api/myapi?id=1很简单,我们只需要getQuery()方法

export default defineEventHandler((event) => {

    const query = getQuery(event)
    return {
        status: 1,
        msg: 'success',
        data: { id: query.id }
    }
})

此时在地址栏中输入http://localhost:3000/api/myapi?id=9527查看效果

1b98d382bf1dd04da3f06f29d2df613.png

可以看到,query参数传递成功了

小结

此篇文章是我来到掘金这个大家庭以来发布的第一篇文章,面向Nuxt.js初学者以及对Nuxt.js感兴趣的同学们,起到入门启发之作用,故技术难度不高,技术深度不深,由于本人经验所限,文章难免有不足之处,欢迎各位同学积极留言指出,也可与我讨论有关技术问题,我们下篇文章见