官网:https://nuxtjs.org/guide
中文:https://zh.nuxtjs.org/guide/installation
Nuxt.js 是一个基于 Vue.js 的通用应用框架。完成 vuejs 项目的服务器端渲染
nuxt.js 就是完成 vuejs 项目的服务器端渲染。主要是为了解决 vuejs 项目不利于SEO的问题。
没有使用 nuxt.js 的时候 vuejs 项目的不能服务器端渲染,使用的是客户端BSR(都是前后端分离,通过api接口获取数据,然后前端渲染,是不利于SEO,因为网页里面的动态添加,对于搜索引擎爬取网站的时候,是看不到内容的,网站很难被搜索引擎收录,网站的流量很小,自然不容易出名)。
建议使用第三方库nuxt.js ---------https://zh.nuxtjs.org/guide
(npx在NPM版本5.2.0默认安装了)
------------------或者用yarn:yarn create nuxt-app <项目名>
选择完以后会自动生成一个项目,大概长下面这样,我们分析一下每个文件的作用
1,首先我们先来练习路由,一共有三种路由方式(我们只需要写路由即可,文件会自动生成路由映射)
基础路由动态路由、路由参数路由嵌套,代码如下**
<template> <div> <!--基本路由:域名:3000/目录/文件--> <h1>hi users-index!我是静态路由</h1> </div> </template>输入网址:http://localhost:3000/users得到结果如下, 这里要注意一下,因为我的文件叫index.vue,所以可以省略不写index,以后其他indx文件也可以不写
然后再建一个_id.vue文件,这里注意:_id表示变量,文件中的id也是根据路由变化的
<template> <div> <h1>hi 我是动态路由(参数路由)</h1> <h2>我是第{{ $route.params.id }}条新闻</h2> </div> </template>输入网址:http://localhost:3000/news得到结果如下, 点击新闻一:
在pages下面建一个goods文件夹,文件夹里面建一个list.vue组件,这里随便定义几条路由
<template> <div> <nuxt-link to="goods/1">商品1</nuxt-link> <nuxt-link to="goods/2">商品2</nuxt-link> <nuxt-link to="goods/3">商品3</nuxt-link> </div> </template>输入网址:http://localhost:3000/goods/list得到结果如下,这个父容器会把子组件中的内容会放到父页中
在pages下面建一个movie文件夹,文件夹里面建一个list.vue组件
<template> <div> <h1>我是猫眼电影的列表</h1> <ul v-for="ele in movieData"> <li>序号:{{ ele.id }}</li> <li>电影名:{{ ele.nm}}</li> <li>图片:<img :src="ele.img.replace('w.h','200.200')" alt=""></li> </ul> </div> </template> <script> import axios from 'axios' export default { name: "list.vue", // 发送网络请求 可以把这个暂且理解为 created 声明周期函数 asyncData:function(context){ // console.log(context.req.url); // 代表请求头信息 // console.log(context.req.method); // 代表请求头信息 // console.log(context.res);// 代表响应头信息 // console.log(process.server);// 可以标识当前运行环境 ssr 为true // 发送网络请求 //这个地址 是猫眼电影的一个接口 // var url='http://m.maoyan.com/ajax/movieOnInfoList?token=' //这里有一个**注意事项(1)** //三目运算符,判断当前的执行环境是服务器端还是浏览器端 var url = process.server ? 'http://m.maoyan.com/ajax/movieOnInfoList?token=' : '/ajax/movieOnInfoList' // 1. nuxt 第一次的请求的时候,是服务器请求 没有跨域 http://m.maoyan.com/ajax/movieOnInfoList?token= // 2. 以后都是前端请求,存在跨域: /ajax/movieOnInfoList ==> '@nuxtjs/proxy'==> http://m.maoyan.com/ajax/movieOnInfoList?token= return axios.get(url).then(response => { console.log(response.data.movieList) if(response.status == 200 ){ console.log(response) return { movieData:response.data.movieList } } }).catch(error=>{ console.log(error) }) } } </script> <style scoped> </style>注意事项(1):第一次请求url路径是,是服务器端进行api请求,获取数据,然后渲染,当渲染后的数据(html代码 js代码)返回给浏览器后,以后的执行环境都是浏览器环境,以后asyncData函数在浏览器端执行,在浏览器端做页面切换时,发送网络请求给猫眼的服务器都是由浏览器发出的 注意事项(2):如果是浏览器渲染,因为同源政策,则会出现跨域问题,而服务器猫眼同源政策问题所以不会有跨域问题 总结注意事项(1),(2):1. nuxt 第一次的请求的时候,是服务器请求,没有跨域问题; --------------------以后都是前端请求,存在跨域
为出现跨域的请求设置代理服务器,以后对于这个跨域的请求,当前的这个代理就会拦截起来,通过这个代理服务器帮我们向跨域的服务器发送网络请求,然后把响应回来的数据进行返回,从而解决跨域问题。 解决: 1下载这个中间件,专门解决跨域问题;
npm i @nuxtjs/proxy2在 nuxt.config.js 配置文件中添加对应的模块,并设置代理;
modules: [ '@nuxtjs/axios', '@nuxtjs/proxy' ], axios: { proxy: true }, proxy: { // 前端如果遇到 /ajax/movieOnInfoList 请求交给 @nuxtjs/proxy(代理服务器) 向 target 服务发送网络请求 '/ajax/movieOnInfoList': { target: 'http://m.maoyan.com/ajax/movieOnInfoList?token=', } },3,放在template中,渲染页面,最后结果:
