AppCode под капотом

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

AppCode — это IDE для разработки под macOS и iOS с очень богатой историей и интересными технологическими решениями. В этом докладе вы узнаете, какие проблемы вас ждут, если вы решите написать свою среду разработки, как их решить, а также какие недокументированные возможности Xcode помогут вам в этом нелегком деле.

#developer #programming

What is GEEK

Buddha Community

AppCode под капотом

AppCode под капотом

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

AppCode — это IDE для разработки под macOS и iOS с очень богатой историей и интересными технологическими решениями. В этом докладе вы узнаете, какие проблемы вас ждут, если вы решите написать свою среду разработки, как их решить, а также какие недокументированные возможности Xcode помогут вам в этом нелегком деле.

#developer #programming

Wasswa  Meagan

Wasswa Meagan

1619178540

Server-side Swift in AppCode

In this short article we’ll take a look at various AppCode features that are useful for server-side Swift development, as now you can open standalone SPM projects in AppCode on macOS.

#appcode #2021 #eap #html #javascript

Как React работает под капотом?

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

Работа с непредвзятой структурой, такой как React , дает вам большую свободу, но также дает больше возможностей для ошибок. Подождите секунду… Что делать с самоуверенными и неуверенными фреймворками?

Укрощение неуверенной структуры

За время своей карьеры фронтенд-разработчика я в основном создавал пользовательские интерфейсы с двумя очень популярными фреймворками: React и Vue (оба входят в топ-10 всех проектов, размещенных на GitHub, с 181 и 192 тысячами звезд соответственно). Что меня больше всего поразило в этих фреймворках, так это гибкость и свобода в веб-разработке, которые они могли предложить.

В то время у меня также была возможность поработать с Ember.js — очень приятным фреймворком с отличной функцией Ember Data. 

Одна фраза из документации меня восхитила:

Реализация компонентов в Ember максимально приближена к спецификации веб-компонентов.

Я люблю нативные решения. Я люблю веб-компоненты и надеюсь, что однажды они станут более популярными. Но дело не в этом. Ember, как и Angular, является одним из так называемых самоуверенных фреймворков, которые дают вам множество инструкций и фундамента ценой свободы. Самоуверенная структура подобна страховочной сетке, которая снижает кривую обучения, лишая большую часть гибкости процесса. React и Vue — полная противоположность.

С большой властью приходит большая ответственность

На задней стороне дела обстоят примерно так же. У нас есть независимый фреймворк, такой как Express. С другой стороны, у нас есть Nest.js. 

Вы можете использовать оба для создания потрясающих приложений. Nest.js — отличный фреймворк, который может многое предложить. Express обеспечивает простоту и гибкость, что позволяет вам создавать… ужасный, ужасный API, если вы не используете его с умом. Это привносит в игру еще один фактор — любознательность, стремление к поиску правильного решения и знакомство со всем миром шаблонов, концепций и решений, которые может предложить отрасль.

Если есть что-то, что я хотел бы, чтобы вы вынесли из этого поста, так это: 

Создавайте вещи, экспериментируйте и получайте от них удовольствие. Учитесь на практике и загляните под капот библиотеки, которую вы используете. Таким образом, вы даже сможете взять под контроль независимый фреймворк, такой как React.

С учетом сказанного, давайте приступим!

Мой первый React-подобный «фреймворк» 

Давайте заглянем под капот библиотеки React. Практически все (и их собаки) знают основы, и этот фрагмент кода должен быть знаком всем, кто знает, что такое React. Это привет, мир React:

import React from "react";
import ReactDOM from "react-dom";

const root = document.getElementById("root");

const App = () => {
  return <div id="app">HELLO WORLD!</div>;
}

ReactDOM.render(<App />, root);

За синтаксисом JSX (расширение React для простого JavaScript) скрывается (с помощью транспилятора babel) функция createElement.

import React from "react";
import ReactDOM from "react-dom";

const root = document.getElementById("root");

const App = React.createElement("div", { id: "app" }, "HELLO WORLD!");

ReactDOM.render(App, root);

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

