Необходимость изучения коа
koa — это небольшой и надежный фреймворк для веб-разработки, созданный оригинальной командой Express, и из-за его преимуществ ядро многих веб-фреймворков, таких как eggjs, также управляется koa, знакомым с кодом koa, не только для разработки с koa. очень полезно, а также помогает понять более мощные фреймворки, такие как eggjs и т. д.
Обзор знаний
Можно сказать, что прототип является ядром всего javascript, и это один из ключевых пунктов знаний для глубокого понимания javascript.
Делегат — это программный способ упростить наши операции.
1.1 Сначала объявите «родительский класс» (или прототип подкласса)
const Car = {
get name() {
return this.engine.name;
},
start: function() {
return `${this.engine.name} start`;
},
};
1.2 Используйте родительский класс для создания подкласса (родительский класс находится в цепочке прототипов подкласса)
const BMW = Object.create(Car);
1.3 Динамическое добавление свойств в подклассы
BMW.engine = {
name: 'v8',
};
1.5 Вызов методов подклассов
BMW.name; // 'v8'
BMW.start(); // 'v8 start'
1.6 Определение прокси-объектов
const BMWPHONE = {};
1.7 Определение метода прокси
function Delegate(source, target) {
this.source = source;
this.target = target;
}
Delegate.prototype.method = function(name) {
const target = this.target;
const source = this.source;
source[name] = function() {
return this[target][name].apply(this[target], arguments);
};
};
1.8 Выполнение целевого метода на прокси-объекте
const delegate = new Delegate(BMWPHONE, 'BMW');
delegate.method('start');
BMWPHONE.BMW = BMW;
BMWPHONE.start();
Родительский класс Car определен, BMW наследует метод Car и устанавливает мощный двигатель для BMW, который теперь можно запустить вручную через BMW;
Теперь компания BMW разработала мобильный телефон, который активируется вручную с помощью агента управления мобильным телефоном.
Причина приведенного выше примера (здесь вы почувствуете огромную разницу между js и статическими языками) заключается в том, что 3 из 4 файлов в koa связаны с прототипами и прокси.
структура кода
koa очень маленький, всего 4 файла, функция каждого файла тоже очень индивидуальна, и имя файла также четко отражает функцию файла.
файловая структура koa
├── application.js
├── context.js
├── request.js
└── response.js
-
request.js
В основном для объекта запроса http, он предоставляет большое количество методов получения для изменения объекта.Файл в основном используется дляПолучатьзапрашивать свойства объекта, см. 1.1.
-
response.js
В основном для объекта ответа http предоставляется большое количество заданных методов объекта; этот файл в основном используется длянастраиватьсвойства объекта ответа, см. 1.1.
-
context.js
koa вводит понятие объекта контекста, а именно ctx, так называемый объект контекста здесь фактически является объединением объектов запроса и ответа, запрос и ответ передаются черезиграет рольform, обратитесь к 1.8, делегируйте свои собственные методы в ctx. Таким образом, мы можем использовать ctx для манипулирования двумя объектами одновременно, чтобы упростить операцию.
-
application.js
Этот файл является ядром всего коа, вкратце он выполняет две основные функции:Смонтируйте реальный запрос в ctx и инкапсулируйте порядок выполнения промежуточного программного обеспечения.
createContext(req, res) {
const context = Object.create(this.context);
const request = context.request = Object.create(this.request);
const response = context.response = Object.create(this.response);
context.app = request.app = response.app = this;
context.req = request.req = response.req = req;
context.res = request.res = response.res = res;
request.ctx = response.ctx = context;
request.response = response;
response.request = request;
}
Здесь createContext — это операция, описанная выше в разделе 1.3, — наследование методов в цепочке прототипов и подготовка данных для методов в цепочке прототипов.
Здесь много избыточных монтирований (избыточность для совместимости с экспресс-частью метода написания), если нужно использовать только ctx, то часть монтирований можно опустить.
module.exports = compose;
function compose(middleware) {
return function(context, next) {
let index = -1;
return dispatch(0);
function dispatch(i) {
if (i <= index)
return Promise.reject(new Error('next() called multiple times'));
index = i;
let fn = middleware[i];
if (i === middleware.length) fn = next;
if (!fn) return Promise.resolve();
try {
return Promise.resolve(
fn(context, function next() {
return dispatch(i + 1);
})
);
} catch (err) {
return Promise.reject(err);
}
}
};
}
промежуточное ПО koa характеризуется выполнением в обратном порядке или луковой моделью. Приведенный выше метод compose представляет собой код для реализации луковой модели.Вышеприведенный метод прост:Замените тело метода следующего промежуточного программного обеспечения следующим параметром предыдущего промежуточного программного обеспечения.. Метод compose, пожалуй, самая трудная для понимания часть koa.
app.use(async function1(ctx, next) {
console.log(1.1);
next();
console.log(1.2);
})
app.use(async function2(ctx, next) {
console.log(2.1);
next();
console.log(2.2);
})
После обработки функцией compose фактический код выполнения можно увидеть так:
(async function1(ctx) {
console.log(1.1);
// next 部分
(async function2(ctx) {
console.log(2.1);
...
console.log(2.2)
}
)(ctx)
conosle.log(1.2);
})(ctx)
Затем мы можем увидеть характеристики луковой модели:Первое зарегистрированное промежуточное ПО, расположенное в самой внешней части модели..
На самом деле коа в основном делает две вещи:
- пакет ctx
- Соберите промежуточное ПО для реализации луковой модели выполнения в обратном порядке..
Суммировать
По сравнению с hapi и eggjs koa действительно настолько мал, что его нельзя назвать фреймворком, но можно рассматривать как библиотеку, но это не мешает развитию экосистемы koa.
Вначале Express также был большой и всеобъемлющей структурой, постепенно извлекая различные функции из формы промежуточного программного обеспечения.Коа можно рассматривать как реализацию этой идеи. Большая и всеобъемлющая структура в основном имеет такие проблемы, как высокая стоимость обучения и избыточные функции.Использование koa очень удобно для тех, кто впервые использует nodejs для разработки веб-сайтов, но есть также определенные проблемы, слишком гибкое программирование, что приводит к различным методам программирования, и нет единого стандарта, а стоимость обучения между различными инженерными кодами высока.
Новичкам рекомендуется начать с koa и использовать разное промежуточное ПО для достижения разных функций, что очень полезно для понимания веб-разработки. Когда у вас будет определенное количество накоплений и опыта, вы сможете договориться о правилах программирования koa самостоятельно.Когда ваши собственные правила программирования не могут удовлетворить ваши потребности, вы можете начать с реального фреймворка.
Обратите внимание на публичный аккаунт WeChat: KnownsecFED, получайте больше качественной галантереи по коду!