Зачем использовать WebPack?

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

index.js

import greet from './greet';

console.info("I'm the entry point");
greet();

приветствие.js

function greet() {
    console.info('Have a great day!');
};

export default greet;

Так супер просто. Но пакет.js

!(function(e) {
  var t = {};
  function n(r) {
    if (t[r]) return t[r].exports;
    var o = (t[r] = { i: r, l: !1, exports: {} });
    return e[r].call(o.exports, o, o.exports, n), (o.l = !0), o.exports;
  }
  (n.m = e),
    (n.c = t),
    (n.d = function(e, t, r) {
      n.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: r });
    }),
    (n.r = function(e) {
      "undefined" != typeof Symbol &&
        Symbol.toStringTag &&
        Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }),
        Object.defineProperty(e, "__esModule", { value: !0 });
    }),
    (n.t = function(e, t) {
      if ((1 & t && (e = n(e)), 8 & t)) return e;
      if (4 & t && "object" == typeof e && e && e.__esModule) return e;
      var r = Object.create(null);
      if (
        (n.r(r),
        Object.defineProperty(r, "default", { enumerable: !0, value: e }),
        2 & t && "string" != typeof e)
      )
        for (var o in e)
          n.d(
            r,
            o,
            function(t) {
              return e[t];
            }.bind(null, o)
          );
      return r;
    }),
    (n.n = function(e) {
      var t =
        e && e.__esModule
          ? function() {
              return e.default;
            }
          : function() {
              return e;
            };
      return n.d(t, "a", t), t;
    }),
    (n.o = function(e, t) {
      return Object.prototype.hasOwnProperty.call(e, t);
    }),
    (n.p = ""),
    n((n.s = 0));
})([
  function(e, t, n) {
    "use strict";
    n.r(t);
    var r = function() {
      console.info("Have a great day!");
    };
    console.info("I'm the entry point"), r();
  }
]);

Кажется, что WebPack делает много ненужного кода, который просто не имеет для меня смысла. Кроме того, файл bundle.js в 3 раза больше по размеру, чем index.js и welcome.js. Сборка разработки приложения также выглядит очень запутанной и запутанной для чего-то такого простого.

Так почему я должен продолжать тратить время на использование WebPack для своих проектов? Что это за дополнительный код, который он выводит, и почему он там? Есть ли лучшие альтернативы, которые помогут мне отправить мой код из модульной среды разработки?

Я был бы очень признателен за вашу помощь в том, чтобы помочь мне понять, почему я должен или не должен использовать WebPack.

Спасибо!

Напишите большое приложение, скажем, на React без какой-либо сборки и посмотрите, как у вас получится :)

Dominic 20.03.2019 13:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
826
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

The bundle.js is also 3 times larger in file size than the index.js and greet.js

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

So why should I continue to invest time into using WebPack for my projects?

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

What is all the extra code it is outputting and why is it there?

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

// IIFE to keep global scope clean, ! to prevent Automatic Semicolon Insertion fun
!(function init(modules) {
  var cache = {}; // cache the modules results
  // All modules are in an array, their index is a unique identifier
  function require/*n*/(index/*r*/) {
    if (cache[index]) return cache[index].exports;
    var context/*o*/= (cache[index = { index/*i*/: index, loaded/*l*/: false/*!1*/, exports: {} });

    modules[index].call(
      context.exports, 
      context,
      context.exports, 
      require
    );
    context.loaded = true /*!0*/;
    return context.exports;
  }

  require.modules = modules; // I'm not sure why?...
  require.cache = cache;

  // helper for adding a getter
  require.addGetter /*n.d*/ = function(object, key, getter) {
    require.has(object, key) || Object.defineProperty(object, key, { enumerable: true, get: getter });
  });

  require.prepareExport /*n.r*/ = function(export) {
    if ("undefined" != typeof Symbol && Symbol.toStringTag)
      Object.defineProperty(export, Symbol.toStringTag, { value: "Module" });

    Object.defineProperty(export, "__esModule", { value: true });
  };

 // I have no idea what that is doing

  require.startModule /*n.s*/ = 0;
  require(require.startModule); // start execution
})([
  /* Your modules, identified by index */
  function mainModule(context, exports, require) {
      "use strict"; // better performance
      require.prepareExport(export); // as you could override exports in your module, this has to be called afterwards

     var otherModule = function() { // inlined!
        console.info("Have a great day!");
     };

    console.info("I'm the entry point"), 

    otherModule();
  } /* ... more modules would follow here if not inlined */
]);

Are the any better alternatives that will help me ship my code from a modular development environment?

Есть альтернативы, не уверен, что они "лучше".

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

Для простоты вы можете просто загрузить файлы модулей с тегами script и выбросить Webpack в окно! (только в современных браузерах (Edge16+, FF60+, Chrome61+, Safari11+)).

<script type = "module" src = "greet.js">
<script type = "module" src = "app.js">

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

  • объедините свои модули в один большой старый bundle.js файл
  • сделать код совместимым со старыми устаревшими браузерами.
  • преобразовать scss в css, typescript в javascript и т. д.
  • запустить сервер разработки с автоматической перезагрузкой
  • создайте всю папку вашего веб-сайта, включая только те файлы, которые фактически используются в проекте.

«вы можете просто загрузить файлы модулей с тегами script и выбросить Webpack в окно» — или, что более реалистично, вы можете использовать сборщик, который генерирует пакеты, которые могут использоваться как современными, так и старыми браузерами.

str 20.03.2019 14:32

«Реалистичный» зависит от контекста. В наши дни не каждый проект должен работать в IE8. Но да, я бы не сказал, что вам не нужен упаковщик. Просто вам это не нужно, если вы изучаете основы и модули javascript.

Kokodoko 20.03.2019 14:56

Я провел свою добрую долю сражений с упаковщиками. Есть и другие способы. После нескольких лет опыта, проб и ошибок, лучшая альтернатива, которую я придумал, — это мой проект Zwitterion: https://github.com/lastmjs/zwitterion

Он предназначен для замены статического файлового сервера. Он поддерживает ES2015+, TypeScript, AssemblyScript, Rust, C, C++ и, вероятно, скоро будет поддерживать JSX, TSX и Vue. Вам не нужно менять файловую структуру или способ интуитивной разработки. Просто напишите свой исходный код, включите его в элементы скрипта или импортируйте модуль, и он просто заработает.

Другие вопросы по теме