export function createElement(type, config, children) {
  //(...)
}

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

Реализация createElement выглядит так:

export function createElement(type, config, children) {
  const props = {};

  if (config != null) {
    for (let propName in config) {
      if (Object.hasOwn(config, propName)) {
        props[propName] = config[propName];
      }
    }
  }

  const childrenLength = arguments.length - 2;
  if (childrenLength === 1) {
    props.children = children;
  } else if (childrenLength > 1) {
    const childArray = Array(childrenLength);

    for (let i = 0; i < childrenLength; i++) {
      childArray[i] = arguments[i + 2];
    }

    props.children = childArray;
  }

  return {
    type,
    props,
  };
}

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

Последняя часть головоломки — это функция рендеринга. Это самая простая реализация, ориентированная на веб-среду:

export function render(element, container) {
  const node = createElement(element);

  setInitialDOMProperties(node, element.props);

  if (typeof element?.props?.children === "object") {
    const { children } = element.props;

    if (Array.isArray(children)) {
      children.forEach((child) => render(child, node));
    }
    render(children, node);
  }

  container.appendChild(node);
}

Сначала мы создаем элемент DOM:

export function createElement(element) {
  return document.createElement(element.type);
}

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

function setInitialDOMProperties(domElement, props) {
  for (const propKey in props) {
    if (!props.hasOwnProperty(propKey)) {
      continue;
    }

    const prop = props[propKey];
    if (propKey === CHILDREN) {
      if (typeof prop === "string" || prop === "number") {
        setTextContent(domElement, String(prop));
      }
    } else if (prop != null) {
      setValueForProperty(domElement, propKey, prop);
    }
  }
}

Для полноты приведем две вспомогательные функции:

export function setTextContent(node, text) {
  if (text) {
    let firstChild = node.firstChild;

    if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {
      firstChild.nodeValue = text;
      return;
    }
  }
  node.textContent = text;
}

function setValueForProperty(node, name, value) {
  node[name] = value;
}

Теперь осталось рекурсивно пройтись по всем дочерним элементам и смонтировать все в наш корневой элемент. И вуаля — наше первое «приложение» React!

Это смехотворно простой пример. Посмотрите на гораздо более сложный вариант от Родриго Помбо .

Что в коробке?

Это была очень наивная реализация. Это позволило нам взглянуть на React немного под другим углом, но из чего на самом деле состоит React? 

То, что мы знаем как React, на самом деле состоит из пары важнейших элементов React:

  • React — ядро,
  • визуализатор,
  • Примиритель.

Ядро

 

https://www.atlasobscura.com/articles/demon-core-that-killed-two-scientists

React включает в себя все API, необходимые для определения компонентов React. Он не зависит от платформы. Это место, где вы можете найти createElement.

Рендерер

 

https://www.myjobquote.co.uk/tradespeople/plasterers-and-renderers

Рендерер — это часть экосистемы React, отвечающая за отображение компонентов React на определенных платформах (Web, Mobile, CLI). В основе всех рендереров лежит общая логика. Эта общая часть инкапсулирована в Reconciler. Это основной алгоритм, независимый от какой-либо платформы.

Существует три официально поддерживаемых рендерера : React Dom, React Native и React Test. Кроме того, существует множество пользовательских рендереров. Чтобы узнать больше о них, ознакомьтесь с Awesome React Renderer .

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

Примиритель

В более ранних версиях React использовался так называемый Stack Reconciler. Он использовался до версии 15 React. С выходом React 16 мы получили значительно улучшенный алгоритм согласования — Fiber Reconciler .

Возможно, вы знакомы с визуальным сравнением обоих согласователей и значительным повышением производительности, предлагаемым последним?

 

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

На момент написания этой статьи у нас была последняя стабильная версия React 17.0.2. Недавно мы получили версию приложения Create React v.5.0.0 с обновленной версией Webpack. Это отличная новость, потому что я большой поклонник Module Federation, функции Webpack 5. 

