详解Vue SSR服务端渲染使用Nuxt框架初始化Vue SSR项目,5分钟带你了解SSR服务端渲染以及Nuxt框架配置 -璇泰初网络
稀土掘金 稀土掘金
俄小发
1,758 阅读4分钟

Vue SSR介绍

SSR Github Demo

什么是服务器端渲染?

Vue.js 是构建客户端应用程序的框架。默认情况下,可以在浏览器中输出 Vue 组件,进行生成 DOM 和操作 DOM。然而,也可以将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序。

为什么使用服务器端渲染 (SSR)?

与传统 SPA (单页应用程序 (Single-Page Application)) 相比,服务器端渲染 (SSR) 的优势主要在于:

更好的 SEO,由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面。 更快的内容到达时间 (time-to-content),特别是对于缓慢的网络情况或运行缓慢的设备。无需等待所有的 JavaScript 都完成下载并执行,才显示服务器渲染的标记,所以你的用户将会更快速地看到完整渲染的页面。

SSR渲染过程

image.png 我们可以看到,左侧Source部分就是我们所编写的源代码,所有代码有一个公共入口,就是app.js,紧接着就是服务端的入口 (entry-server.js)和客户端的入口(entry-client.js)。当完成所有源代码的编写之后,我们通过webpack的构建,打包出两个bundle,分别是server bundle和client bundle;当用户进行页面访问的时候,先是经过服务端的入口,将vue组建组装为html字符串,并混入客户端所访问的html模板中,最终就完成了整个ssr渲染的过程。

Nuxt框架

Nuxt 是一个基于 Vue 生态的更高层的框架,为开发服务端渲染的 Vue 应用提供了极其便利的开发体验。更酷的是,你甚至可以用它来做为静态站生成器。

nuxt官网介绍

安装

// init过程中根据提示安装用到的插件灯
npm init nuxt-app <project-name>

cd <project-name>
npm run dev

配置

nuxt.config.js

const path = require('path')
export default {
  // 允许你在`Javascript`和`Css`中使用别名访问自定义目录
  alias: {
    '~~': `<rootDir>`,
    '@@': `<rootDir>`,
    '~': `<srcDir>`,
    '@': `<srcDir>`,
    'assets': `<srcDir>/assets`, // (unless you have set a custom `dir.assets`)
    'static': `<srcDir>/static`, // (unless you have set a custom `dir.static`)
    'style': path.resolve(__dirname, './assets/style')
  },

  // 定义应用程序的工作区目录,默认值process.cwd()
  rootDir: '',

  // 定义应用程序的source目录,默认值同rootDir
  srcDir: '',

  // server连接配置
  server: {
    port: 3000, // default: 3000
    host: '0.0.0.0', // default: localhost,
    timing: false
  },

  // npm run generate时执行,构建部署静态应用程序
  generate: {
    // 目录名
    dir: 'dist'
  },

  // true启动服务器端渲染,false只启动客户端渲染
  ssr: true,

  // headers设置,Global page headers: https://go.nuxtjs.dev/config-head
  head: {
    title: 'ssr-demo',
    htmlAttrs: {
      lang: 'en'
    },
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: '' }
    ],
    link: [
      { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
    ]
  },

  // 全局css,Global CSS: https://go.nuxtjs.dev/config-css
  css: [
    // 'ant-design-vue/dist/antd.css'
    // css后缀可以省略
    'assets/style/common'
  ],

  // 添加plugins目录下的js文件到应用程序中,Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
  plugins: [
    '@/plugins/antd-ui',
    '@/plugins/veui'
  ],

  // 自动扫描和导入组件,无需在使用时import组件,可直接使用,Auto import components: https://go.nuxtjs.dev/config-components
  components: true,

  // Build Configuration: https://go.nuxtjs.dev/config-build
  build: {
    // 是否提取css至独立文件中
    // extractCSS: true,
    // babel相关配置
    babel: {
      plugins: [
        'veui',
        ['import', {
          'libraryName': 'ant-design-vue',
          'libraryDirectory': 'es',
          'style': true
            // customStyleName: name => {
            //   return `assets/${name}.css`
            // }
          }
        ] // `style: true` 会加载 less 文件
      ]
    },
    // 可省略的扩展名
    resolve: {
      extensions: ['.js', '.vue', '.json']
    },
    // 需要进行babel编译的包
    transpile: ['veui', 'vue-awesome', 'ant-design-vue'],
    // loader配置
    loaders: {
      vue: {
        extractCSS: true
      },
      less: {
        javascriptEnabled: true
      }
    },
    // 手动扩展客户端和服务端的webpack配置
    extend(config, context){
        //添加loader规则
          config.module.rules.push({
              test: /\.vue$/, //匹配.svg
              include: [path.resolve(__dirname, 'node_modules/veui')], //将存放svg的目录加入到loader处理目录
              use: [{ loader: 'veui-loader', options: {
                modules: [
                  {
                    package: 'veui-theme-blue',
                    fileName: '${module}.less'
                  },
                  {
                    package: 'veui-theme-blue',
                    fileName: '${module}.js',
                    transform: false
                  }
                ]
              }}]
          })
    }
  }
}

Demo示例

1. ssr: true,服务端渲染

服务端渲染时,可以看到入口返回的Preview就是在服务端生成好的页面,这种方式更利于SEO和快速展示页面。 image.png

2. ssr: false,客户端渲染

客户端渲染时,可以看到入口返回的Preview是一个空白页面,页面的Dom是由提取的其他js在浏览器端动态生成的。 image.png

3. BundleRenderer自动内联关键CSS(critical css)

关于critical css的介绍,可以看另一篇文章:juejin.cn/post/694647… pages/index.vue为首屏渲染页面

