Как играть в код в новую эру парного программирования

программист JavaScript

Давно не писал статьи, и заголовок немного раздулся.

Угадай, что я пытаюсь сказать

Я хочу написать короткую заметку о парном программировании. недавно сS(Красивое имя цветка) В свободное время я занимался парным программированием. Теперь я собираюсь поделиться с вами некоторыми мыслями о парном программировании, так что давайте начнем.

PS:Эта статья, не вдаваясь в детали, сосредоточится на общих выводах, надеясь быть полезной для всех вас.

Почему в новую эру это называется парным программированием?

Здесь я объясню, почему, пожалуйста, прочитайте ниже.

традиционное парное программирование

Определение Википедии выглядит следующим образом:

Парное программирование — это метод гибкой разработки программного обеспечения, при котором два программиста работают вместе на компьютере. Один человек вводит код, а другой просматривает каждую строку кода, которую он вводит. Человек, который вводит код, называется водителем, а человек, который просматривает код, называется наблюдателем (или навигатором). Два программиста часто меняются ролями. При парном программировании наблюдатели одновременно рассматривают стратегическое направление работы, предлагая улучшения или проблемы, которые могут возникнуть в будущем для решения. Это позволяет водителю полностью сконцентрироваться на «тактических» аспектах стоящей перед ним задачи. Наблюдатели служат страховочными сетками и проводниками. Парное программирование имеет много преимуществ для разработки программ. Например, повышение дисциплины, написание лучшего кода и т. д. Парное программирование является частью экстремального программирования.

Почему я считаю его устаревшим?Послушайте меня вкратце(ху) проанализируйте(пост):

Два человека делят компьютер, что может бытьACMсоревнование или командаPKобщий в. Но для развития бизнеса это немного ненаучно, и во-первых, эффективность невысока: если код собеседника слишком милый, он может не устоять и не ударить его. Конечно, он будет появляться и в особых ситуациях, но95%В сценарии невозможно иметь сценарий, показанный ниже.

Следующая сцена похожа на летящий снег в июне:

Тем не менее, этот сценарий более чем счастлив принять:

Конечно, не спрашивайте меня, почему, потому что:

Итак, что я думаю о парном программировании новой эры?

Парное программирование для новой эры

Я думаю, парное программирование в новую эпоху должно быть таким:

два(N) индивидуальныйcoder, два(N) комп, посидим вместе (впоследствии может и не надо будет сидеть вместе) для развития. Коды могут видеть друг друга. Наиболее важным моментом является то, что мы можем видеть друг друга и понимать код друг друга.

Что такое сознание?Приведу пример:

я иSприйти к мнению,SБыть ответственным заnode, то есть back-end, я отвечаю за front-end, а front-end и back-end разделены. Тогда мы можем видеть код друг друга, и мы все знаем, какую функцию разрабатывать, я могуreview Sкод,Sтакже можетreviewмой код. При разработке я могу пройтиreview Sкод, знай заранееSлогика интерфейса. Если я решу, что у него проблемы с написанием логики, я свяжусь с ним и заранее разберусь с возможными сомнениями. Так же зарезервирую логическую обработку запроса по заранее написанному им интерфейсу. Короче, в парном программировании я так понимаю. Это должна быть одна и та же способность, один и тот же код через друг друга.reviewКод функции другой стороны, чтобы сравнить их собственный код. Таким образом, другая сторона может быть проинформирована о возможных проблемах, и решение таких проблем значительно повысит эффективность разработки и решит некоторые потенциальные проблемы раньше.

PS:Конечно, этот новый метод требует определенной технической базы, например, вы должны уметь понимать внутренний код. Ну, если этоJava, вам может быть труднее. Конечно, он также будет жестче. Так ещеnodeДафа хороший, руки веселые. Короче говоря, это то, что я считаю парным программированием в новую эпоху, оно не универсально, и, конечно, преимущества этой формы очевидны.

Запой перед парным программированием?

Эм? По традиции, конечно же, проводится предспаривание. пошел туда1912, хорошо поели и наслаждались японским обслуживанием. Тогда идите в кафе, чтобы начатьface to face talking, вот-вот начнется счастливое парное программирование.

Как играть с цветами?

Я разделил его на две части, чтобы представить, первая часть — это передняя часть, а вторая часть — задняя часть.

внешний интерфейс

Выбор технической архитектуры

