【nuxt】nuxt.js攻略
nuxt.js攻略
一、什么是nuxt.js
Nuxt.js 是一个基于 Vue.js 的开源框架,用于构建高性能、可扩展的单页面应用(SPA)和服务端渲染应用(SSR)。它提供了一组强大的功能,简化了 Vue.js 应用程序的开发过程,并且具有优化性能、SEO 友好、易于维护等特点。
二、nuxt.js特性
服务端渲染 (SSR)
Nuxt.js 支持服务端渲染,将 Vue.js 应用程序渲染为 HTML,使得页面在首次加载时具有更快的加载速度,并且对于搜索引擎爬虫更加友好。
一键式应用部署
Nuxt.js 提供了简单的命令来构建应用程序,并自动优化应用程序的文件结构和路由配置,使得应用程序在部署到服务器时变得更加简单。
自动生成路由
Nuxt.js 支持根据项目目录结构自动生成路由配置,无需手动配置路由,这使得项目的组织更加清晰,并且减少了开发人员的工作量。
内置的静态文件服务器
Nuxt.js 内置了静态文件服务器,可以方便地部署静态资源,并提供服务端渲染和预渲染的能力,同时支持自定义路由和页面。
插件系统
Nuxt.js 提供了丰富的插件系统,可以通过插件来扩展和定制应用程序的功能,例如添加第三方库、增强构建过程等。
自动代码拆分
Nuxt.js 支持自动将代码拆分为更小的块,根据页面的需求动态加载,从而提高应用程序的加载速度和性能。
支持 Vue 生态系统
作为 Vue.js 的扩展,Nuxt.js 支持 Vue 生态系统的各种功能和工具,例如 Vuex 状态管理、Vue Router 路由管理等。
集成了各种优化工具
Nuxt.js 集成了各种优化工具,例如代码压缩、自动预加载、优化图片等,可以帮助开发人员提高应用程序的性能。
三、目录结构
├── assets # 用于存放静态资源文件,如图片、样式表、字体等
├── components # 存放可重用的 Vue 组件
├── layouts # 存放布局组件,用于定义页面的整体布局结构
├── middleware # 存放中间件,用于在路由跳转或页面渲染之前执行一些逻辑
├── pages # 存放页面组件,用于生成应用程序的路由,每个文件对应一个路由
├── plugins # 存放插件,用于扩展应用程序的功能
├── static # 用于存放静态文件,这些文件会被直接复制到生成的静态站点中
├── store # 存放 Vuex 状态管理相关的代码,包括模块化的 Vuex store
├── .editorconfig # 用于配置编辑器的规范
├── .eslintrc.js # ESLint 配置文件,用于代码规范检查
├── .gitignore # Git 忽略文件配置
├── nuxt.config.js # Nuxt.js 项目的配置文件,用于配置构建过程中的各种选项
└── package.json # 项目的 package.json 文件,包含项目的依赖和配置信息
四、功能介绍
nuxt.config.js
1 |
|
布局、页面、组件
页面组件(Page Components)
页面组件是 Nuxt.js 应用程序中的顶级组件,用于表示页面的不同部分或整个页面。它们通常存放在 pages 目录中,并且每个页面组件对应着一个路由。
asyncData: 用于在组件初始化前异步获取数据。这个方法在服务端渲染期间和客户端路由跳转之前均会被调用。
fetch: 用于在组件加载前异步获取数据。和asyncData不同的是,fetch方法不会设置组件的数据,而是通过store进行。
head: 用于配置页面的头部标签,如title、meta等。可以是一个对象或函数。
layout: 指定页面的布局组件,用于包裹页面内容。可以是字符串,也可以是一个函数,返回布局组件的名称。
middleware: 指定页面所需的中间件。中间件可以在页面渲染之前执行一些操作,比如权限验证等。
transition: 配置页面切换动画,可以是字符串或对象。常见的动画包括fade、slide等。
scrollToTop: 指定页面切换时是否滚动到页面顶部,默认为false。
validate: 用于校验动态路由参数,返回false时会显示404页面。
watchQuery: 监听路由参数的变化,并做出相应的响应。可以是一个数组或对象。
transitionMode: 指定页面切换模式,有in-out、out-in和in-out-reverse三种模式。
fetchOnServer: 指定是否在服务端获取数据,仅在服务端渲染时有效。
key: 用于唯一标识页面组件,通常用于缓存页面组件。
components: 定义局部组件,仅在当前页面中可用。
computed: 计算属性,用于派生出一些需要动态计算的数据。
methods: 定义页面组件中的方法,用于处理一些交互逻辑。
middleware: 定义页面组件所需的中间件,用于在页面渲染前执行一些操作,如权限验证等。
布局组件(Layout Components)
布局组件用于定义应用程序的整体布局结构,例如头部、底部和侧边栏等。Nuxt.js 中的布局组件存放在 layouts 目录中。
- 普通组件(Regular Components)
普通组件是应用程序中的其他可重用组件,用于封装 UI 元素和功能。它们通常存放在 components 目录中。
plugins配置
plugins 配置用于引入并注册插件,插件可以用于扩展和定制应用程序的功能。以下是关于 plugins 配置的详细说明:
配置格式:
plugins 配置是一个数组,每个元素可以是字符串路径,也可以是对象。如果是字符串路径,它将会被解析为插件的路径;如果是对象,可以包含 src 属性指定插件的路径,以及 ssr 属性指定是否在服务端渲染期间加载该插件。插件位置:
插件文件通常存放在项目的 plugins 目录下,可以根据实际需要将插件文件放置在不同的子目录中。插件的作用:
插件可以用于在应用程序初始化期间执行一些逻辑,例如注册全局组件、添加 Vue 原型方法、初始化第三方库等。在插件中可以访问到 Vue 实例、Nuxt 上下文对象以及其它一些特定的对象和方法。服务端渲染与客户端渲染:
如果插件需要在服务端渲染期间执行一些逻辑,可以将 ssr 属性设置为 true,这样插件将会在服务端渲染期间加载和执行;如果只需要在客户端渲染期间执行逻辑,则可以省略 ssr 属性或将其设置为 false。插件的执行顺序:
插件会在 Nuxt.js 应用程序初始化的不同阶段执行,执行顺序是按照数组中的顺序依次执行的。通常情况下,插件会在 Vue 实例创建之前执行,这样插件中的逻辑可以在 Vue 实例创建之前被执行。插件的返回值:
如果插件返回一个函数,则该函数会被作为插件的 install 方法,在应用程序初始化时被调用。该函数可以接收 Vue 实例作为参数,并在该实例上注册全局组件、方法等。
自定义插件
1 |
|
1 |
|
在这个示例中,myPlugin.js 文件定义了一个自定义插件,其中通过 export default 导出了一个函数,该函数接收两个参数 context 和 inject。在函数中,我们可以执行一些自定义的逻辑,例如添加全局方法或注入实用的库。
modules配置
modules 配置用于添加各种功能和特性,可以通过引入第三方模块或自定义模块来扩展应用程序的功能。以下是关于 modules 配置的详细介绍:
配置格式:
modules 配置是一个数组,每个元素可以是字符串或对象。如果是字符串,则表示引入的第三方模块的名称;如果是对象,则可以包含 name 属性指定模块的名称,以及其它特定模块所需的选项。第三方模块:
Nuxt.js 提供了大量的第三方模块,可以用于添加各种功能和特性。例如,@nuxtjs/axios 模块用于添加 Axios 库的支持,@nuxtjs/auth 模块用于添加认证和授权功能等。自定义模块:
除了引入第三方模块,你还可以编写自定义模块来扩展和定制应用程序的功能。自定义模块通常以 JavaScript 模块的形式存在,然后在 modules 配置中引入和注册这些模块。模块的作用:
模块可以用于添加路由中间件、配置 Axios、注册全局组件、设置 Vuex Store 等。每个模块可以提供一些特定的功能和选项,通过配置 modules 可以将这些功能集成到 Nuxt.js 应用程序中。模块的执行顺序:
模块会在 Nuxt.js 应用程序初始化的不同阶段被加载和执行。通常情况下,模块会在应用程序初始化之前加载,这样模块中的逻辑可以在应用程序初始化时被执行。模块的选项:
模块可以提供一些特定的选项,用于配置模块的行为和参数。这些选项可以在模块配置对象中指定,并根据需要进行定制。
自定义模块
1 |
|
1 |
|
在这个示例中,myModule.js 文件定义了一个自定义模块,其中导出了一个函数。在函数内部,我们可以执行一些自定义的逻辑,例如合并选项、注册插件等。这里通过 this.addPlugin() 方法注册了一个插件,可以在模块中注册插件或执行其它操作。
router配置
router 配置用于配置 Vue Router 的选项,包括路由的行为、参数和中间件等。以下是关于 router 配置的详细介绍
middleware 中间件:
- middleware 配置用于指定应用程序的全局中间件,这些中间件会在每个路由跳转之前被调用。
- 中间件可以用于实现认证、路由守卫、页面加载进度条等功能,也可以是自定义逻辑或插件。
base 应用的基础路径:
- base 配置用于指定应用的基础路径,用于处理应用程序的根目录和路由的对应关系。
- 默认情况下,base 被设置为应用程序的根目录,如果应用程序部署在子目录下,则需要手动设置 base。
extendRoutes 扩展路由配置:
- extendRoutes 配置用于扩展或修改生成的路由配置,可以对路由进行动态配置或修改。
- 在 extendRoutes 中可以添加新的路由、修改现有路由的参数等。
linkActiveClass 激活链接的 CSS 类名:
- linkActiveClass 配置用于指定激活链接的 CSS 类名,默认为 ‘nuxt-link-active’。
- 当链接对应的路由处于激活状态时,该 CSS 类名会被添加到链接上,用于指示当前页面的链接。
linkExactActiveClass 精确激活链接的 CSS 类名:
- linkExactActiveClass 配置用于指定精确激活链接的 CSS 类名,默认为 ‘nuxt-link-exact-active’。
- 当链接对应的路由处于精确激活状态时,该 CSS 类名会被添加到链接上,用于指示当前精确匹配的页面的链接。
scrollBehavior 页面滚动行为:
- scrollBehavior 配置用于配置页面滚动行为,可以设置页面切换时的滚动位置、滚动动画等。
- 可以返回一个对象或一个 Promise 对象,用于设置滚动行为的参数。
五、常见问题
asyncData 和 fetch 的区别
调用时机:
asyncData: 在组件初始化之前被调用,可以用来获取组件初始化所需的数据。在服务端渲染期间和客户端路由跳转之前都会被调用。
fetch: 在组件加载之前被调用,用于在客户端渲染期间获取数据。在服务端渲染期间不会被调用。
数据处理:
asyncData: 在服务端渲染时会将获取到的数据直接注入到组件的数据中,因此数据可以直接在模板中使用。
fetch: 不会直接将获取到的数据注入到组件中,而是通过 Vuex 的状态管理来管理数据,因此需要手动在组件中处理获取到的数据。
返回值:
asyncData: 必须返回一个对象,该对象中的属性会被合并到组件的数据中。
fetch: 可以返回 Promise 或使用 async/await,但不会将返回的数据直接注入到组件中,而是通过 Vuex 管理。
数据获取方式:
- asyncData: 适合获取与路由参数相关的数据,可以在函数参数中接收到 params、query 等路由相关信息。
- fetch: 适合获取与组件无关的数据,例如在页面渲染之前需要在 Vuex 中获取一些全局数据。
用法:
- asyncData 使用示例:
1
2
3
4async asyncData({ params }) {
const data = await fetchData(params.id);
return { data };
}- fetch 使用示例:
1
2
3async fetch() {
this.data = await fetchData();
}
static 和 assets 目录的区别
assets 目录:
- assets 目录用于存放项目中需要经过 Webpack 处理的静态资源文件,例如图片、样式表、字体等。
- 资源文件放置在 assets 目录下会被 Nuxt.js 构建系统处理,并根据需要进行优化和压缩,然后被打包到最终的应用程序中。
- 通过使用相对路径,可以在 Vue 组件或页面中引用 assets 目录下的资源文件,例如:
<img src="~/assets/logo.png">
。
static 目录:
- static 目录用于存放不需要经过 Webpack 处理的静态资源文件,这些文件会直接被复制到生成的静态站点或者应用程序的根目录中。
- 与 assets 目录不同,static 目录下的资源文件不会被 Nuxt.js 构建系统处理或优化,它们会被原封不动地复制到输出目录中。
- 通常,static 目录适用于存放一些不需要经过预处理或优化的静态文件,例如 favicon.ico、robots.txt 等。
modules 和 plugins 的区别
Modules(模块):
- Modules 是用于在构建期间扩展 Nuxt.js 应用程序的功能的机制。
- Modules 可以用来添加各种功能,如路由、HTTP 客户端、Vuex 状态管理等。这些功能可以在整个应用程序中使用。
- Modules 是在 Nuxt.js 应用程序启动时立即加载和执行的。
Plugins(插件):
- Plugins 是用于在应用程序运行时修改或扩展 Vue.js 的功能的机制。
- Plugins 可以用来添加全局函数、过滤器、指令等,并在应用程序初始化期间运行。这些功能可以在任何 Vue 组件中使用。
- Plugins 是在 Vue.js 实例创建之前执行的,但在应用程序启动之后。