коа сумка обучающая сумка серия встреч (1) - народный коа

задняя часть koa
коа сумка обучающая сумка серия встреч (1) - народный коа

Необходимость изучения коа

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)

Затем мы можем увидеть характеристики луковой модели:Первое зарегистрированное промежуточное ПО, расположенное в самой внешней части модели..
На самом деле коа в основном делает две вещи:

  1. пакет ctx
  2. Соберите промежуточное ПО для реализации луковой модели выполнения в обратном порядке..

Суммировать

По сравнению с hapi и eggjs koa действительно настолько мал, что его нельзя назвать фреймворком, но можно рассматривать как библиотеку, но это не мешает развитию экосистемы koa.

Вначале Express также был большой и всеобъемлющей структурой, постепенно извлекая различные функции из формы промежуточного программного обеспечения.Коа можно рассматривать как реализацию этой идеи. Большая и всеобъемлющая структура в основном имеет такие проблемы, как высокая стоимость обучения и избыточные функции.Использование koa очень удобно для тех, кто впервые использует nodejs для разработки веб-сайтов, но есть также определенные проблемы, слишком гибкое программирование, что приводит к различным методам программирования, и нет единого стандарта, а стоимость обучения между различными инженерными кодами высока.

Новичкам рекомендуется начать с koa и использовать разное промежуточное ПО для достижения разных функций, что очень полезно для понимания веб-разработки. Когда у вас будет определенное количество накоплений и опыта, вы сможете договориться о правилах программирования koa самостоятельно.Когда ваши собственные правила программирования не могут удовлетворить ваши потребности, вы можете начать с реального фреймворка.


Обратите внимание на публичный аккаунт WeChat: KnownsecFED, получайте больше качественной галантереи по коду!