Nuxt рдлреБрд▓рд╕реНрдЯреИрдХ рд╕рд░реНрд╡рд░ (рднрд╛рдЧ 2) рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд SSR рдкреНрд░рджрд░реНрд╢рди

Nuxt рдлреБрд▓рд╕реНрдЯреИрдХ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд SSR рдкреНрд░рджрд░реНрд╢рди


рднрд╛рдЧ 1 рдореЗрдВ, рдореИрдВрдиреЗ рдмрд╛рдд рдХреА рдХрд┐ Nuxt рдореЗрдВ API рд╕рд░реНрд╡рд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ ред рднрд╛рдЧ 2 рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ Nuxt рдлреБрд▓рд╕реНрдЯреИрдХ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред

рднрд╛рдЧ 2: рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдореЗрдВ рддреЗрдЬреА!


рдЪрд▓рд┐рдП рдЕрдм рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЛрдбрдмреЙрдХреНрд╕ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ редio/s/codesandbox-nuxt-3gzhl

  1. рдХреНрд▓рд╛рдЗрдВрдЯ рдореБрдЦреНрдп рдкреЗрдЬ 3gzhl.sse.codesandbox.io рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ
  2. Nuxt рд╕рд░реНрд╡рд░ рдкрд░ рдкреЗрдЬ / рдкреЗрдЬреЗрд╕ /index.vue рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ
  3. рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ

      async fetch() {
        this.users = await this.$api("users", "index");
      },
    
  4. рд╡рд╛рдпрд╛ Axios, рд╡рд╣ рдПрдХ рдмрдирд╛рддрд╛ рд╣реИ http рдЕрдиреБрд░реЛрдз , рдкрд░ 3gzhl.sse.codesandbox.io/api/users/index рдЕрд░реНрдерд╛рдд рдЕрдкрдиреЗ рдЖрдк рдкрд░
  5. рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдирдпрд╛ рд╕рддреНрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ http рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рд╣реИ
  6. рдПрдХ рдЖрд╡рдХ рдЕрдиреБрд░реЛрдз http рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , url рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  7. рд╕рд░реНрд╡рд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ
  8. Nuxt рдиреЗ рд╣рдорд╛рд░рд╛ API рд╕рд░реНрд╡рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛
  9. JSON
  10. users.index(), JSON
  11. JSON http
  12. axios JSON
  13. API

рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреГрд╖реНрда рдкрд░ 20 рдШрдЯрдХ рд╣реИрдВ рдЬреЛ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ , рдЗрд╕рд▓рд┐рдП Nuxt рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ , 20 рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдВрддрд░рд┐рдХ http рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ 4-13 рдЪрд░рдг 20 рдмрд╛рд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред Nuxt HTTP рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 55 рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдВрддрд░рд┐рдХ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдмрдирд╛рддреЗ рд╣реБрдП, рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рджрд╕рд┐рдпреЛрдВ рдмрд╛рд░ рдХрдо рдХрд░рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рдкреЗрдЬ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо / рдПрдкреАрдЖрдИ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рд░рдЦрддреЗ рд╣реИрдВ /

рдЖрдЗрдП рддрд░реНрдХ рдмрджрд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рд░реНрд╡рд░ рдкрд░ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╕рдордп, рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ http рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред

  1. рдирд╛рдо рдмрджрд▓реЗрдВ рдлрд╝рд╛рдЗрд▓ /plugins/api-context.js рдХреЛ /plugins/api-context.client.js
  2. рд╕реЗрдЯрд┐рдВрдЧреНрд╕ /nuxt.config.js рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ

      plugins: ["~/plugins/api-context.client.js"]
    

    рдЕрдм рдпрд╣ $ Api рд╕рдВрджрд░реНрдн рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ
  3. рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ред $ api рдкреНрд░рд╕рдВрдЧ рдХреЛ рд╕реАрдзреЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ

    /plugins/api-context.server.js рд╕рд░реНрд╡рд░ рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ
    export default (context, inject) => {
      inject("api", async (controller, method, params) => {
        try {
          let api = require("../api/" + controller.replace(/^\/+|\/+$|\.+/g, ""));
          return await api[method](params);
        } catch (e) {
          console.error(e);
          throw e;
        }
      });
    };
    
  4. рд╕рд░реНрд╡рд░ рдкреНрд▓рдЧрдЗрди

    /nuxt.config.js рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
      plugins: [
        "~/plugins/api-context.client.js",
        "~/plugins/api-context.server.js"
      ]
    

рдЕрдм рдпрд╣ рдлрд╝рдВрдХреНрд╢рди ред $ Api рд╕рд░реНрд╡рд░ рдкрд░ рд╕реАрдзреЗ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЗрд╕ $ред $ Api axios рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ ред

рдХреЛрдб

  async fetch() {
    this.users = await this.$api("users", "index");
  },

рд╕рд░реНрд╡рд░ рдкрд░ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ , рд▓реЗрдХрд┐рди рдмрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ /api/users.js рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ , рдЕрд░реНрдерд╛рддред 4-13 рд╕реЗ рдЖрдЗрдЯрдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ 10 рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд░реАрдлрд╝реНрд░реЗрд╢ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ , рддреЛ рдЙрд╕реА рдбреЗрдЯрд╛ рдХреЛ http рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред

рдпрд╣рд╛рдБ рдкреВрд░реНрдг рдХреЛрдб рд╣реИ: codesandbox.io/s/codesandbox-nuxt-pbriw

рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг


