في الجزء 1 ، وصفت مدى سهولة تنظيم خادم API في Nuxt . في الجزء الثاني ، أريد أن أخبرك بالمزايا الإضافية التي يمكنك الحصول عليها من خادم Nuxt fullstack .الجزء 2: تسريع عرض الخادم!
دعونا نفكر الآن في كيفية عمل الخادم الخاص بنا من مثال codeandbox.io/s/codesandbox-nuxt-3gzhl- يطلب العميل الصفحة الرئيسية 3gzhl.sse.codesandbox.io
- يبدأ Nuxt في عرض الصفحة /pages/index.vue على الخادم
- تاتي الى
async fetch() {
this.users = await this.$api("users", "index");
},
- عبر أكسيوس، وقال انه يجعل طلب 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 داخلية ، نقوم بتقليل موارد الخادم المحتملة بعشرات المرات.ولكن عندما نقدم الصفحة على الخادم ، يكون لدينا وصول مباشر إلى جميع وحدات التحكم في المجلد / api /دعنا نغير المنطق بحيث يتم استدعاء رمز وحدة التحكم مباشرة عند العرض على الخادم ، وعند الاتصال من المتصفح ، يتم إرسال الطلب عبر 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 يرسل طلب http من خلال المحاور .الرمز async fetch() {
this.users = await this.$api("users", "index");
},
عند التقديم على الخادم ، لن يقوم بتنفيذ طلب http لنفسه ، ولكن ببساطة قم بتوصيل ملف /api/users.js عبر طلب واستدعاء طريقة index () ، أي لن يتم تنفيذ العناصر من 4-13 ، ولكن سيتم تنفيذ 10 فقط. ومع ذلك ، عندما ينقر العميل على الزر " تحديث" في المتصفح ، سيتم طلب نفس البيانات عبر http . إليك الكود الكامل: codeandbox.io/s/codesandbox-nuxt-pbriwاختبار أداء
odesandbox.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
خادم استدعاء واجهة برمجة التطبيقات الداخلية لخادم واجهة برمجة التطبيقات: وقت إحضار 1
مللي
ثانية من 0 مللي ثانية إلى 2 مللي ثانية كحد أقصى rzdyw.sse.codesandbox.io/httpcall
Server http API وقت تقديم المكالمات: 71 مللي ثانية
من 46 مللي ثانية إلى 1059 مللي ثانية كحد أقصى
وعدة مرات تعطل الخادم بشكل عام مع وجود خطأ
RangeError
Maximum call stack size exceeded
هنا مثال كامل - codeandbox.io/s/codesandbox-nuxt-rzdywمجموع الجزء 2
- مع الحد الأدنى من التغييرات ، يمكنك تسريع عرض الخادم بأكثر من 50 مرة ، في مثال مباشر ، تم تسريع عرض صفحتي بمقدار 1.7 مرة تقريبًا
- تم تقليل موارد خادم عقدة HTTP بشكل ملحوظ
- بطريقة محسنة ، يجب أن يتحمل مثيل Nuxt الوحيد حمل المشاريع الصغيرة والمتوسطة الحجم