рднрд╛рдЧ 1 рдореЗрдВ, рдореИрдВрдиреЗ рдмрд╛рдд рдХреА рдХрд┐ Nuxt рдореЗрдВ API рд╕рд░реНрд╡рд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ ред рднрд╛рдЧ 2 рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ Nuxt рдлреБрд▓рд╕реНрдЯреИрдХ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ редрднрд╛рдЧ 2: рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдореЗрдВ рддреЗрдЬреА!
рдЪрд▓рд┐рдП рдЕрдм рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЛрдбрдмреЙрдХреНрд╕ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ редio/s/codesandbox-nuxt-3gzhl- рдХреНрд▓рд╛рдЗрдВрдЯ рдореБрдЦреНрдп рдкреЗрдЬ 3gzhl.sse.codesandbox.io рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ
- Nuxt рд╕рд░реНрд╡рд░ рдкрд░ рдкреЗрдЬ / рдкреЗрдЬреЗрд╕ /index.vue рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ
- рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ
async fetch() {
this.users = await this.$api("users", "index");
},
- рд╡рд╛рдпрд╛ Axios, рд╡рд╣ рдПрдХ рдмрдирд╛рддрд╛ рд╣реИ http рдЕрдиреБрд░реЛрдз , рдкрд░ 3gzhl.sse.codesandbox.io/api/users/index рдЕрд░реНрдерд╛рдд рдЕрдкрдиреЗ рдЖрдк рдкрд░
- рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдирдпрд╛ рд╕рддреНрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ http рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рд╣реИ
- рдПрдХ рдЖрд╡рдХ рдЕрдиреБрд░реЛрдз http рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , url рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рд╕рд░реНрд╡рд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ
- Nuxt рдиреЗ рд╣рдорд╛рд░рд╛ API рд╕рд░реНрд╡рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛
- JSON
- users.index(), JSON
- JSON http
- axios JSON
- API
рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреГрд╖реНрда рдкрд░ 20 рдШрдЯрдХ рд╣реИрдВ рдЬреЛ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ , рдЗрд╕рд▓рд┐рдП Nuxt рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ , 20 рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдВрддрд░рд┐рдХ http рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ 4-13 рдЪрд░рдг 20 рдмрд╛рд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред Nuxt HTTP рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 55 рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдВрддрд░рд┐рдХ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдмрдирд╛рддреЗ рд╣реБрдП, рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рджрд╕рд┐рдпреЛрдВ рдмрд╛рд░ рдХрдо рдХрд░рддреЗ рд╣реИрдВредрд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рдкреЗрдЬ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо / рдПрдкреАрдЖрдИ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рд░рдЦрддреЗ рд╣реИрдВ /рдЖрдЗрдП рддрд░реНрдХ рдмрджрд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рд░реНрд╡рд░ рдкрд░ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╕рдордп, рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ http рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред- рдирд╛рдо рдмрджрд▓реЗрдВ рдлрд╝рд╛рдЗрд▓ /plugins/api-context.js рдХреЛ /plugins/api-context.client.js
- рд╕реЗрдЯрд┐рдВрдЧреНрд╕ /nuxt.config.js рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ
plugins: ["~/plugins/api-context.client.js"]
рдЕрдм рдпрд╣ $ Api рд╕рдВрджрд░реНрдн рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ
- рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ред $ 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;
}
});
};
- рд╕рд░реНрд╡рд░ рдкреНрд▓рдЧрдЗрди
/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- рдмрд╛рд╣рд░реА рдХрдиреЗрдХреНрд╢рди рдХреА рдЧрддрд┐ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛:
/api/users.js
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."
}
};
}
....
- 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;
}
});
};
- 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;
},
- 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";
...
- рдЕрдм 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 рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджрд╛рд╣рд░рдг рдЫреЛрдЯреЗ рдФрд░ рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рднрд╛рд░ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП