Компиляция против полифиллинга

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

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

Для получения дополнительной информации о том, какие из функций транспилируются, а какие полифилаются, можно найти на странице https://tylermcginnis.com/compiling-polyfills/.

К счастью, у нас есть Babel, который помогает нам одновременно с транспилированием и полифиллингом. Babel - компилятор JavaScript для легкого использования функций JavaScript нового поколения. Для получения дополнительной информации https://babeljs.io/

Давайте разберемся с примерами ниже

Здесь Babel использует предустановку es2015 для переноса кода с ES6 на ES5. Теперь, если вы видите на экране ниже, левая сторона показывает несколько функций ES6, а правая сторона показывает, как Babel переносит их на ES5 для работы во всех старых браузерах, которые не поддерживают ES6.

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

Теперь, переходя ко второму экрану, Babel использует разные полифиллы (babel-plugin-array-includes и babel-plugin-es6-prom) для преобразования это в функции, поддерживаемые устаревшими браузерами

Давайте посмотрим, как мы можем создать собственный полифил, допустим, функция bind поддерживается не всеми браузерами. Во фрагменте кода ниже показаны выходные данные метода привязки как пользовательского, так и собственного. Существует функция под названием sum, которая принимает 3 числа в качестве аргумента и берет 3 числа из контекста (этот объект) и возвращает сумму всех этих чисел.

const obj = {
 a:1,
 b:2,
 c:3
}
function sum(d,e,f){
 return (this.a + this.b + this.c + d + e + f);
}
const partial1 = sum.bind(obj,4,5);
console.log(“TOTAL WITH bind METHOD ”,partial1(6))     // 21
Function.prototype.myBind = function(context,…arg1){
 let self = this;
 return function(…arg2){
  return self.apply(context,[…arg1,…arg2]);
 }
}
const partial2 = sum.myBind(obj,4,5);
console.log(“TOTAL WITH myBind METHOD”,partial2(6))    // 21
const totalUsingMyBind = sum.myBind(obj,4,5)

Давайте разберем линию подхода на линию.

  1. Добавляем наш собственный метод изначально, чтобы он был доступен для всех функций. Этого можно добиться, добавив метод в прототип функции.
Function.prototype.myBind = function(){}

2. Поскольку функция связывания возвращает другую функцию с контекстом, мы также должны возвращать функцию.

Function.prototype.myBind = function(){
 return function(){}
}

3. Присоединение контекста. Нам нужно присоединить контекст к возвращаемой функции, вызвав фактическую функцию (т. Е. Используя собственный метод вызова).

Function.prototype.myBind = function(context){
 const self = this;
 return function(){
  self.call(context)
 }
}

4. Аргументы из метода пользовательского связывания. Нам нужно прикрепить аргументы, переданные из метода пользовательского связывания, к частичной функции.

Function.prototype.myBind = function(context,…arg1){
 const self = this;
 return function(){
  self.apply(context,arg1)
 }
}
// As apply takes the argument as array

5. Аргументы частичного метода - Теперь нам нужно прикрепить аргументы, переданные частичным методом, к фактическому методу.

Function.prototype.myBind = function(context,…arg1){
 const self = this;
 return function(arg2){
  self.apply(context,[…arg1,…arg2])
 }
}
// As apply takes the arguments as array

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

Удачного Полифиллинга :)