当前位置:   article > 正文

nuxt.js 简述Vue服务端渲染_vue单页面应用渲染是从服务器获取所需js,在客户端将其解析生成html挂载于 id为app

vue单页面应用渲染是从服务器获取所需js,在客户端将其解析生成html挂载于 id为app

为什么使用nuxt.js?

vue单页面应用渲染是从服务器获取所需js,在客户端将其解析生成html挂载于
id为app的DOM元素上,这样会存在两大问题。

  1. 由于资源请求量大,造成网站首屏加载缓慢,不利于用户体验。
  2. 由于页面内容通过js插入,对于内容性网站来说,搜索引擎无法抓取网站内容,不利于SEO。
    Nuxt.js 是一个基于Vue.js的通用应用框架,预设了利用Vue.js开发服务端渲染的应用所需要的各种配置。可以将html在服务端渲染,合成完整的html文件再输出到浏览器。

除此之外,nuxt与vue还有一些其他方面的区别。

  1. 路由
    nuxt按照 pages 文件夹的目录结构自动生成路由
    vue需在 src/router/index.js 手动配置路由

  2. 入口页面
    nuxt页面入口为 layouts/default.vue
    vue页面入口为 src/App.vue

  1. webpack配置
    nuxt内置webpack,允许根据服务端需求,在 nuxt.config.js 中的build属性自定义构建webpack的配置,覆盖默认配置
    vue关于webpack的配置存放在build文件夹下

下图为关于nuxt的简单概述

 

NUXT.js.png

nuxt是关于服务端渲染的,如若想让组件在客户端渲染,可以使用<no-ssr></no-ssr>将其包裹起来(该标签最多只能包含一个子组件/元素)。
这样在未获取到内容时,页面先采用<div class="no-ssr-placeholder" data-v-2a183b29=""></div>占位,然后将获取到的html覆盖该占位

安装sass

npm i node-sass sass-loader scss-loader --save-dev

vue文件中可直接使用

  1. <style lang="scss" scoped>
  2. </style>

sass文件如需解析,nuxt.config.js中配置css属性

  1. css: [
  2. {
  3. src: '~/assets/style/reset.scss',
  4. lang: 'scss'
  5. }
  6. ],

使用axios并跨域

  1. package.json
    npm install @nuxtjs/proxy
    nuxt 项目默认安装axios, 所以只需安装proxy即可
  1. "dependencies": {
  2. "@nuxtjs/axios": "^5.0.0",
  3. "@nuxtjs/proxy": "^1.2.4",
  4. }
  1. nuxt.config.js
  1. modules: [
  2. '@nuxtjs/axios',
  3. '@nuxtjs/proxy'
  4. ],
  5. proxy: {
  6. '/api': {
  7. target: 'http:www.xxx.com',
  8. changeOrigin: true,
  9. pathRewrite: {
  10. '^/api ': ''
  11. }
  12. }
  13. },
  1. index.vue
  1. import axios from 'axios'
  2. export default {
  3. data () {
  4. return {
  5. page: 0
  6. }
  7. },
  8. async asyncData () {
  9. let data = await axios.get('http://localhost:3000/api/admin/list')
  10. return {
  11. page: data.data.page
  12. }
  13. },
  14. }

注意
采用 import axios from 'axios' 方式引入axios时,接口参数前须加baseURL -> http://localhost:3000
如果采取 axios.get('/api/admin/game') 调用接口返回nuxt服务器错误,如下图

1540541910156.jpg

 

封装axios,解决每个请求前加baseURL
plugins/axios.js

  1. import * as axios from 'axios'
  2. let options = {}
  3. // The server-side needs a full url to works
  4. if (process.server) {
  5. options.baseURL = `http://${process.env.HOST || 'localhost'}:${process.env.PORT || 3000}`
  6. }
  7. export default axios.create(options)

index.vue

  1. import axios from '~/plugins/axios'
  2. axios.get('/api/admin/game')