Теперь новая версия React выйдет очень скоро. С версией 18 (которая находится в стадии бета-тестирования) мы, наконец, получим долгожданную стабильную версию Concurrent Mode. 

Что в этом особенного, спросите вы? Это дает нам огромный прирост производительности и является еще одним шагом вперед после перехода с Stack Reconciler на Fiber Reconciler .

Параллельный режим

Параллельный режим некоторое время был доступен в экспериментальной версии, но что это такое? 

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

Тогда я приложил некоторые усилия и создал пару демонстрационных проектов для популярного митапа The Software House — Uszanowanko Programowanko

Надеюсь, что спустя столько времени код все еще относительно свежий 😉 

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

 

https://soofka.pl/entry/react-europe-2018-summary-of-the-talks

Без изменения алгоритма согласования прерываемый асинхронный рендеринг был бы невозможен. Переключение с Stack Reconciler, где весь процесс выполнялся рекурсивно без возможности прерывания, на Fiber Reconciler, где этап рендеринга можно прервать, является фундаментальным для всех интересных функций, которые может предложить Concurrent Mode.

Стабильная, готовая к работе версия React с параллельным режимом уже не за горами. Он находится в стадии бета-тестирования с 15 ноября 2021 года. Вам следует поиграть с API параллельного режима, пока он еще находится на этом этапе. Это действительно отличная функция, которая улучшит пользовательский опыт.

Рендеринг против фазы фиксации

React — это UI-библиотека. Очень важной целью любой библиотеки пользовательского интерфейса является предоставление пользователю согласованных и предсказуемых пользовательских интерфейсов. Вот что делает приложения React действительно популярными. Чтобы гарантировать это, объектная модель документа обновляется сразу на этапе фиксации без каких-либо частично измененных элементов пользовательского интерфейса. На этапе рендеринга применяется механизм согласования (так называемый виртуальный DOM, который манипулирует реальным DOM). Вот где React делает всю тяжелую работу.

Рабочий цикл

Это рабочий цикл в React версии 17. Вся работа выполняется синхронно.

function workLoopSync() {
  while (workInProgress !== null) {
    performUnitOfWork(workInProgress);
  }
}

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

function workLoopConcurrent() {
  while (workInProgress !== null && !shouldYield()) {
    performUnitOfWork(workInProgress);
  }
}

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

function workLoop(deadline) {
  let shouldYield = false
  while (nextUnitOfWork && !shouldYield) {
    nextUnitOfWork = performUnitOfWork(nextUnitOfWork)
    shouldYield = deadline.timeRemaining() < 1
  }

  if (!nextUnitOfWork && wipRoot) {
    commitRoot()
  }

  requestIdleCallback(workLoop)
}

Пока есть какой-то модуль для работы, React находится на этапе рендеринга. Ведь это сделано и у нас есть свое переделанное дерево, все коммитится в DOM.

Метод requestIdleCallback отвечает за часть прерывания. Конечно, React не полагается на requestIdleCallback, тем более, что в некоторых браузерах эта функция не реализована (я смотрю на вас, Safari). За это отвечает специальная библиотека, называемая Scheduler. Когда дело доходит до requestIdleCallback, объект IdleDeadline передается функции обратного вызова. Он предоставляет метод проверки оставшегося времени, которое у нас есть для выполнения нашей задачи, не блокируя пользовательский интерфейс.

Дополнительное примечание — двоичная куча

Если бы вы спросили меня, что самое лучшее в работе разработчика, я бы сказал, что это возможность каждый день узнавать что-то новое. Например, когда вы просматриваете кодовую базу React и фокусируетесь на пакете Scheduler, вы можете столкнуться с реализацией двоичной кучи (точнее, min-heap):

 

Максимальная куча https://en.wikipedia.org/wiki/File:Max-Heap.svg

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

Вернуться в петлю

Давайте поработаем со структурой данных связанного списка дерева Fiber в Fiber Reconciler.

Если вы следите за выпусками в репозитории React, вы можете найти много отличных материалов, которые стоит прочитать. В частности, я настоятельно рекомендую вам прочитать Fiber Principles: Contributing To Fiber , где Sebastian Markbåge открывает очень информативный выпуск об алгоритме обхода дерева односвязного списка.

