предисловие
Я давно не обновлял статью.Я только недавно запустил стек технологий React и несколько новых проектов компании.Некоторые из них не могут найти время.Некоторые проекты с открытым исходным кодом, в которых я участвовал, перестали обновляться, и статья снята с производства в течение длительного времени. , Моя статья предназначена для некоторых мелких партнеров, которые нуждаются в продвижении или продвигаются. Хотя моя статья не обязательно полезна, она может указать вам направление. Направление для размышлений.
Большинство идей в сообществе уже готовы к использованию. Я видел некоторые面试文章Есть даже ошибки в содержании, а некоторые анализы полупоняты. Благодаря этому стеку технологий передачи (vue & react) Я понимаю некоторые привычки, вызванные мягким знанием, такие как自我思考能力,项目拆分能力,驱动学习能力 и т.п.
Настоящее продвижение, в моем понимании, это сломать舒适圈, ломайте барьеры, думайте и исследуйте неизвестное, когда вы медленно осваиваете неизвестное, продолжаете искать барьеры и продолжаете разрушать барьеры, тогда вы квалифицированный инженер.
Зачем писать API
Я верю в2020Сегодня большинство фронтендов находятся в собственных проектах, разделив интерфейс как на самостоятельный модуль, так и вview, вам нужно только сделать асинхронный вызов, чтобы захватить后台数据 а также异常信息.
Преимущество разделения компонентов заключается в том, что нам легко управлять.Когда интерфейс настраивается в фоновом режиме, нам нужно только перейти к соответствующему модулю, чтобы изменить информацию о конфигурации, вместо того, чтобы сначала искать страницу, ища метод запроса интерфейса.
Я думаю, что информация о запросе не должна быть написана вместе в компоненте. QAQ
текст
Итак, позвольте мне рассказать вам об одномapiУправление им является чисто личным резюме.Если у вас есть какие-либо предложения, вы можете оставить сообщение в области комментариев для обсуждения и обмена.
Основная идея
обратиться к
约定式форма, дляapiВсе файлы в каталоге имеют имена с**.api.jsфайл, я по умолчаниюAPI的模块 ,Например
- src
-- api
---- user.api.js
---- featrue.api.js
---- index.js
В данном случае это относительно хорошее состояние. Будь то новый разработчик или уже работающий разработчик, вы можетеapiНиже приведена каноническая схема. Затем, в конце концов, вам нужно только изменить соответствующий модульAPI接口Канонический экспорт в порядке.
/// @api user.api.js
export default {
getUserAuth: 'GET /api/user/auth',
postUser: 'POST /api/user',
putUser: 'PUT /api/user/:id',
deleteUser: 'DELETE /api/user/:id',
}
производящая функция
наконец всеAPI规范式будет сгенерирован как функция, подобная следующей
function request () {
return network({
// ...... axios参数
})
}
Как производить?
В канонической форме свойства производного объекта таковы:keyВ конечном итоге будет проанализировано в функцию запросаkey, и значение обрезается, и окончательное отображение становитсяurl,method. Пока сгенерирован базовый параметр конфигурации.На самом деле эта функция тоже очень проста.generateSyncRequestMethodОсновная цель метода — функционализировать обернутый модуль и сделать промежуточную модель.
const generateSyncRequestMethod = module => {
const result = {};
for (const key in module) {
const [method, url] = module[key].split(' ')
result[key] = (options = {}) => {
console.log('... 函数内部体系')
}
}
return result
}
RESTful канонический
дляRESTfulВ случае использования соглашения должна быть коммуникация между интерфейсом и сервером.Это взаимодействие является фиксированным процессом.Для спецификации интерфейса, начиная сA项目 => B项目С точки зрения этой спецификации интерфейса, этоTeamОсновная спецификация , как неподвижного состояния. Поэтому эту нормативную задачу нужно выполнять по форме команды, поэтому она только для справки. Делайте это в соответствии с нормами вашей команды.
использовать:GET /api/model/:id, используя эту каноническую формулу, параметры, которые вы передаете в метод запроса, должны иметь определенные ограничения. Первый вoptionВ атрибут нужно передать соответствующий объявленный в интерфейсе спецификации:值В качестве ограничения оба должны быть равны.
Во-вторых, для параметров, как мы все знаем, есть примерно два распространенных метода запроса, один из нихdataв виде , часто встречается вPOST PUT ,а такжеGetметод, этоparams, поэтому сделана каноническая форма.Атрибуты параметров запроса динамически и гибко задаются разработчиком, а не архитектурой. Позвольте его гибкости иметь хороший комфорт, отпуская при этом немного гибкости.
request({ id: 1, data: {} })
for (const rest in options) {
if (url.includes(`:${rest}`)) {
url = url.replace(new RegExp(`:${rest}`), options[rest]);
delete options[rest];
console.log(url, options);
}
}
return network({
url,
method,
...options,
});
преимущество
- Согласованное руководство, разработчики не должны писать повторный код
- Гибкость, настройка параметров может быть выполнена с помощью бэкенда, параметры могут быть переданы во время разработки и синхронизированы с конфигурацией запроса.
- Синхронный макет для некоторых соглашений
Mockинтерфейс, та же конфигурация
недостаток
- Синтаксический анализ соглашений об интерфейсе требует потребления производительности.
- Создание интерфейсных функций, требующих потребления производительности.
- метод функции имеет ограничения
В конце концов, после того, как интерфейс будет доведен до совершенства в ранней производственной среде, он будет независимо упакован в
chunkфайл, кешированный
полный код
Время поджимает, поэтому TypeScript еще не написан, и я восполню это, когда у меня будет время в будущем.
// @api index.js
import network from '@/utils/network'
const PATH = './'
const ISDEEP = false
const REG = /.api.js$/
const MODE = ' sync'
const apiFiles = require.context(PATH, ISDEEP, REG, MODE)
const generateSyncRequestMethod = module => {
const result = {};
for (const key in module) {
const [method, url] = module[key].split(' ')
result[key] = (options = {}) => {
for (const rest in options) {
if (url.includes(`:${ rest }`)) {
url = url.replace(new RegExp(`:${ rest }`), options[rest])
delete options[rest]
} else {
continue
}
}
return network({
url,
method,
...options
})
}
}
return result
}
let apiResult = {}
apiFiles.keys().forEach(element => {
apiResult = {
...generateSyncRequestMethod(apiFiles(element).default)
}
})
export default apiResult
позже
Если есть хороший метод оптимизации, я могу обсудить его ниже, я также перечислил некоторые преимущества и недостатки, а также я думаю о некоторых более глубоких вещах, чтобы уменьшить внимание разработчиков к логике API за разумные деньги.apiсправляться. Это тоже моя первая статья в сентябре.Я просто сменил работу и я тоже меняю стек технологий, и он будет выводиться медленно.ReactСтатьи по Теме.
Голубь слишком долго и есть некоторая вина. Медленно корректируйте состояние, цель следующего года - 6. Недавно я купил эту книгу по структуре данных, чтобы изучить и дополнить основы.