为什么使用 Nuxt?
像 Nuxt 这样的框架之所以存在,是因为传统的 SPA 和多页应用程序(MPA)的服务器端渲染存在不足。我们可以将 Nuxt 视为服务器端渲染 MPA 和传统 SPA 的混合体。因此,它被称为 “通用” 或 “同构”。所以,能够进行服务器端渲染是 Nuxt 的决定性特征。在本节中,我们将带你了解 Nuxt 的其他突出特性,这些特性将使你的应用程序开发变得轻松有趣。我们要介绍的第一个特性允许你通过在文件中使用 .vue 扩展名来编写单文件 Vue 组件。
编写单文件组件
我们可以使用几种方法来创建 Vue 组件。全局 Vue 组件通过使用 Vue.component 创建,如下所示:
Vue.component('todo-item', {...})
另一方面,局部 Vue 组件可以使用普通的 JavaScript 对象创建,如下所示:
const TodoItem = {...}
如果你将 Vue 用于小型项目,这两种方法都是可管理和可维护的,但是当你在一个大型项目中同时拥有大量具有不同模板、样式和 JavaScript 方法的组件时,管理起来就会变得困难。
因此,单文件组件应运而生,在单文件组件中,每个 Vue 组件我们只使用一个 .vue 文件。如果你的应用程序需要多个组件,只需将它们分成多个 .vue 文件即可。在每个文件中,你都可以编写仅与该特定组件相关的模板、脚本和样式,如下所示:
// pages/index.vue
<template>
<p>{{ message }}</p>
</template>
<script>
export default {
data () {
return { message: 'Hello World' }
}
}
</script>
<style scoped>
p {
font-size: 2em;
text-align: center;
}
</style>
在这里,你可以看到我们如何在一个 .vue 文件中同时拥有一个 HTML 模板(用于打印来自 JavaScript 脚本的消息)和一个 CSS 样式(用于描述模板的呈现方式)。这使你的代码更结构化、更易读和更有条理。很棒,不是吗?这只有通过 vue-loader 和 webpack 才能实现。在 Nuxt 中,无论它们是 /components/、/pages/ 还是 /layouts/ 目录中的组件,我们都只在 .vue 文件中编写组件。我们将在第二章 “Nuxt 入门” 中更详细地探讨这一点。现在,我们将看看 Nuxt 的另一个特性,它允许你开箱即用地编写 ES6 JavaScript。
编写 ES2015+ 代码
Nuxt 开箱即用地编译你的 ES6+ 代码,你无需担心在 webpack 中配置和安装 Babel。这意味着你可以直接编写 ES6+ 代码,并且你的代码将被编译成可以在旧浏览器上运行的 JavaScript。例如,在使用 asyncData 方法时,你经常会看到以下解构赋值语法:
// pages/about.vue
<script>
export default {
async asyncData ({ params, error }) {
//...
}
}
</script>
前面的代码中使用了析构赋值语法,将 Nuxt 上下文中的属性解包到不同的变量中,我们可以在 asyncData 方法的逻辑中使用这些变量。
有关 Nuxt 上下文和 ECMAScript 2015 功能的更多信息,请分别访问 https://nuxtjs.org/api/context 和 https://babeljs.io/docs/en/learn/ 。
在 Nuxt 中编写 ES6 只有通过 babel-loader 和 webpack 才能实现。你可以在 Nuxt 中编写的不仅仅是析构赋值语法,还包括 async 函数、await 操作符、箭头函数、import 语句等等。那么 CSS 预处理器呢?如果你使用流行的 CSS 预处理器(如 Sass、Less 或 Stylus)编写 CSS 样式,但如果你是 Sass 的拥护者而不是 Less 或 Stylus 的拥护者,Nuxt 是否支持它们中的任何一个?简短的答案是肯定的。我们将在下一节中找到这个问题的详细答案。
使用预处理器编写 CSS
在 Nuxt 中,你可以选择你最喜欢的 CSS 预处理器来编写应用程序的样式,无论是 Sass、Less 还是 Stylus。它们已经在 Nuxt 中为你预先配置好了。你可以在 https://github.com/nuxt/nuxt.js/blob/dev/packages/webpack/src/config/base.js 查看它们的配置。因此,你只需要在你的 Nuxt 项目中安装预处理器及其 webpack 加载器。例如,如果你想使用 Less 作为你的 CSS 预处理器,只需在你的 Nuxt 项目中安装以下依赖项:
$ npm i less --save-dev
$ npm i less-loader --save-dev
然后,你可以通过在 <style> 块中将 lang 属性设置为 "less" 来开始编写你的 Less 代码,如下所示:
// pages/index.vue
<template>
<p>Hello World</p>
</template>
<style scoped lang="less">
@align: center;
p {
text-align: @align;
}
</style>
从这个例子中,你可以看到在 Nuxt 中编写现代 CSS 样式就像编写现代 JavaScript 一样简单。你所需要做的就是安装你最喜欢的 CSS 预处理器及其 webpack 加载器。在本书接下来的章节中,我们将使用 Less,但现在,让我们了解一下 Nuxt 提供的其他功能。
有关这些预处理器及其 webpack 加载器的更多信息,请访问以下链接:
-
http://lesscss.org/ for Less
-
https://webpack.js.org/loaders/less-loader/ for less-loader
-
https://sass-lang.com/ for Sass
-
https://webpack.js.org/loaders/sass-loader/ for sass-loader
-
http://stylus-lang.com/ for Stylus
-
https://github.com/shama/stylus-loader for stylus-loader
|
即使 |
使用模块和插件扩展 Nuxt
Nuxt 基于模块化架构构建。这意味着你可以使用无数的模块和插件来扩展你的应用程序或 Nuxt 社区。这也意味着你可以从 Nuxt 和 Vue 社区选择大量的模块和插件,这样你就不必为你的应用程序重新发明轮子。以下是这些链接:
-
Awesome Nuxt.js: https://github.com/nuxt-community/awesome-nuxt#official (Nuxt 模块)
-
Awesome Vue.js: https://github.com/vuejs/awesome-vue#components—libraries (Vue 组件、库和插件)
模块和插件本质上都是 JavaScript 函数。现在不必担心它们之间的区别;我们将在第六章 “编写插件和模块” 中详细介绍这一点。
添加路由之间的过渡效果
与传统的 Vue 应用程序不同,在 Nuxt 中,你无需使用 <transition> 元素来处理元素或组件上的 JavaScript 动画、CSS 动画和 CSS 过渡。例如,如果你想在导航到特定页面时应用淡入淡出效果,只需将过渡名称(例如,fade)添加到该页面的 transition 属性即可:
// pages/about.vue
<script>
export default {
transition: {
name: 'fade'
}
}
</script>
然后,你只需在 .css 文件中创建过渡样式:
// assets/transitions.css
.fade-enter,
.fade-leave-to {
opacity: 0;
}
.fade-leave,
.fade-enter-to {
opacity: 1;
}
.fade-enter-active,
.fade-leave-active {
transition: opacity 3s;
}
当导航到 /about 路由时,“fade” 过渡将自动应用于 about 页面。很酷,不是吗?如果此时代码或类名看起来有点让人不知所措,请不要担心;我们将在第四章 “添加视图、路由和过渡效果” 中更详细地介绍和探索此过渡功能。
管理 <head> 元素
此外,与传统的 Vue 应用程序不同,你可以开箱即用地管理应用程序的 <head> 块,而无需安装处理它的额外的 Vue 包——vue-meta。你只需通过 head 属性将所需的 <title>、<meta> 和 <link> 数据添加到任何页面。例如,你可以通过应用程序的 Nuxt 配置文件管理全局 <head> 元素:
// nuxt.config.js
export default {
head: {
title: '我的 Nuxt 应用',
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: '我的 Nuxt 应用是关于...' }
],
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
}
}
Nuxt 会将这些数据转换为 HTML 标签。同样,我们将在第四章 “添加视图、路由和过渡效果” 中学习并更详细地探讨此功能。
|
|
使用 webpack 打包和拆分代码
Nuxt 使用 webpack 来打包、压缩并将你的代码分割成多个代码块,这可以加快你的应用加载速度。例如,在一个简单的包含两个页面(首页和关于页)的 Nuxt 应用中,你将获得类似的客户端代码块:
Hash: 0e9b10c17829e996ef30
Version: webpack 4.43.0
Time: 4913ms
Built at: 06/07/2020 21:02:26
(省略)
你将获得的服务器端代码块如下所示:
Hash: 8af8db87175486cd8e06
Version: webpack 4.43.0
Time: 525ms
Built at: 06/07/2020 21:02:27
Assets:
- pages/about.js: 1.23 KiB 1 [emitted] (pages/about)
- pages/index.js: 6.06 KiB 2 [emitted] (pages/index)
- server.js: 80.9 KiB 0 [emitted] (app)
- server.manifest.json: 291 bytes [emitted]
+ 3 hidden assets
Entrypoint app:
- server.js
- server.js.map
当你使用 Nuxt 的 npm run build 命令构建你的应用程序以进行部署时,会生成这些代码块和构建信息。我们将在第十四章 “使用代码检查器、格式化工具和部署命令” 中更详细地介绍这一点。
除此之外,Nuxt 还使用了 webpack 的其他强大功能和插件,例如静态文件和资源服务(资源管理)、热模块替换、CSS 提取(extract-css-chunks-webpack-plugin)、构建和监听过程中的进度条(webpackbar)等等。更多信息请访问以下链接:
-
https://webpack.js.org/concepts/manifest/ (manifest)
-
https://webpack.js.org/concepts/hot-module-replacement/ (热模块替换)
-
https://webpack.js.org/plugins/mini-css-extract-plugin/ (CSS 提取)
-
https://github.com/nuxt/webpackbar (webpackbar,由 Nuxt 核心团队开发的插件)
webpack、Babel 和 Nuxt 本身提供的这些强大功能将使你的现代项目开发变得有趣且轻松。现在,让我们看看各种应用程序类型,以了解在构建下一个 Web 应用程序时,你是否应该使用 Nuxt。