<template>
    <div class="index">首页</div>
</template>
<style>
.index {
    color: red;
}
</style>

新建pages/test.vue页面,验证SSR是否会自动注入关键css(critical css

<template>
    <div class="test">测试</div>
</template>
<style>
.test {
    color: red;
}
</style>
  • index.vue中引入test.vue,服务启动后,test.vue样式也以style形式内嵌在页面中 image.png
  • 不在index.vue中引入test.vue,服务启动后,test.vue样式则没有内嵌在首屏渲染页面中 image.png 只有在访问test路由时才显示test.vue相关样式 image.png

总结:SSR服务端会自动注入首屏渲染关键css,无需引入其他插件。

4. extract提取css

启用extract提取css后,样式被提取到单独的css文件中,以外链的形式引入。 image.png

以上就是Vue SSR nuxt框架相关的整理,每天都有学不完的新知识,加油!!

相关内容推荐

芜湖正规seo推广域名和seo优化淘宝seo各层模块邵阳seo免费优化阜阳抖音seo甘孜seo哪家好哈尔滨企业seo服务网页静态化seo百家seoseo的原创内容优衣库seo久久seo正规吗江阴seo优化排名WordPress页面的seo嘉兴seo推广方案seo学习框架技术新艺seo软件肇庆seo页面优化seo 教程菜鸟后院北仑网络seo凡凡seo论坛SEO观察植物推荐seo优化导航目录怀化网站seo优化蔡甸seo教程seo优化提升标准seo业务有哪些黑帽seo书河南seo优化项目霍州网站seo推广莆田标题seo优化金华seo顾问服务seo单页面查找谷歌seo优化案例来宾seo推广服务谷歌seo能用吗吴中seo推广优化seo网站首页排版seo效果知乎镜像站群seo佛山做seo优化seo引流变现安阳实力seo推荐东台seo快速排名seo实战密码过时广南网站seo开发seo搜索标题排名塘沽seo优化价格成华seo优化泰安正规seo优化seo优化 alt优化seo品牌折扣优化免费的seo 推广seo 优化合同专业seo优化行业群邑面试seoseo属于it么抖音介绍seo辽宁seo优化收费奉贤seo优化公司最好seo的wordpress海伦seo外包平台华阴seo优化服务淘宝seo的原理抖音seo新手海晏seo优化定制北京seo培训seocnm网站链接提交seoseo技术难么武穴seo推广ppt厦门搜狗seo优化浙江seo外包优化seo失败的原因懒加载图片 seoseo自媒体转行网络seo收费标准如皋seo全网优化douyin_seo_lp出于意料的seoseo优化在哪里佛山做seo优化seo168.cc优化seo培训课程云南seo公司教程seo是指什么seo优化排名资讯凤冈网站seo优化SEO链接推送工具2022年seo前景宾武仕seoseo作弊的文章腾讯云招聘seo网络网站seo品牌seo推广必备技巧谷歌seo免费操作seo投资有哪些seo单页推荐潭州学院seo骗局seo推广图片 png引流seo是啥Seo优化方案标准淘客推广seo惠州做网站seo成都seo顾问服务seo平常工作内容seo图片标签优化企鹅seo 网销park seo 腾讯课堂seo流量营销方案jquery内容展示seo温州排名seo优化seo秘教程博客seo运营技能介绍常州做seo优化商洛网站seo优化独立站seo简历seo平台产品标题seo前端优化排名seo隐藏链接效果网站优化seo免费企业seo软文代理seo 万方seo整站优化资源东莞seo排名原理seo排名软件排行seo推广链接赚钱河南seo优化系统seo本地化菏泽seo官网东莞网页seo排名宝鸡全网SEO优化福建seo优化备案淘宝seo软文代写seo技术外连接站内seo的方法装修工程seo推广北京seo营销系统seo短视频内容启东seo快速排名英山seo优化机构云南seo教程基础无锡seo推广营销株洲seo优化教程seo到底有多强厦门seo综合查询山东济南SEO优化哈尔滨谷歌优化seo罗源正规seo优化南京英文SEO招聘郑州seo公司策划seo什么用学习seo的视频seo找人写模板宜兴市seo巫溪seo优化网宝应seo优化建设哪些网站做了seo潍坊seo优化行业阿信seo网站运营景洪seo优化价格seo积分排名mvc3 seo网站seo伪原创seo 优化微博hyein seo 2018年SEO岗位面经口碑seo代运营兰州seo排名工具谷歌建站seo代码福建seo费用多少龙口seo整站优化宁波seo推广源码宜春seo哪家好辽宁seo专业团队南宁专业seo排名乌审旗网站seo优化seo专家的面试时代seo优化资费无锡大型网站seo惠州seo优化收费seo优化师薪水徐州seo自然排名park_seo_joonseo全自动发布化工seo优化报价目录站seo优化济南seo怎么选择王小优seoseo 排名代做seo解散了吗呈贡县seo莆田seo排名外包云安seo优化技巧seo怎么优化 稳定seo推荐火.星seo入口网站推广seo参数是什么西藏seo优化商家抖音官方seo重庆医院seo招聘

合作伙伴

璇泰初网络

seo.jsfengchao.com
www.chaoshanxing.com
qiansan.seo5951.com
www.he1tech.com
www.lyhbj.cn
www.bbswimming.cn
www.conductive-powder.com
www.maijichuang.cn
www.jsfengchao.com
www.conductive-powder.com
dh.jsfengchao.com
www.ddtxly.cn
seo.xtcwl.com
www.andmedia.cn
www.ddtxly.cn
kuai.urkeji.com
www.clhczx.cn
www.akz.net.cn
niu.seo5951.com
jl.urkeji.com