引入第三方插件(vue-awesome-swiper)

  1. npm install vue-awesome-swiper --save

  2. plugins文件夹下新建awesome-swiper.js

  1. import Vue from 'vue'
  2. import VueAwesomeSwiper from 'vue-awesome-swiper/dist/ssr'
  3. Vue.use(VueAwesomeSwiper)
  1. nuxt.config.js引入css及js
  1. css: [
  2. 'swiper/dist/css/swiper.css',
  3. ],
  4. plugins: [
  5. { src: "~/plugins/awesome-swiper.js", ssr: false },
  6. ],
  1. 页面初始化
  1. <div v-swiper:mySwiper="swiperOption">
  2. <div class="swiper-wrapper">
  3. <div class="swiper-slide" v-for="(banner, index) in banners" :key="index">
  4. <img :src="banner">
  5. </div>
  6. </div>
  7. <div class="swiper-pagination swiper-pagination-bullets"></div>
  8. </div>
  9. export default {
  10. data () {
  11. return {
  12. banners: [
  13. require('~/assets/img/1540892214119.jpg'),
  14. require('~/assets/img/1540892214119.jpg'),
  15. require('~/assets/img/1540892214119.jpg')
  16. ],
  17. swiperOption: {
  18. autoplay: true,
  19. loop: true,
  20. pagination: {
  21. el: '.swiper-pagination',
  22. },
  23. }
  24. }
  25. },
  26. }

引入第三方模块(moment.js)

  1. npm install moment --save
  2. vue页面
  1. import moment from 'moment'
  2. export default {
  3. mounted() {
  4. moment.locale('zh-cn') // moment.js 默认为英文,可通过此方法设置中文
  5. console.log(moment().format('dddd')) // 星期三
  6. },
  7. }

为避免每个页面都引入moment,执行moment.locale('zh-cn'),可将其定义为全局方法

  1. 在plugins文件夹下新建common.js
  1. import Vue from 'vue'
  2. import moment from 'moment'
  3. let common = {
  4. install (Vue) {
  5. Vue.prototype.$op = {
  6. 'moment': (date) => {
  7. let newMoment = new moment(date)
  8. newMoment.locale('zh-cn')
  9. return newMoment
  10. }
  11. }
  12. }
  13. }
  14. Vue.use(common)
  1. nuxt.config.js
  1. plugins: [
  2. { src: '~/plugins/common.js', ssr: false },
  3. ],
  1. vue页面
this.$op.moment().format('dddd')

修改网站icon

icon.png文件存放在static文件夹下,nuxt.config.js中配置head属性

  1. head: {
  2. link: [
  3. { rel: 'icon', type: 'image/png', href: '/icon.png' }
  4. ]
  5. },

关于中间件

中间件存放于middleware文件夹下,按使用场景可分为全局中间件和单页面中间件

  1. //全局使用
  2. module.exports = {
  3. router: {
  4. middleware: '中间件名称'
  5. }
  6. }
  7. //页面单独使用
  8. export default {
  9. middleware: '中间件名称'
  10. }

中间件执行流程顺序:
nuxt.config.js -> 匹配布局 -> 匹配页面

PS.关于查看NUXT 官网插件demo时遇到的问题

屏幕快照 2018-10-26 下午4.58.47.png

按照index.vue通过require('mini-toastr')引入miniToastr,运行程序报错如下

1540544070985.jpg

 

打印miniToastr发现为一Module对象,init挂载在其default属性上

 

1540544125776.jpg

所以修改引入方法为

miniToastr = require('mini-toastr').default

为什么需要require().default

When using ES6 imports (export default HeaderBar), the exported module is of the format {"default" : HeaderBar}. The import statement handles this assignment for you, however, you have to do the require("./mycomponent").default conversion yourself. The HMR interface code cannot use import as it doesn't work inline.

If you want to avoid that, use module.exports instead of export default.

关于如上介绍,测试关于两种模块的导出方法
方式一:export default
新建test.js文件

  1. export default {
  2. test: function () {
  3. console.log('test')
  4. }
  5. }

vue页面导入

  1. let obj = require('~/plugins/con.js').default
  2. obj.test() // 打印‘test
  3. let obj = require('~/plugins/con.js')
  4. obj.default.test() // 打印‘test

此时 require('~/plugins/con.js') 打印为

屏幕快照 2018-10-26 下午5.35.24.png

 

方式二:module.exports

  1. const obj = {
  2. test: function () {
  3. console.log('test')
  4. }
  5. }
  6. module.exports = obj
  1. let obj = require('~/plugins/con.js')
  2. obj.test() // 打印‘test

此时 require('~/plugins/con.js') 打印为



作者:然后呢_
链接:https://www.jianshu.com/p/b0626ba924c9
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/971440
推荐阅读
相关标签
  

闽ICP备14008679号