服务器端渲染(Server-Side Rendering):Vue.js是构建客户端应用程序的框架。默认情况下,可以在浏览器中输出Vue组件,进行生成DOM和操作DOM。然而,也可以将同一个组件渲染为服务器端的HTML字符串,将它们直接发送到浏览器,最后将静态标记”混合”为客户端上完全交互的应用程序。
服务器渲染的Vue.js应用程序也可以被认为是”同构”或”通用”,因为应用程序的大部分代码都可以在服务器和客户端上运行。
传统打包
Vue项目
打包后,组件都是JS在html
文件返回后再渲染到<div id=app></div>
里的。这就合理的解释了SEO
缺陷的原因。
安装流程
新手模板
初始化项目
1 | $ vue init nuxt-community/starter-template <project-name> |
注:如果vue-cli没有安装, 需先通过npm install -g vue-cli
来安装。
安装依赖包
1 | $ cd <project-name> |
启动项目
1 | $ npm run dev |
注意:
- 应用现在运行在 http://localhost:3000
- Nuxt.js 会监听 pages 目录中的文件变更并自动重启, 当添加新页面时没有必要手工重启应用。
- 运行端口占用,如何切换端口
模板结构
1 | . |
工作原理
使用方法
绝对路径
绝对路径 | 路径 |
---|---|
~ | / |
~api | /api |
~assets | /assets |
~components | /components |
~layouts | /layouts |
~middleware | /middleware |
~pages | /pages |
~plugins | /plugins |
~static | /static |
~store | /store |
路由
Nuxt.js 根据 pages 目录结构去生成 vue-router 配置,也就是说 pages 目录的结构直接影响路由结构
1 | |-- pages |
动态路由
1 | pages/ |
错误页面
默认访问:layouts/error.vue
error => ~/layouts/error.vue
1 | <template> |
statusCode | Name |
---|---|
404 | 页面不存在 |
引入静态资源
以flexible为例
1 | script: [ |
页面方法
asyncData 异步获取数据
Nuxt.js 扩展了 Vue.js,增加了一个叫 asyncData 的方法,使得我们可以在设置组件的数据之前能异步获取或处理数据。
1 | export default { |
返回 Promise
1 | export default { |
使用 async或await
1 | export default { |
asyncData方法:会在组件(限于页面组件)
每次加载之前被调用。它可以在服务端或路由更新之前被调用。在这个方法被调用的时候,第一个参数被设定为当前页面的上下文对象,你可以利用 asyncData方法来获取数据并返回给当前组件。
属性字段 | 类型 | 可用 | 描述 |
---|---|---|---|
isClient | Boolean | 客户端 & 服务端 | 是否来自客户端渲染 |
isServer | Boolean | 客户端 & 服务端 | 是否来自服务端渲染 |
isDev | Boolean | 客户端 & 服务端 | 是否是开发(dev) 模式,在生产环境的数据缓存中用到 |
route | vue-router 路由 | 客户端 & 服务端 | vue-router 路由实例。 |
store | vuex 数据流 | 客户端 & 服务端 | Vuex.Store 实例。只有vuex 数据流存在相关配置时可用。 |
env | Object | 客户端 & 服务端 | nuxt.config.js 中配置的环境变量, 见 环境变量 api |
params | Object | 客户端 & 服务端 | route.params 的别名 |
query | Object | 客户端 & 服务端 | route.query 的别名 |
req | http.Request | 服务端 | Node.js API 的 Request 对象。如果 nuxt 以中间件形式使用的话,这个对象就根据你所使用的框架而定。nuxt generate 不可用。 |
res | http.Response | 服务端 | Node.js API 的 Response 对象。如果 nuxt 以中间件形式使用的话,这个对象就根据你所使用的框架而定。nuxt generate 不可用。 |
redirect | Function | 客户端 & 服务端 | 用这个方法重定向用户请求到另一个路由。状态码在服务端被使用,默认 302。redirect([status,] path [, query]) |
error | Function | 客户端 & 服务端 | 用这个方法展示错误页:error(params)。params 参数应该包含 statusCode 和 message 字段。 |
错误处理
error
Nuxt.js 在上下文对象context中提供了一个 error(params) 方法,你可以通过调用该方法来显示错误信息页面。params.statusCode 可用于指定服务端返回的请求状态码。
1 | export default { |
callback
1 | export default { |
fetch
fetch 方法用于在渲染页面前填充应用的状态树(store)数据, 与 asyncData 方法类似,不同的是它不会设置组件的数据。
1 | fetch ({ store, params }) { |
你也可以使用 async 或 await 的模式简化代码如下
1 | async fetch ({ store, params }) { |
head
Nuxt.js 使用了 vue-meta 更新应用的 头部标签(Head) 和 html 属性。
1 | head () { |
注意:为了避免子组件中的meta标签不能正确覆盖父组件中相同的标签而产生重复的现象,建议利用 hid 键为meta标签配一个唯一的标识编号。
layout
根目录下的所有文件都属于个性化布局文件,可以在页面组件中利用 layout 属性来引用。
1 | export default { |
middleware
在应用中的特定页面设置中间件,在服务器中返回。
1 | export default { |
scrollToTop
1 | <template> |
transition
1 | export default { |
validate
Nuxt.js 可以让你在动态路由对应的页面组件中配置一个校验方法用于校验动态路由参数的有效性。
1 | validate({ params, query }) { |
配置文件
目录下的 nuxt.config.js 是我们唯一的配置入口,默认的给力我们三个配置 ·head·css·loading· 分别是头部设置,全局css,loading进度条
属性 | 名称 |
---|---|
build | 模块管理 |
cache | 组件缓存 |
css | 全局样式 |
dev | 开发配置 |
env | 环境配置 |
generate | 静态配置 |
head | 全局头部配置 |
loading | 加载配置 |
plugins | 插件配置 |
rootDir | 配置 |
router | 路由配置 |
srcDir | 配置 |
transition | 动画配置 |
build
Nuxt.js 允许你在自动生成的 vendor.bundle.j 文件中添加一些模块,以减少应用 bundle的体积。如果你的应用依赖第三方模块,这个配置项是十分实用的。
analyze
Nuxt.js 使用 webpack-bundle-analyzer 分析并可视化构建后的打包文件,你可以基于分析结果来决定如何优化它。
1 | 默认值: false |
提示: 可通过 nuxt build –analyze 或 nuxt build -a 命令来启用该分析器进行编译构建,分析结果可在 http://localhost:8888 上查看。
babel
为 JS 和 Vue 文件设定自定义的 babel 配置。
1 | 默认值: |
1 | module.exports = { |
extend
为客户端和服务端的构建配置进行手工的扩展处理。
该扩展方法会被调用两次,一次在服务端打包构建的时候,另外一次是在客户端打包构建的时候。该方法的参数如下:
Webpack 配置对象
构建环境对象,包括这些属性(全部为布尔类型): isDev, isClient, isServer
1 | module.exports = { |
如果你想了解更多关于webpack的配置,可以移步 Nuxt.js 源码的 webpack 目录。
filenames 自定义打包文件名
1 | 默认值: |
loaders 加载器
自定义 webpack 加载器
1 | 默认值: |
1 | module.exports = { |
当 nuxt.config.js 里有自定义的 loaders 配置时,将会覆盖默认的配置。
plugins 插件
1 | const webpack = require('webpack') |
postcss
1 | 默认值: |
1 | module.exports = { |
publicPath CDN地址
Nuxt.js 允许你将待发布的文件直接上传至 CDN 以获得最佳访问性能,只需设置 publicPath 为你的 CDN 地址即可。
1 | 默认值: '/_nuxt/' |
通过以上配置,当运行 nuxt build 时,再将.nuxt/dist/目录的内容上传到您的CDN,然后瞧!
vendor 第三方模块
Nuxt.js 允许你在自动生成的 vendor.bundle.js 文件中添加一些模块,以减少应用 bundle 的体积。这里说的是一些你所依赖的第三方模块 (比如 axios)
1 | module.exports = { |
1 | module.exports = { |
cache 组件缓存
该配置项让你开启组件缓存策略以提升渲染性能。
如 cache 设定的值为 true,那么相当于应用了下面的默认配置:
1 | module.exports = { |
属性名 | 是否可选? | 类型 | 默认值 | 描述 |
---|---|---|---|---|
max | 是 | 整型 | 1000 | 缓存组件的最大数目,当第 1001 个组件被添加至缓存中时, 第一个被缓存的组件会从缓存中移除。 |
maxAge | 是 | 整型 | 900000 | 缓存时间,单位毫秒, 默认是 15 分钟。 |
css
该配置项用于定义应用的全局(所有页面均需引用的)样式文件、模块或第三方库。
- src: String (文件路径)
- lang: String (所需的预处理器)
1 | module.exports = { |
dev
dev 属性的值会被 nuxt 命令 覆盖
- 当使用 nuxt 命令时,dev 会被强制设置成 true
- 当使用 nuxt build, nuxt start 或 nuxt generate 命令时,dev 会被强制设置成 false
1 | module.exports = { |
env
Nuxt.js 让你可以配置在客户端和服务端共享的环境变量。
1 | module.exports = { |
我们可以通过以下两种方式来使用 baseUrl 变量:
- 通过 process.env.baseUrl
- 通过 context.baseUrl,请参考 context api
举个例子, 我们可以利用它来配置 axios 的自定义实例。
1 | plugins/axios.js |
generate
配置 Nuxt.js 应用生成静态站点的具体方式。
1 | ``` |
loading
在页面切换的时候,Nuxt.js 使用内置的加载组件显示加载进度条。你可以定制它的样式,禁用或者创建自己的加载组件。
禁用加载进度条
1 | module.exports = { |
个性化加载进度条
键 | 类型 | 默认值 | 描述 |
---|---|---|---|
color | String | ‘black’ | 进度条的颜色 |
failedColor | String | ‘red’ | 页面加载失败时的颜色 (当 data 或 fetch 方法返回错误时)。 |
height | String | ‘2px’ | 进度条的高度 (在进度条元素的 style 属性上体现)。 |
duration | Number | 5000 | 进度条的最大显示时长,单位毫秒。Nuxt.js 假设页面在该时长内加载完毕。 |
1 | module.exports = { |
自定义加载组件
方法 | 是否必须 | 描述 |
---|---|---|
start() | 是 | 路由更新(即浏览器地址变化)时调用, 请在该方法内显示组件。 |
finish() | 是 | 路由更新完毕(即asyncData方法调用完成且页面加载完)时调用,请在该方法内隐藏组件。 |
fail() | 否 | 路由更新失败时调用(如asyncData方法返回异常)。 |
increase(num) | 否 | 页面加载过程中调用, num 是小于 100 的整数。 |
1 | module.exports = { |
1 | components/loading.vue |
plugins
该配置项用于配置那些需要在 根vue.js应用 实例化之前需要运行的 Javascript 插件。
1 | plugins: [ |
- src: String (文件的路径)
- ssr: Boolean (默认为 true) 如果值为 false,该文件只会在客户端被打包引入。有些插件可能只是在浏览器里使用,所以你可以用 ssr: false 变量来配置插件只从客户端还是服务端运行。
- 常见的问题:window对象没有,无法使用。请将插件放入SSR:false的页面。
rootDir
1 | 该配置项用于配置 Nuxt.js 应用的根目录。 |
关于 rootDir 配置项的详细文档
router
base
应用的根URL。举个例子,如果整个单页面应用的所有资源可以通过 /app/ 来访问,那么 base 配置项的值需要设置为 ‘/app/‘。
1 | 默认值: '/' |
base 被设置后,Nuxt.js 会自动将它添加至页面中:
mode
默认值:’history’,配置路由的模式,鉴于服务端渲染的特性,不建议修改该配置。该配置项的值会被直接传给 vue-router 的构造器。
1 | module.exports = { |
linkActiveClass
默认值: ‘nuxt-link-active’,全局配置
1 | module.exports = { |
scrollBehavior
scrollBehavior 配置项用于个性化配置跳转至目标页面后的页面滚动位置。每次页面渲染后都会调用 scrollBehavior 配置的方法。该配置项的值会被直接传给 vue-router 的构造器。
scrollBehavior 的默认配置为:
1 | const scrollBehavior = (to, from, savedPosition) => { |
举个例子,我们可以配置所有页面渲染后滚动至顶部:
1 | module.exports = { |
middleware
为应用的每个页面设置默认的中间件。
1 | module.exports = { |
了解更多关于中间件的信息,请参考 中间件指引文档。
extendRoutes
你可以通过 extendRoutes 配置项来扩展 Nuxt.js 生成的路由配置。
1 | const resolve = require('path').resolve |
srcDir
1 | 该配置项用于配置应用的源码目录路径。 |
关于 srcDir 配置项的详细文档
transition
该配置项用于个性化配置应用过渡效果属性的默认值。
1 | 默认值: |
1 | module.exports = { |
属性字段 | 类型 | 默认值 | 描述 |
---|---|---|---|
name | String | “page” | 所有路由过渡都会用到的过渡名称。 |
mode | String | “out-in” | 所有路由都用到的过渡模式,见 Vue.js transition 使用文档。 |
css | Boolean | true | 是否给页面组件根元素添加 CSS 过渡类名。如果值为 false,路由过渡时将触发页面组件事件注册的 Javascript 钩子方法。 |
type | String | n/a | 指定过滤动效事件的类型,用于判断过渡结束的时间点。值可以是 “transition” 或 “animation”。 默认情况下, Nuxt.js 会自动侦测动效事件的类型。 |
enterClass | String | n/a | 目标路由动效开始时的类名。 详情请参考 Vue.js transition 使用文档 。 |
enterToClass | String | n/a | 目标路由动效结束时的类名。 详情请参考 Vue.js transition 使用文档 。 |
enterActiveClass | String | n/a | 目标路由过渡过程中的类名。详情请参考 Vue.js transition 使用文档 。 |
leaveClass | String | n/a | 当前路由动效开始时的类名。 详情请参考 Vue.js transition 使用文档 。 |
leaveToClass | String | n/a | 当前路由动效结束时的类名。 详情请参考 Vue.js transition 使用文档 。 |
leaveActiveClass | String | n/a | 当前路由动效过程中的类名。详情请参考 Vue.js transition 使用文档 。 |
安装插件
SAAS
1 | npm install --save-dev node-sass sass-loader |
LESS
1 | npm install --save-dev less less-loader |
Axios API
1 | ``` |
代理服务,代理不同的变量到不同的接口
1 | modules: [ |
通过设置自定义PATH_TYPE环境变量
1 | env: { |
运行方式
1 | "devTest": "cross-env PATH_TYPE=release nuxt", |
nuxt1.0
无法获取process.env.NODE_ENV的值
常见问题
生命周期
Vux初始化时间不会变革
案例
Nuxt 案例
V2ex clone built with Nuxt.js
文章发布系统
A Nuxtjs Website using Storyblok
vuejs, nuxtjs 搭建 新闻聚合网站