codesandbox.io/s/codesandbox-nuxt-rzdyw

  1. рдмрд╛рд╣рд░реА рдХрдиреЗрдХреНрд╢рди рдХреА рдЧрддрд┐ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛:

    /api/users.js
    // we can get data from any DB
    async function getDataFromDB() {
      return {
        page: 1,
        per_page: 6,
        total: 12,
        total_pages: 2,
        data: [
          {
            id: 1,
            email: "george.bluth@reqres.in",
            first_name: "George",
            last_name: "Bluth",
            avatar:
              "https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg"
          },
          {
            id: 2,
            email: "janet.weaver@reqres.in",
            first_name: "Janet",
            last_name: "Weaver",
            avatar:
              "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"
          },
          {
            id: 3,
            email: "emma.wong@reqres.in",
            first_name: "Emma",
            last_name: "Wong",
            avatar:
              "https://s3.amazonaws.com/uifaces/faces/twitter/olegpogodaev/128.jpg"
          },
          {
            id: 4,
            email: "eve.holt@reqres.in",
            first_name: "Eve",
            last_name: "Holt",
            avatar:
              "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/128.jpg"
          },
          {
            id: 5,
            email: "charles.morris@reqres.in",
            first_name: "Charles",
            last_name: "Morris",
            avatar:
              "https://s3.amazonaws.com/uifaces/faces/twitter/stephenmoon/128.jpg"
          },
          {
            id: 6,
            email: "tracey.ramos@reqres.in",
            first_name: "Tracey",
            last_name: "Ramos",
            avatar:
              "https://s3.amazonaws.com/uifaces/faces/twitter/bigmancho/128.jpg"
          }
        ],
        ad: {
          company: "StatusCode Weekly",
          url: "http://statuscode.org/",
          text:
            "A weekly newsletter focusing on software development, infrastructure, the server, performance, and the stack end of things."
        }
      };
      /*
      return (await require("axios").get(`https://reqres.in/api/users?page=1`))
        .data;
      */
    }
    ....
    
  2. api , http

    /plugins/api-context.server.js
    export default (context, inject) => {
      inject("server", () => true);
      inject("api", async (controller, method, params) => {
        try {
          if (params && params.httpcall) {
            return await context.$axios["$" + (params ? "post" : "get")](
              "/api/" + controller + "/" + method,
              params
            );
          }
          let api = require("../api/" + controller.replace(/^\/+|\/+$|\.+/g, ""));
          return await api[method](params);
        } catch (e) {
          console.error(e);
          throw e;
        }
      });
    };
    
  3. index.vue fetch api 50

    /pages/index.vue
      async fetch() {
        let start = new Date();
        let promises = [];
        let callNum = 50;
        for (let i = 0; i < callNum; i++) {
          promises.push(this.$api("users", "index"));
        }
    
        let arr = await Promise.all(
          promises.map(async p => {
            return await p;
          })
        );
    
        let res = [];
        for (let r of arr) {
          res = res.concat(r);
        }
    
        this.users = res;
        this.fetchType =
          (this.$server && this.$server() ? "Server internal" : "Client http") +
          " API call";
        this.fetchTime = new Date() - start;
      },
    
  4. httpcall.vue fetch api 50 http

    /pages/httpcall.vue
    ...
          promises.push(this.$api("users", "index", { httpcall: true }));
    ...
        this.fetchType =
          (this.$server && this.$server() ? "Server http" : "Client http") +
          " API call";
    ...
    
  5. рдЕрдм rzdyw.sse.codesandbox.io

    рд╕рд░реНрд╡рд░ рдЖрдВрддрд░рд┐рдХ API рдХреЙрд▓ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ: 1ms рдХрд╛
    рд╕рдордп 0ms рд╕реЗ рдЕрдзрд┐рдХрддрдо 2ms

    rzdyw.sse.codesandbox.io/httpsall
    рд╕рд░реНрд╡рд░ http API рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд▓рд╛рдиреЗ рдХрд╛ рд╕рдордп: 46ms
    рд╕реЗ рдЕрдзрд┐рдХрддрдо 1059ms рдХреЗ рд▓рд┐рдП 71ms рд╕рдордп
    рдФрд░ рдХрдИ рдмрд╛рд░ рд╕рд░реНрд╡рд░ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

    RangeError
    Maximum call stack size exceeded

рдпрд╣рд╛рдВ рдПрдХ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рд╣реИ - рдХреЛрдбреИрдВрдбрдмреЙрдХреНрд╕.рдЖрдИрдУ / рдПрд╕ / рдХреЛрдбреНрд╕рдмреЙрдХреНрд╕- рдПрдВрдЯреЗрдХреНрд╕- рдЖрд░рдЬрд╝реЗрдбреАрдбрдмреНрд▓реНрдпреВ

рдХреБрд▓ рднрд╛рдЧ реи


  • рдиреНрдпреВрдирддрдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдк 50 рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рдЧрддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдЬреАрд╡рдВрдд рдЙрджрд╛рд╣рд░рдг рдкрд░, рдореЗрд░реЗ рдкреЗрдЬ рдХреЛ рдкреНрд░рддрд┐рдкрд╛рджрди ~ 1.7 рдЧреБрдирд╛ рд╕реЗ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
  • рдиреЛрдб HTTP рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдХрд╛рдлреА рдХрдореА рдЖрдИ рд╣реИ
  • рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рддрд░реАрдХреЗ рд╕реЗ, Nuxt рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдЫреЛрдЯреЗ рдФрд░ рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рднрд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

All Articles