В первую очередь подбор каркаса, после замеров выбор.Vue. Здесь у меня нет мнения о том, какой фреймворк использовать, единственное мнение:

Согласно реальной ситуации, чтобы выбрать соответствующую структуру развития, тем самым повышая общую эффективность развития.

Независимо от того, использовать ли строительные леса, я также придерживаюсь приведенного выше предложения и делаю соответствующий выбор в соответствии с реальной ситуацией. Здесь я выбираюVue-cli3для быстрого создания приложений. Как его использовать, вы узнаете, изучив его самостоятельно.

Здесь можно указать несколько путей

Первый путь: перейти кcli.vuejs.org/Исследование официального сайта

Второй путь: иди и смотриvue-cli3Исходный код , чтобы понять некоторые внутренние механизмы, такие какchainWebpackреализация,vue.config.jsКак реализованы настройки по умолчанию.

Третий путь: перейти кgithubнайди немногоvue-cli3построенный проект,cloneСходите и изучите, как его используют другие.

PS:Лично я не считаю скаффолдинг технически сложным.Просто посмотрите документацию.Если не работает,идите к исходникам и возитесь с ним.Это почти то же самое.

Выбор стилевой схемы

После выбора технической основы давайте взглянем на выбор стилей, общая схема стилей и отраслевые стандарты в основном одинаковы. Но что касается того, где размещать стили в компонентах, в настоящее время в отрасли, вероятно, существует два типа.

Разделение каталогов стилей и компонентов

Каталоги стилей и компонентов разделены, что в настоящее время очень много.uiПуть библиотеки. Напримерiview elementui, я покажу вам скриншот.

как показано на рисункеiviewСкриншот:

Как видно из рисунка выше, все стили компонентов размещеныstyleкаталог и с помощьюless.

Каталоги стилей и компонентов не разделены

Говоря об этом, нынешний представитель, вероятно,ant-design.

как показано на рисункеant-designСкриншот:

Мы можем видеть это вant-design, стиль компонента помещается в директорию компонента, а также используетсяless.

Какой стиль использовать для письма

Что касается того, какой стиль использовать. Для того, чтобы играть с цветами, я использую одновременно три стиля:scss less stylus. В процессе я предпочитаюstylus, потому что он похож наpythonОтступ простой и быстрый. В одном не нужно писать точку с запятой, во втором не нужно писать круглые скобки, а в третьем не нужно писать двоеточие. если ты виделvue-cli3исходный код, вы найдетеuiраздел, стиль используетstylus.

vue-cli3в исходном кодеuiДеталь показана на рисунке:

Суммировать

Что касается выбора стилевой схемы, то я хочу выразить следующее:

Что касается стиля обработки компонентов, в отрасли существует два стандарта, нет хороших или плохих, но нам нужно знать эти стандарты, и, зная эти стандарты, мы можем предоставить некоторые рекомендации и помощь в нашей собственной практике.

Я использую:

Схема, в которой стили и каталоги компонентов не разделены, при этом для написания стилей используются три стиля.stylus.

Об управлении состоянием

В отрасли много государственного управления,vuex,redux,mobx,dvaи т.п. Цель ясна:Инкапсулируйте хаос с помощью абстракции.

Для себя я подумаю над вопросом, действительно ли этот проект нуждаетсяvuex, для того, чтобы поиграть с цветами, обработка, которую я сделал, это:

Отрежьте две ветки, одна не используетсяvuex, используетсяvuex.

когда использоватьvuex

Когда компоненту нужно поделиться некоторыми данными, а данных много, его можно использоватьvuex. Если данные не нуждаются в совместном использовании или их меньше, нет необходимости использоватьvuex.

Две формы vuex

использоватьvuexКогда не так много состояний, которыми нужно управлять, их можно напрямую записать в файл. Если есть много состояний, которые необходимо обработать, используйтеmoduleписьма. Классифицируйте состояния по разнымmodule.

Обработка запросов

Что касается запросов, то здесь я делаю максимально возможное извлечение части запроса и резервирую питы, которые могут появиться в будущем. Например, зарезервировать перехват запросов, зарезервировать для шифрования запросов, зарезервировать общедоступные параметры и зарезервировать ямы для смоделированных данных.

Обычно я делю эту часть логики на три категории. одинStateService,одинApiService,одинService. Конечно, если сервисов слишком много, можноServiceподразделять, напримерUploadService,MonitorServiceЖдать.

О данных моделирования

