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

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

Предисловие - Кто ты?

Для тех из вас, кто понятия не имеет, кто я, позвольте мне рассказать вам немного истории. Меня зовут Том Гленн, я разработчик программного обеспечения из Эдинбурга, Шотландия. Вы можете связаться со мной в Твиттере или посетить мой GitHub, чтобы узнать, над чем я работал в последнее время.

Большую часть своей карьеры в области разработки программного обеспечения (~ 9 лет) я провел в качестве внутреннего разработчика, уделяя особое внимание стеку .NET. Конечно, я начинал, будучи чудаковатым подростком, писал простые веб-сайты на HTML с помощью Блокнота, с гораздо большим количеством мигающих абзацев и бегущих строк, чем я хотел бы признать ... и на протяжении многих лет я баловался с подобными CSS, jQuery, Angular и другими инструменты - но для всех намерений и целей я внутренний разработчик.

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

С тех пор, как я окунулся в NodeJS около года назад и изучил такие фреймворки, как Express, я обнаружил, что рискую войти в сферу интерфейсного разработчика и поиграться с, по общему признанию, устаревшими, такими вещами, как Knockout и Angular, но совсем недавно - с Vue и React.

Это исследование таких технологий, как React, привело меня к открытию чудесно загадочного мира ES6 +, транспилеров, линтеров, сборщиков пакетов и т. Д. И именно здесь я хотел бы поделиться некоторыми проблемами и разочарованиями, с которыми я столкнулся, и, надеюсь, смогу помочь некоторые из вас учатся у них и избегают их в будущем.

Транспилеры, линтеры и упаковщики - о боже!

Итак, как преимущественно back-end разработчик, я привык писать свой код в монолитной (но очень любимой… Я смотрю на вас Visual Studio ❤) IDE, нажимая Build и позволяя компилятору выполнять всю тяжелую работу по проверке что A) мой код не сломан и B) компилируется в артефакт, который можно запускать в Интернете (или на рабочем столе и т. д.).

Однако в мире NodeJS мне пришлось познакомиться с гораздо более простым набором инструментов, таких как Atom и консоль (привет cmder) для разработки и запуска моих приложений. Хотя это вызывает свой собственный набор причуд и сложностей, даже несмотря на то, что текстовые редакторы, такие как Atom, чрезвычайно расширяемы, это также делает очевидным, что моя любимая среда IDE и инструменты меня просто обманули, с компиляцией одной кнопкой, мощной отладкой и профилированием. инструменты и безумно хорошие плагины для повышения производительности, такие как ReSharper и т. д.

Здесь и возникла первая болевая точка… Транспиляция.

Что теперь сказать ?!

Транспиляция в данном случае - это термин, используемый для описания преобразования современного JavaScript (ES6 +) в JavaScript, который понимают браузеры (ES5).

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

Некоторое время я игнорировал этот ящик Пандоры. Я продолжал писать свои приложения для серверных узлов и интерфейсный код в старом добром ES5.

«Эй, работает», - подумал я ...

«Зачем это менять?»

Но все чаще я слышал от друзей и коллег такие вещи, как…

«Вам действительно нужно использовать ES6 +, если вы собираетесь серьезно заняться фронтенд-разработкой»…

«Почему?», - спрашивал я их.

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

Как оказалось, ES6 привносит в JavaScript массу потрясающих функций и синтаксического сахара, которые, в свою очередь, делают его намного проще (а ИМО более приятным) - особенно для back-end разработчиков. С ES6 теперь у вас есть доступ к таким вещам, как реальные классы и наследование, лямбда-функции и целый ряд других вещей, которые мы привыкли видеть в таких языках, как C #, Ruby и Python.

Вот в чем дело ... Вы не просто начинаете писать на ES6, и все работает. Нет-нет-нет, большинство браузеров поддерживают только версию JavaScript, известную как ES5.

Вот тут-то и пригодятся транспилеры вроде babel. Но для того, чтобы использовать babel для переноса кода ES6 + в ES5, вам нужно либо запустить babel из командной строки, либо интегрировать его в конвейер разработки, используя такой пакет, как Webpack.

«Что, черт возьми, за упаковщик?», - можете спросить вы… Да, я тоже об этом спросил.

Короче говоря, сборщик - это инструмент, который обрабатывает ваши исходные файлы и «связывает» их вместе. Как back-end разработчик вы можете думать об этом как о своего рода процессе компиляции. Он превращает множество ваших исходных файлов, как правило, в один артефакт (файл .js), который затем можно включить на свою веб-страницу.

Это тот этап обработки сборщика, который мы можем использовать в наших интересах, чтобы наш код JavaScript, написанный в синтаксисе ES6 +, мог быть преобразован в совместимый с браузером синтаксис ES5.

Практическая демонстрация

Давайте рассмотрим пример того, как вы можете использовать Webpack для транспиляции и объединения вашего JavaScript, написанного на ES6 +, в ES5, готового для включения на ваш сайт.

Прежде чем начать, убедитесь, что у вас установлены NodeJS и NPM. В этом можно убедиться, выполнив следующие команды:

$ node -v
$ npm -v

Вы должны увидеть номера версий, выводимых на вашу консоль. Если вы этого не сделаете, перейдите на nodejs.org и установите последнюю стабильную версию.

