Новая спецификация JavaScript принесет некоторые новые интересные функции и исправит существующие обходные пути. Однако может быть сложно начать использовать эти вещи, когда у вас уже есть приложение React, или даже когда вы хотите создать новое приложение.
В этой статье мы расскажем, как создать новое приложение React, добавить в него поддержку ES2020 и кратко рассмотрим некоторые новые доступные функции.
Создание нового проекта React
Есть несколько способов начать новый проект React. Все свои проекты я всегда начинаю с create-react-app.
npx create-react-app es2020-app cd es2020-app
Приложение готово к развертыванию, набрав команду yarn start или npm start.
Установка плагинов ES2020
Спецификации JavaScript, такие как ES6 и ES2020, поддерживаются в браузерах с помощью компилятора Babel. Babel конвертирует весь новый код в совместимый с браузером JavaScript. В Babel есть множество различных плагинов, расширяющих базовый набор функций. На данный момент возможности ES2020 реализованы набором плагинов, которые мы собираемся установить.
В вашем недавно созданном проекте React уже установлен Babel, однако не так очевидно, как добавить в него дополнительные плагины. Один из способов добиться этого - установить пакет под названием rewire-your-app вместе с customize-cra.
Для нашего только что созданного приложения React мы собираемся установить эти пакеты:
npm i react-app-rewired customize-cra -save
Затем нам нужно изменить сценарии запуска, чтобы запустить его через rewire-your-app. Для этого нам нужно отредактировать файл package.json в корне нашего проекта:
“scripts”: { “start”: “react-app-rewired start”, “build”: “react-app-rewired build”, “test”: “react-app-rewired test”, “eject”: “react-scripts eject” },
Теперь мы можем приступить к установке новых плагинов ES2020!
@ Babel / плагин-предложение-необязательная-цепочка
Это моя любимая функция ES2020, которую я сразу интегрировал в свои проекты. Это позволяет нам безопасно проверять, существует ли свойство в объекте, и если его нет, он вернет null или undefined.
Давайте посмотрим на пример:
// before: const value = object1 && object1.prop1 && object1.prop1.prop2 // if object and prop1 exists, then access prop2 // now: const value = object1?.prop1?.prop2 // if object1 or prop1 do not exist, it will return null or undefined.
Эта функция также может проверить, существует ли функция.
@ Babel / плагин-предложение-нулевой-коалесцирующий-оператор
Эта функция создает новый способ предоставления значения по умолчанию.
Предположим следующее:
const object2 = { prop1: 0, prop2: 1, prop3: ‘’, prop4: ‘test’, prop5: false } const prop1_before = object2.prop1 || “default” // returns “default” const prop1_after = object2.prop1 ?? “default” // returns 0 const prop2_before = object2.prop2 || “default” // returns “1” const prop2_after = object2.prop2 ?? “default” // returns 1 const prop3_before = object2.prop3 || “default” // returns “default” const prop3_after = object2.prop3 ?? “default” // returns “” const prop4_before = object2.prop4 || “default” // returns “test” const prop4_after = object2.prop4 ?? “default” // returns “test” const prop5_before = object2.prop5 || “default” // returns “default” const prop5_after = object2.prop5 ?? “default” // returns false
Пример наглядно показывает разницу между старым и новым способом.
@ Babel / плагин-синтаксис-bigint
Наибольшее число в JavaScript - 2⁵³. Этот плагин добавляет новый примитив BigInt, который устраняет проблему.
Чтобы создать число BigInt, вам нужно добавить 'n' в конец целого числа:
const nr = 9007199254740993n
Он ведет себя так же, как обычный номер, но, к сожалению, их нельзя использовать вместе:
const nr2 = 10n + 2 // TypeError
К счастью, вы можете использовать конструктор BigInt для преобразования числа или строки в BigInt:
const nr3 = BigInt(‘12345’) const nr4 = BigInt(12345)
Кроме того, вы можете преобразовать BigInt в число по умолчанию с помощью конструктора Number:
const nr5 = Number(12345n)
Вы должны быть осторожны с ним, так как точность может быть потеряна.
@ Babel / плагин-синтаксис-динамический-импорт
Динамический импорт позволяет нам импортировать модуль в любой момент в нашем приложении. Это может привести к повышению производительности, загружая только то, что вам нужно, вместо всего, можно использовать где угодно.
Это реализовано новым методом import (), который возвращает обещание.
import(“./module.js”).then((module) => { … }) const asyncMethod = async () => { const module = await import(“./module.js”) }
Теперь, когда мы знаем, какие новые плагины существуют, мы можем их установить.
npm i @babel/plugin-proposal-optional-chaining -save npm i @babel/plugin-proposal-nullish-coalescing-operator -save npm i @babel/plugin-syntax-dynamic-import -save npm i @babel/plugin-syntax-bigint -save
Однако для того, чтобы начать пользоваться новыми функциями, этого еще недостаточно. У нас также есть файл конфигурации, который будет загружать их при запуске приложения.
Создайте файл config-overrides.js в корневом каталоге проекта:
const { override, addBabelPlugin } = require("customize-cra"); module.exports = override( addBabelPlugin(["@babel/plugin-proposal-optional-chaining", { "loose": false }]), addBabelPlugin(["@babel/plugin-proposal-nullish-coalescing-operator", { "loose": false }]), addBabelPlugin(["@babel/plugin-syntax-dynamic-import", { "loose": false }]), addBabelPlugin(["@babel/plugin-syntax-bigint", { "loose": false }]) );
Как вы можете видеть выше, мы добавили один из наших плагинов, используя метод addBabelPlugin в нашем файле config-overrides.js.
Теперь, наконец, мы можем запустить наше приложение и протестировать некоторые из новых функций!