Когда дело доходит до смоделированных данных, вашей первой реакцией может быть использованиеeasy-mock,использоватьrapЖдать. Со своей стороны я выбрал практику, о которой мало кто знает, то есть симуляцию данных через декораторы.

Какое сознание? я кратко представлю

как показано на рисунке:

Как вы можете увидеть с картинки выше, яServiceсерединаgetuserinfoОсуществляется перехват декорации, и в нее через декоратор вводятся смоделированные данные. Затем используйте оценку среды, чтобы убедиться, что этот метод декоратора не работает в производственной среде.

Хоть и будет пахнуть хакерским кодом, но после того, как вы его действительно попробуете, вы почувствуете всю прелесть использования декораторов для решения симуляции данных, ведь вы можете управлять всей логикой запросов как угодно. Чтобы добиться моделирования всего внешнего процесса, вообще не полагаясь на внутренний интерфейс.

Об инструментальном методе

Для этого нам нужно подумать о том, нужно ли этому проекту полагаться на некоторые библиотеки инструментов, такие какlodash,ramda. Если вы не полагаетесь на него, то напишите его изначально.

Инструментальные методы я тоже разделю на категории, разделю на внутренние методы и внешние методы. Если он предназначен только для использования другим методом и не будет подвергаться воздействию бизнеса, то я буду рассматривать его как внутренний метод.

О производительности

Это банальная вещь, и я вообще делю производительность на два аспекта.

Что могут сделать строительные леса

  1. Отдельные пакеты зависимостей от бизнес-кода
  2. правильноjs cssи т.д. сжимать, это правильно?cssразделять
  3. Сжать ли изображение, преобразовать ли маленькое изображение вbase64
  4. Решите, использовать ли его в зависимости от деловой ситуацииcdn
  5. третьим лицамuiБиблиотеки для обработки производительности, такие как пост-компиляция
  6. Общайтесь с серверной частью, чтобы решить, открывать лиgzip

Что строительные леса не могут сделать

О сжатии изображений

несмотря на то чтоwebpackСжатие изображения есть, но судя по сравнению, качество и эффект от его сжатия все же неtinypngОтлично, если вы не знаетеtinypng, вы можете нажатьtinypng.com/провестиTP.

tinypngАлгоритм сжатия не является открытым исходным кодом, хотя его можно использовать бесплатно, но будут некоторые ограничения.githubбыл специально разработан компаниейtinypng for mac. Маленькие партнеры сами в этом разберутся, инструмент все равно очень полезен. Вы можете заменить файл в исходном месте, и сжатое изображение практически не потеряется.

GitHub.com/Боже сонный/крошечный…

Повышение производительности на уровне кода

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

Об асинхронных ожиданиях и промисах

Я упомяну об этом. В проекте, как мы его используем гибкоasync awaitа такжеpromise, во-первых, чтобы быть ясным, его нельзя использовать ради использования. Здесь я высказываю свое личное мнение, вот несколько сценариев использования обоих.

  1. когда вы хотите использоватьtry catchПри отлове исключений асинхронных операций
  2. Когда вы хотите вложить асинхронное действие в другое асинхронное действие
  3. Когда вы хотите обернуть функцию какpromiseкогда

Я просто привожу пример, следующий код:

fn(res => {
  // TODO:
})

На картинке вышеfnявляется асинхронной операцией, и в ней выполняется функция обратного вызова. Теперь есть два вопроса:

  1. Если мы хотимfnсталиpromiseШерстяная ткань?
  2. Что, если мы хотим продолжить выполнение других асинхронных операций в функции обратного вызова?

Ввиду двух вышеуказанных проблем, давайте решим их одну за другой.

Для решения первой проблемы:

Сначала ставим асинхронную операциюfnсталиpromiseформа, очень простая.

Примерный код выглядит следующим образом:

function wrap() {
  return new Promise((resolve, reject) => {
    fn(res => {
      resolve()
    })
  })
}

Для решения второй проблемы:

еслиfnВ функции обратного вызова также требуются асинхронные операции, так как же элегантно решить эту проблему? использовать это времяasync await.

Примерный код выглядит следующим образом:

function wrap() {
  return new Promise(async (resolve, reject) => {
    try {
      fn( async res => {
        let result = await fn2()
      })
    }catch(err) {
      // TODO:
    }
  })
}

Вы обнаружили, что код является синхронным и может использоватьсяtry catch. Что ж, это так просто и естественно.

Об анимационных переходах