let root = fiber;
let node = fiber;
while (true) {
  // Do something with node
  if (node.child) {
    node = node.child;
    continue;
  }
  if (node === root) {
    return;
  }
  while (!node.sibling) {
    if (!node.return || node.return === root) {
      return;
    }
    node = node.return;
  }
  node = node.sibling;
}

React сохраняет текущее дерево волокон и дерево незавершенных работ . Первый отражает текущее состояние пользовательского интерфейса, представленного пользователю. Другой строится всякий раз, когда происходят какие-то изменения. Как указывалось ранее, после того, как вся эта работа выполнена (которая может быть прервана, если браузеру необходимо взять на себя управление), все отображается в DOM.

Резюме, то есть «что делает React» и «как работает React».

И это все на сегодня! За короткое время мы решили несколько вопросов.

  • Мы говорили об авторизованных и неуверенных фреймворках,
  • проанализировали реализации методов React и то, как они выглядят на чистом JavaScript,
  • взглянул на структуру React и взаимосвязь между его различными частями,
  • проверил параллельный режим,
  • изучил различные другие темы, такие как React на этапе фиксации, двоичная куча рабочего цикла или Fiber Reconciler.

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

Моя главная цель — побудить вас читать код, стараться узнавать все больше и больше об инструментах, которые вы используете, а не просто автоматически устанавливать все доступные библиотеки npm.

Учитесь и экспериментируйте. Учитесь, делая. Не так давно я помогал коллегам с настройкой Webpack для какого-то проекта React. Затем начался мой отпуск, и я не смог им помочь. Им нужно было разобраться в этом самостоятельно, и они прекрасно с этим справились, потому что узнали, как работает React.

Нет лучшего способа узнать что-то новое, чем попробовать это самостоятельно.

Ссылка: https://tsh.io/blog/how-does-react-work/

#react #reactjs #javascript

Mrinal Raj

Mrinal Raj

1603232220

Create a SwiftUI application in AppCode

Tutorial text: https://www.jetbrains.com/help/objc/create-a-swiftui-application.html
Sample project: https://github.com/JetBrains/ac_tutorial_swiftui/archive/master.zip
Link to JSON file: https://raw.githubusercontent.com/JetBrains/ac_tutorial_swiftui/master/iOSConferences/Resources/conferencesData.json

Timestamps:

  • 00:00 - Intro
  • 00:18 - Create project
  • 00:25 - Setup the interactive preview with Injection III
  • 01:39 - Create a list
  • 02:00 - Create a live template
  • 03:10 - Download the JSON file with the list data
  • 03:35 - Load data into the list
  • 04:10 - Add a detail view
  • 06:03 - Setup the navigation
  • 06:17 - Tune detail view appearance
  • 06:37 - Final result

#swift #mobile-apps #programming #developer

Mrinal Raj

Mrinal Raj

1604109973

Getting started with Git in AppCode

Getting started with Git in AppCode

In this tutorial, we will guide you through the most popular Git operations used on a daily basis and show how they can be performed from the AppCode user interface. You will learn how to create Git repositories from your projects, share them on GitHub, commit and push changes, create and merge branches, investigate the files’ history, and more.

Timestamps:

  • 00:00 - Intro
  • 00:26 - Create Git repository
  • 00:39 - Git toolwindows
  • 01:03 - Add to .gitignore
  • 01:40 - Commit
  • 01:55 - Share project on GitHub
  • 02:18 - Create new branch
  • 02:45 - Diff views
  • 04:00 - Conflict resolution
  • 04:59 - Changes history
  • 05:24 - Cherry-picking changes

Quick Start Guide: https://www.jetbrains.com/help/objc/appcode-quick-start-guide.html
Migration From Xcode: https://www.jetbrains.com/help/objc/appcode-migration-guide.html

Tutorial: https://www.jetbrains.com/help/objc/working-with-git-tutorial.html

#git #javascript #python #programming #developer