• Vue SSR学习


    SSR大家肯定都不陌生,通过服务端渲染,可以优化SEO抓取,提升首页加载速度等,我在学习SSR的时候,看过很多文章,有些对我有很大的启发作用,有些就只是照搬官网文档。通过几天的学习,我对SSR有了一些了解,也从头开始完整的配置出了SSR的开发环境,所以想通过这篇文章,总结一些经验,同时希望能够对学习SSR的朋友起到一点帮助。

    我会通过五个步骤,一步步带你完成SSR的配置:

    1. 纯浏览器渲染
    2. 服务端渲染,不包含Ajax初始化数据
    3. 服务端渲染,包含Ajax初始化数据
    4. 服务端渲染,使用serverBundleclientManifest进行优化
    5. 一个完整的基于Vue + VueRouter + Vuex的SSR工程

    如果你现在对于我上面说的还不太了解,没有关系,跟着我一步步向下走,最终你也可以独立配置一个SSR开发项目,所有源码我会放到github上,大家可以作为参考

    正文

    1. 纯浏览器渲染

    这个配置相信大家都会,就是基于weback + vue的一个常规开发配置,这里我会放一些关键代码,完整代码可以去github查看。

    目录结构
    - node_modules
    - components  
        - Bar.vue
        - Foo.vue
    - App.vue
    - app.js
    - index.html
    - webpack.config.js
    - package.json
    - yarn.lock
    - postcss.config.js
    - .babelrc
    - .gitignore
    app.js
    import Vue from 'vue';
    import App from './App.vue';
    
    let app = new Vue({
      el: '#app',
      render: h => h(App)
    });
    App.vue
    <template>
      <div>
        <Foo></Foo>
        <Bar></Bar>
      </div>
    </template>
    
    <script>
    import Foo from './components/Foo.vue';
    import Bar from './components/Bar.vue';
    
    export default {
      components: {
        Foo, Bar
      }
    }
    </script>
    index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>纯浏览器渲染</title>
    </head>
    <body>
      <div id="app"></div>
    </body>
    </html>
    components/Foo.vue
    <template>
      <div class="foo">
        <h1>Foo Component</h1>
      </div>
    </template>
    
    <style>
    .foo {
      background: yellowgreen;
    }
    </style>
    components/Bar.vue
    <template>
      <div class="bar">
        <h1>Bar Component</h1>
      </div>
    </template>
    
    <style>
    .bar {
      background: bisque;
    }
    </style>
    webpack.config.js
    const path = require('path');
    const VueLoaderPlugin = require('vue-loader/lib/plugin');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    const ExtractTextPlugin = require('extract-text-webpack-plugin');
    
    module.exports = {
      mode: 'development',
    
      entry: './app.js',
    
      output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js'
      },
    
      module: {
        rules: [
          {
            test: /.js$/,
            use: 'babel-loader'
          },
          {
            test: /.css$/,
            use: ['vue-style-loader', 'css-loader', 'postcss-loader']
            // 如果需要单独抽出CSS文件,用下面这个配置
            // use: ExtractTextPlugin.extract({
            //   fallback: 'vue-style-loader',
            //   use: [
            //     'css-loader',
            //     'postcss-loader'
            //   ]
            // })
          },
          {
            test: /.(jpg|jpeg|png|gif|svg)$/,
            use: {
              loader: 'url-loader',
              options: {
                limit: 10000    // 10Kb
              }
            }
          },
          {
            test: /.vue$/,
            use: 'vue-loader'
          }
        ]
      },
    
      plugins: [
        new VueLoaderPlugin(),
        new HtmlWebpackPlugin({
          template: './index.html'
        }),
        // 如果需要单独抽出CSS文件,用下面这个配置
        // new ExtractTextPlugin("styles.css")
      ]
    };
    postcss.config.js
    module.exports = {
      plugins: [
        require('autoprefixer')
      ]
    };
    .babelrc
    {
      "presets": [
        "@babel/preset-env"
      ],
      "plugins": [
        // 让其支持动态路由的写法 const Foo = () => import('../components/Foo.vue')
        "dynamic-import-webpack"    
      ]
    }
    package.json
    {
      "name": "01",
      "version": "1.0.0",
      "main": "index.js",
      "license": "MIT",
      "scripts": {
        "start": "yarn run dev",
        "dev": "webpack-dev-server",
        "build": "webpack"
      },
      "dependencies": {
        "vue": "^2.5.17"
      },
      "devDependencies": {
        "@babel/core": "^7.1.2",
        "@babel/preset-env": "^7.1.0",
        "babel-plugin-dynamic-import-webpack": "^1.1.0",
        "autoprefixer": "^9.1.5",
        "babel-loader": "^8.0.4",
        "css-loader": "^1.0.0",
        "extract-text-webpack-plugin": "^4.0.0-beta.0",
        "file-loader": "^2.0.0",
        "html-webpack-plugin": "^3.2.0",
        "postcss": "^7.0.5",
        "postcss-loader": "^3.0.0",
        "url-loader": "^1.1.1",
        "vue-loader": "^15.4.2",
        "vue-style-loader": "^4.1.2",
        "vue-template-compiler": "^2.5.17",
        "webpack": "^4.20.2",
        "webpack-cli": "^3.1.2",
        "webpack-dev-server": "^3.1.9"
      }
    }
    命令
    启动开发环境
    yarn start
    构建生产环境
    yarn run build

     

     

  • 相关阅读:
    域名系统
    DNS域名解析过程
    服务器常用的状态码
    重绘与重排及它的性能优化
    console.time和console.timeEnd用法
    用CSS开启硬件加速来提高网站性能
    公钥和私钥
    svn conflict 冲突解决
    svn分支开发与主干合并(branch & merge)
    源生js惯性滚动与回弹效果
  • 原文地址:https://www.cnblogs.com/zjw2004112/p/11763991.html
Copyright © 2020-2023  润新知