Мы знаем, что взаимодействие должно быть дружелюбным и не слишком жестким, а прыжок должен быть плавным. Поэтому на некоторых страницах используйтеgsap, Для тех, кто не знает, можете проверить информацию.

Краткий код выглядит следующим образом:

// 只用到了 TweenLite 、TimelineLite 两个方法
import { TweenLite, TimelineLite } from 'gsap'
let tw = new TimelineLite()
tw.add(TweenLite.to(this.style.blocks[0], 0.5, { opacity: 1, delay: 0.5 }))
tw.add(TweenLite.to(this.style.blocks[2], 0.5, { opacity: 1 }), '-=0.3')

Плавность подключения достигается за счет настройки стиля.

О загрузочном компоненте

Мы развиваем WeChatH5Тмолл ТаобаоH5, при разработке быстрых приложений, разработке небольших программ и т.д.loadingЭто произведение нужно сделать. Например, когда начинается запрос,loadingВ начале пользователь не может выполнять другие операции, когда запрос заканчивается или является ненормальным,loadingконец.

Затем перед лицом третьего лицаuiбиблиотека илиAPPКогда мы приходим с реализацией, как мы выбираем, использовать ли готовую или написать ту, которая нам больше подходит?

Мое личное мнение - написать от руки то, что тебе подходит.loading. Причина этого, которую я могу обобщить на высоком уровне, заключается в следующем:Унифицированный и гибкий.

PS:Конечно, это не абсолютно. Просто предложите идею, например, WeChatH5, Торговый центрH5, не используйте свои собственныеloading, используя тот жеloadingкомпоненты.

Об эффекте начального экрана

Есть много способов открыть экран, например, с помощьюvue-touchчтобы завершить операцию прокрутки вниз.

Общий эффект таковgifкартина:

После того, как это сделано, это не чувствует себя достаточно прохладно. Поэтому ее усовершенствовали, и была реализована вторая схема, использующая кадры последовательности для завершения спецэффектов открытия экрана.

Что такое кадр последовательности?

Кадры последовательности создаются путем разложения видео на кадр за кадром. затем пройтиcanvasОн рисуется по определенному временному интервалу, чтобы пользователь чувствовал, что это серия картинок со спецэффектами. можно представить какPPTэффект вспышки.

Поскольку вам нужны последовательные кадры, вам нужен индикатор загрузки. Индикатор выполнения может быть инкапсулирован в компонент.Идея состоит в том, чтобы установить процент в зависимости от хода загрузки данных и одновременно установить некоторые анимационные эффекты.

Общий эффект таковgifкартина:

Как видно из вышеизложенного, когдаgodkun: 源码终结者Когда отображение завершено, т. е. индикатор выполнения достигает100%когда. Указывает, что данные, требуемые кадром последовательности, загружены.

О композитинге изображений

Нужно обмениваться картинками, если передать на бэкенд, то нагрузка на бэкенд увеличится из-за большого количества картинок, которые нужно синтезировать. После консультации было решено синтезировать на переднем конце черезcanvasбудущее10Картинка синтезируется в общую картинку, и здесь не так много моментов, на которые следует обращать внимание. Следует отметить, что на картинкеonloadНарисуйте снова в обратном вызове события.

Примерный код выглядит следующим образом:

async drawCanvas() {
  let canvas = this.$refs.myCanvas
  canvas.width = xxx
  canvas.height = xxx
  let bg = await this.drawBg()
  this.drawImage(bg) // 不变
  // TODO: 绘制其他
  let data = canvas.toDataURL('image/jpeg')
  const params = {
    base64: data
  }
  let result = await Server.getImage(params)
  this.$refs.canvasImg.setAttribute('src', result)
}

PS:Здесь есть яма, ее нельзя сохранить на телефонах Android.srcдляbase64, пройдя через карьер, решил пройтиbase64Данные отправляются на сервер, а затем возвращаютсяpngадрес, чтобы решить эту яму.

О закопанных точках

Похороненная цель состоит в том, чтобы собрать все виды информации, напримерPV,UV, CTR, исключения. Итак, как сделать точку захоронения, общую переднюю точку захоронения, я думаю, нужно следовать двум пунктам:

Первый пункт: не перегружайте код, также известный как жесткое кодирование.

Второй момент: добиться многоразовости, то есть провести унифицированную инкапсуляцию

Например, переименуйте соответствующую скрытую точку, напримерb1 b2 b3.

