Я потратил пару дней на то, чтобы запустить и запустить 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.
Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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 файл«вы можете просто загрузить файлы модулей с тегами script и выбросить Webpack в окно» — или, что более реалистично, вы можете использовать сборщик, который генерирует пакеты, которые могут использоваться как современными, так и старыми браузерами.
«Реалистичный» зависит от контекста. В наши дни не каждый проект должен работать в IE8. Но да, я бы не сказал, что вам не нужен упаковщик. Просто вам это не нужно, если вы изучаете основы и модули javascript.
Я провел свою добрую долю сражений с упаковщиками. Есть и другие способы. После нескольких лет опыта, проб и ошибок, лучшая альтернатива, которую я придумал, — это мой проект Zwitterion: https://github.com/lastmjs/zwitterion
Он предназначен для замены статического файлового сервера. Он поддерживает ES2015+, TypeScript, AssemblyScript, Rust, C, C++ и, вероятно, скоро будет поддерживать JSX, TSX и Vue. Вам не нужно менять файловую структуру или способ интуитивной разработки. Просто напишите свой исходный код, включите его в элементы скрипта или импортируйте модуль, и он просто заработает.
Напишите большое приложение, скажем, на React без какой-либо сборки и посмотрите, как у вас получится :)