Для начала давайте создадим где-нибудь каталог:

$ mkdir webpack-demo
$ cd webpack-demo

Отсюда нам нужно инициализировать это как пакет / приложение Node, выполнив следующую команду:

$ npm init

Следуйте инструкциям здесь, дайте вашему пакету имя и некоторые другие метаданные. Вы можете просто нажать Enter несколько раз, чтобы принять значения по умолчанию. В результате создается package.json, в котором будут храниться метаданные о нашем пакете, а также о его зависимостях.

Внутри только что созданной папки создайте файл index.html, который включает следующее.

<!doctype html>
<html>
  <head>
    <title>Webpack Demo</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="app/index.js"></script>
  </body>
</html>

Мы видим, что этот файл представляет собой чрезвычайно простой файл HTML, который включает в себя единственный элемент div с именем app и ссылку на файл JavaScript, который еще не существует - не волнуйтесь, мы получим к этому позже.

Затем мы хотим создать файл JavaScript, использующий синтаксис ES6. Помните, что большинство браузеров в настоящее время не поддерживают ES6, поэтому нам нужно будет транспилировать этот файл в ES5.

Давайте создадим новую папку под названием app для нашего необработанного исходного файла.

$ mkdir app

Внутри этой папки создайте файл index.js со следующим содержимым:

import greeting from 'greeting'
class GreetingComponent {
  constructor(el) {
    el.innerText = greeting.random();
  }
}
var greetingComponent = new GreetingComponent(document.getElementById(’app’));

В этом файле используется синтаксис import ES6 для импорта библиотеки JavaScript под названием приветствие и синтаксис class для определения объекта, который мы затем можем создать. Этот простой класс берет элемент dom и вставляет в него случайное приветственное сообщение.

Теперь откройте файл index.html в браузере и откройте инструменты разработчика (F12, если вы используете Chrome).

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

Uncaught SyntaxError: Unexpected token import

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

Так что давай сделаем это!

Нам нужно будет установить несколько пакетов, поэтому откройте консоль и введите следующее:

$ npm install babel-core babel-loader babel-preset-env webpack --save-dev

а также:

$ npm install greeting --save

«Вау! Что это такое ?! », - спросите вы.

Без паники. Что мы сделали, так это установили инструмент транспиляции Babel и обладатель награды «Bundler of Choice Award 2017» - Webpack. Да, еще мы установили пакет приветствие, на который мы ссылались ранее.

Затем нам нужно создать файл конфигурации, который сообщает Webpack, что делать.

В корне папки проекта создайте файл с именем webpack.config.js и введите следующее:

module.exports = {
  entry: './app/index.js',
  output: {
    filename: './dist/bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /(node_modules)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['env']
          }
        }
      }
    ]
  }
};

Давайте быстро разберем этот файл.

Прежде всего, мы определяем точку входа в наше приложение. Это необработанный исходный файл, который Webpack должен использовать для начала процесса сборки. Он просмотрит этот файл и создаст дерево зависимостей на основе импорта, а затем объединит все необходимые ресурсы. В нашем случае это должен быть созданный нами файл app / index.js.

Затем мы определяем выходной путь для связанного артефакта, который создаст Webpack. Здесь мы определяем это как dist / bundle.js.

Следующая часть выглядит довольно сложной, но на самом деле все, что мы делаем, это говорим webpack запустить модуль, который просматривает все файлы .js (за исключением файлов в папке node_modules) и переносит их в ES5 с помощью пакета babel-loader, который мы установили ранее с использованием пресета babel-preset-env (вы можете прочитать о том, что делает этот пресет здесь).

Затем нам нужно перейти в наш файл package.json и определить скрипт, который позволит нам запустить эту сборку Webpack.

В разделе скрипты добавьте следующую строку:

"build": "webpack"

Затем снова откройте файл index.html и измените источник тега скрипта на пакет, который мы собираемся создать.

<script src="dist/bundle.js"></script>

Наконец, в консоли запустите только что определенный сценарий build.

$ npm run build

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

Time: 593ms
Asset     Size  Chunks             Chunk Names
./dist/bundle.js  4.43 kB       0  [emitted]  main

Последний шаг - снова открыть вашу веб-страницу в браузере. На этот раз вы не должны увидеть ошибок в консоли, а вместо этого увидите красивое приветственное сообщение в окне браузера.

Если вы откроете /dist/bundle.js, вы увидите, что ваш исходный исходный файл был полностью преобразован с множеством загадочно выглядящих определений модулей и других элементов, которые я даже не буду делать вид, что понимаю. Это результат ES5 нашего сценария со всеми необходимыми зависимостями, объединенными в один файл.

Поздравляем, вы только что успешно скомпилировали и скомпилировали приложение ES6!

Идите и свяжите!

Теперь, когда вы покорили мистический мир ES6, вы можете свободно исследовать огромное количество библиотек, фреймворков, пакетов и инструментов JavaScript с уверенностью, что в следующий раз, когда кто-то упомянет ES6, транспиляторы или бандлеры, вы знаете, что они о чем говорят!

Я настоятельно рекомендую вам ознакомиться с некоторыми популярными интерфейсными фреймворками, такими как Vue и React.

Если вам понравился этот пост или он был полезен, дайте мне знать через Twitter или оставьте комментарий.

Спасибо за чтение!