Грубый код выглядит следующим образом, просто и грубо:

burryDetail ={
  b1: {
    actionName: 'gotohome'
  }
}

export default function burry(key) {
  let burryObject = burryDetail[key]
  // TODO: args
  let argN = burryObject.actionName
  send(...args, argN)
}

Преимущество этого в том, что все скрытые точки помещаются в один файл для централизованной обработки, а не прописываются напрямую в бизнес-коде, что способствует разделению. Для некоторых особых случаев, которые необходимо прописать в бизнес-коде, следует применять особый подход.

О режиме работы

Говоря о режимах работы, можно думать о режиме разработки, режиме производства и даже режиме анализа. Сейчас я вvue-cli3, и настройте его в соответствии с предписанным методом. например новый.env.dev .env.prd .env.xxxдокумент

следующим образом.env.devКод:

NODE_ENV = "development"
VUE_APP_BASE_URL = "xxxxxxxxxxxx"

затем вscriptsнаписать в

"dev": "vue-cli-service serve --mode dev",

ты можешь пройтиnpm run devзапустить режим разработки.

О третьих лицахsdkподсказки кода

Иногда вы обнаружите, что введениеsdkПосле этого подсказки по коду нет. Затем я искал в Интернете и не смог найти официальное решение, что мне делать в это время?

Очевидно, что вы можете написать файл объявления только самостоятельно, вот дляVSCODEНапример, стандартный способ — создать каталог нового типа, а затем создать новыйsdk.d.ts.

Код примерно такой:

declare namespace SDK {
  function fn1(callback: () => void): void
  function fn2(text: String): void
  function fn3(): void
  function fn4(
    object: {
      arg1: String
      arg2: String
      arg3: String
      arg4: String
    },
    callback: (res: {}) => void
  ): void
}

этот кусок в соответствии с конкретнымSDKПросто напишите нужную вам подсказку.

задняя часть

серверная частьSнаписано, поэтому я получаюcode reviewПоговорим об общем положении бэкенда в виде.

что делать в бэкенде

Есть примерно следующие моменты:

  1. записыватьAPIинтерфейс
  2. написать фоновое управление
  3. Напишите другие вспомогательные функции
  4. База данных проектов
  5. xxxx...

Выбор бэкэнд-фреймворка

используется здесьegg.js, который использует согласованную философию для быстрого создания приложений и повышения эффективности разработки.eggЕсть много учебных документов, пожалуйста, разместите адрес официального сайта:

Яйцо js.org/ это - в / вступление ...

Как писать интерфейсы

Об этом и говорить нечего.Он перехватывается роутингом и затем передается в соответствующую логическую обработку.Возможно, мидлвар нужно будет обрабатывать в середине.

Как централизованно обрабатывать ответы

Как лучше спроектировать возврат, практика здесь заключается в том, чтобы инкапсулировать возврат какplugin, а затем расширить доcontextначальство. Таким образом, вы можете пройтиctx.sendresultРавномерно обрабатывать возвращаемый контент.

Использование промежуточного программного обеспечения

Чего не скажешь о промежуточном программном обеспечении, которое по сути является экспортируемой функцией. Он используется для обработки полученных данных и выполнения соответствующей обработки данных.

В основном есть два результата обработки данных:

  1. Первая концовка: перейти к следующему шагу
  2. Вторая концовка: в этом мидлвареgame over

Возьмите реальную сцену:

Например, наиболее распространенным является аутентификация. Мы можем управлять им в маршрутизации:

код показывает, как показано ниже:

router.post('/api/xxx', auth(), controller.xxx);

При обработке запроса на ограниченный интерфейс сначалаauthЕсли обработка завершается неудачно, последующая логическая обработка прерывается, и непосредственно возвращается содержимое ответа, такое как отсутствие входа в систему или отсутствие авторизации.

узлаMVCи передняя частьMV*

V

Здесь я кратко упомяну, что вnodeслой, так и на переднем уровне, которыйVВсе могут понять, все они осознают воззрение,nodeслоя, но и для записи страниц, например, мы пишем404страница с промежуточным программным обеспечением, которое обрабатывает исключения. Если промежуточное ПО ловит404, затем вернитесь напрямую404страницу на передний план.

C

CВ передней части это на самом деле самая разнообразная точка, поэтому я добавил*Выражать.CправильноnodeС точки зрения времени, время также является наиболее важной частью.Оно специально обрабатывает полученные запросы и распределяет их по каждому логическому центру обработки.Наконец, через серию обработок, а затем черезCСлой возвращается на передний конец.

M

MправильноnodeЭто очень просто, при обработке логики вам нужно взаимодействовать с базой данных, чтобы добитьсяCRUDДля реализации добавления, удаления и модификации данных.MДля фронтенда тоже все очень просто, правильноVданные слояCRUD. передний и заднийMСлои немного разные.

Подводя итог, задняя частьMVCКажется, что он более продвинутый, чем переднийMVCПростой для понимания интерфейсMVCЭто как будто была насильно устроена волна.

Внешняя конфигурация и внутренняя конфигурация

Благодаря постоянному совершенствованию фронтенд-инжиниринга, конфигурация фронтенда и конфигурация бэкэнда в основном одинаковы, поэтому я не буду упоминать об этом здесь.

О базе данных

упоминалось выше, используйтеmysql, конечно нравитсяegg-sequelize mysql2Все это используется. Определение модели обычно находится вmodelВ каталоге определите модель, а затем повесьте наApplicationвниз, черезapp.model.xxxчтобы получить контекст соответствующей модели. Обработку модели обычно проводят вserviceПод содержанием.

О публичном пути

В большинстве случаев после того, как front-end проект упакован, он помещается в back-end.publicкаталог, поэтому, когда вы увидите это, ваши друзья должны понять, что в инструменте сборкиpublicPathЧто это (вручную смешно).

Суммировать

Прочитав внутреннюю часть, вы обнаружили, что она тоже очень проста, весь кодjs, Как написать бизнес-логику во внешнем интерфейсе и как написать бизнес-логику в бэкэнде.

Основное различие между ними заключается в том, что переднюю и заднюю части нужно рассматривать по-разному.

Серверная часть должна учитывать безопасность, учитывать нагрузку сервера, учитывать дизайн интерфейса и дизайн базы данных. Конечно, на высоком уровне также следует учитывать балансировку нагрузки, высокий параллелизм и т. д. Внешний интерфейс должен учитывать эстетику страницы, беглость страницы, удобство взаимодействия с пользователем, скорость открытия страницы и так далее. Словом, не всем легко, только держась за руку ребенка, мы можем состариться вместе с ребенком. (вручную смешно+2 )

Завершить сводку

После прочтения я чувствую, что это не имеет ничего общего с парным программированием?Я тоже почувствовал это после прочтения.

написал6000Слово, что я представляю.

Шучу, шучу, на самом деле эта статья имеет сильную связь с парным программированием.Этот процесс - дело меня иSзавершены вместе.

Диаграмма ниже отражает весь процесс.

Ведь мы можем говорить не только о парном программировании, но и о других вещах.

Я думаю, что прелесть парного программирования в том, что вы можете:

Обратная связь друг с другом и внесение своевременных корректировок для совместного повышения эффективности разработки. Конечно, самое главное уметь задействовать (вы говорите) на основе (чего?)

Примечание

  • Дополнительная часть от 1 мая, написанная немного наспех, чтобы зафиксировать недавний опыт парного программирования.
  • Игра с цветами на самом деле может быть понята из текста, например, три набора стилей, два набора управления состоянием, декораторы для решения моделирования данных, кадры последовательности для решения открытия экрана, в реальном времениreviewБэкенд-код, написание логики фронтенд-запросов в соответствии с бэкэнд-кодом и т. д. кажутся немного затратными.
  • Статья неизбежно неверна, пожалуйста, потерпите меня, добро пожаловать, чтобы указать на ошибки в комментариях и больше общаться

Ссылаться на

Некоторые другие мои статьи из цикла

общаться с

Серия технических статей Nuggets резюмируется следующим образом: если вы считаете, что это хорошо, нажмите на звездочку, чтобы поощрить это.

github.com/godkun/blog

Я терминатор исходного кода, и обмен технической информацией приветствуется.

также может войтиГруппа звукозаписи Front-end RhapsodyПроведите мозговой штурм вместе. Если вы хотите добавить, потому что она заполнена, вы можете сначала добавить меня в друзья, и я приглашу вас присоединиться к группе.

Язык ветра

Завтра будет Первомай.Я поздравляю своих друзей с Первомаем.Меня не волнует ваше благополучие, я просто хочу, чтобы вы были счастливы!

Напоследок: уважайте оригинальность, самый богатый человек, укажите источник для перепечатки 😋