Які відмінності між SystemJS та Webpack?


222

Я створюю свою першу програму Angular, і я б зрозумів, яка роль завантажувачів модулів. Для чого вони потрібні? Я намагався шукати та шукати в Google, і я не можу зрозуміти, для чого нам потрібно встановити один із них, щоб запустити наш додаток?

Чи не може бути достатньо просто використовувати importдля завантаження матеріалів з модулів вузлів?

Я дотримувався цього підручника (який використовує SystemJS), і це змушує мене використовувати systemjs.config.jsфайл:

/**
 * System configuration for Angular samples
 * Adjust as necessary for your application needs.
 */
(function(global) {
  // map tells the System loader where to look for things
  var map = {
    'app':                        'transpiled', // 'dist',
    '@angular':                   'node_modules/@angular',
    'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
    'rxjs':                       'node_modules/rxjs'
  };
  // packages tells the System loader how to load when no filename and/or no extension
  var packages = {
    'app':                        { main: 'main.js',  defaultExtension: 'js' },
    'rxjs':                       { defaultExtension: 'js' },
    'angular2-in-memory-web-api': { main: 'index.js', defaultExtension: 'js' },
  };
  var ngPackageNames = [
    'common',
    'compiler',
    'core',
    'forms',
    'http',
    'platform-browser',
    'platform-browser-dynamic',
    'router',
    'router-deprecated',
    'upgrade',
  ];
  // Individual files (~300 requests):
  function packIndex(pkgName) {
    packages['@angular/'+pkgName] = { main: 'index.js', defaultExtension: 'js' };
  }
  // Bundled (~40 requests):
  function packUmd(pkgName) {
    packages['@angular/'+pkgName] = { main: '/bundles/' + pkgName + '.umd.js', defaultExtension: 'js' };
  }
  // Most environments should use UMD; some (Karma) need the individual index files
  var setPackageConfig = System.packageWithIndex ? packIndex : packUmd;
  // Add package entries for angular packages
  ngPackageNames.forEach(setPackageConfig);
  var config = {
    map: map,
    packages: packages
  };
  System.config(config);
})(this);

Навіщо нам потрібен цей файл конфігурації?
Для чого нам потрібен SystemJS (або WebPack чи інші)?
Нарешті, на вашу думку, що краще?


4
Тут ви можете прочитати дійсно гарну статтю для порівняння SystemJs (Jspm) з Webpack ilikekillnerds.com/2015/07/jspm-vs-webpack .
Sweta

побачити цю відповідь stackoverflow.com/a/40670147/2545680 для SystemJS
Макс Корецького

Відповіді:


135

Якщо ви перейдете на сторінку SystemJS Github, ви побачите опис інструменту:

Універсальний завантажувач динамічних модулів - завантажує в браузер і NodeJS модулі ES6, AMD, CommonJS та глобальні сценарії.

Оскільки ви використовуєте модулі в TypeScript або ES6, вам потрібен завантажувач модулів. У випадку SystemJS systemjs.config.jsдозволяє нам налаштувати спосіб узгодження імен модулів з відповідними файлами.

Цей файл конфігурації (і SystemJS) необхідний, якщо ви явно використовуєте його для імпорту основного модуля вашої програми:

<script>
  System.import('app').catch(function(err){ console.error(err); });
</script>

Під час використання TypeScript та налаштування компілятора на commonjsмодуль компілятор створює код, який більше не базується на SystemJS. У цьому прикладі конфігураційний файл компілятора машинопису буде виглядати так:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs", // <------
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  }
}

Webpack - це гнучка постачальниця модулів. Це означає, що це йде далі і не лише обробляє модулі, але й надає спосіб упаковки вашої програми (файли concat, uglify файли, ...). Він також забезпечує сервер розробників із завантаженням завантаження для розробки.

SystemJS та Webpack відрізняються, але із SystemJS вам ще належить попрацювати (наприклад, з Gulp або Builder SystemJS ), щоб упакувати додаток Angular2 для виробництва.


2
Коли ви говорите "з SystemJS, у вас ще є робота (наприклад, з Gulp або Builder SystemJS), щоб упакувати ваш додаток Angular2 для виробництва" - це те, з чим я зараз отримую npm start?
smartmouse

5
Насправді для виробництва не ефективно завантажувати багато файлів для модулів (Індивідуальні файли (~ 300 запитів) або Комплектні (~ 40 запитів)). Вам потрібно зібрати все в один або два (ваш код та код сторонніх бібліотек), скласти офлайн-шаблони (ngc) та використовувати тремтіння дерева, щоб мінімізувати вагу пакетів. Ця стаття може вас зацікавити: blog.mgechev.com/2016/06/26 / ... . Вам також потрібно скасувати утиліту файлів CSS.
Тіррі Темплієр

1
З npm start, ви "просто" запускаєте сервер, який обслуговуватиме вашу програму на основі вашої конфігурації SystemJS для модулів ...
Thierry Templier

11
Google офіційно перейшов на webpack. Тож я гадаю, що краще дотримуватися того, чим би користувалася більшість громади. Я незабаром мігрую свій проект systemJS на webpack. Не зовсім впевнений, як це зробити.
користувач2180794

1
@JonasKello це стосується кутового затиску. Дивіться це посилання: github.com/angular/angular-cli у розділі "Оновлення веб- пакета "?
Тіррі Темплієр

190

SystemJS працює на стороні клієнта. Він завантажує модулі (файли) динамічно на вимогу, коли вони знадобляться. Вам не доведеться завантажувати весь додаток наперед. Ви можете завантажити файл, наприклад, всередині обробника кнопки.

Код SystemJS:

// example import at top of file
import myModule from 'my-module'
myModule.doSomething()

// example dynamic import (could be placed anywhere in your code)
// module not loaded until code is hit
System.import('my-module').then((myModule) {
  // myModule is available here
  myModule.doSomething()
});

Окрім того, щоб налаштувати його на роботу, це все, що є для SystemJS! Тепер ви про SystemJS!

Вебпак зовсім інший і майстер вічно освоює. Це не те саме, що SystemJS, але при використанні Webpack SystemJS стає зайвим.

Webpack готує єдиний файл під назвою bundle.js - Цей файл містить усі HTML, CSS, JS тощо. Оскільки всі файли поєднані в одному файлі, тепер немає необхідності в ледачому завантажувачі, як SystemJS (де окремі файли завантажуються як потрібні).

Переваги SystemJS - це ледаче завантаження. Додаток повинен завантажуватися швидше, оскільки ви не завантажуєте все одним ударом.

Перевага Webpack полягає в тому, що, хоча додаток може спочатку зайняти кілька секунд, після завантаження та кешування це блискавично.

Я віддаю перевагу SystemJS, але Webpack здається моднішим.

Angular2 Quickstart використовує SystemJS.

Кутова CLI використовує Webpack.

Webpack 2 (який буде пропонувати струшування дерева) знаходиться в бета-версії, тому, можливо, поганий час для переходу на Webpack.

Примітка. SystemJS реалізує стандарт завантаження модуля ES6 . Webpack - це ще один модуль npm.

Робочі завдання (необов’язкове читання для тих, хто хоче зрозуміти екосистему, в якій може існувати SystemJS)

У SystemJS єдиною відповідальністю є ледача завантаження файлів, тому щось ще потрібно для мінімізації цих файлів, трансляції цих файлів (наприклад, з SASS до CSS) тощо. Ці завдання, які необхідно виконати, відомі як завдання .

При налаштуванні Webpack правильно робить це за вас (і поєднує вихідний результат разом). Якщо ви хочете зробити щось подібне з SystemJS, ви зазвичай використовуєте бігунок завдань JavaScript. Найпопулярніший виконавець завдань - ще один модуль npm, який називається gulp .

Так, наприклад, SystemJS може ледаче завантажити мінімізований файл JavaScript, який був мінімізований gulp. При правильному налаштуванні Gulp може мінімізувати файли під час льоту та перезавантажувати їх у реальному часі. Перезавантаження в реальному часі - це автоматичне виявлення зміни коду та автоматичне оновлення браузера для оновлення. Чудово під час розвитку. За допомогою CSS можлива трансляція в реальному часі (тобто ви бачите, що сторінка оновлює нові стилі, навіть не перезавантажуючи сторінку).

Є багато інших завдань, які Webpack і gulp можуть виконувати, які були б занадто численні, щоб охопити тут. Я наводив приклад :)


7
Мені теж здається, що з SystemJS та JSPM працювати набагато простіше, ніж з webpack. Також я виявив, що виробничі пакети будуть меншими (порівняно з іншим прикладом веб-пакету). Ось мій пост на тему: stackoverflow.com/questions/40256204/…
Пітер Саломонсен

7
Ви можете використовувати завантаження Webpack & Lazy з використанням angular2-router-loader. Дивіться більше medium.com/@daviddentoom/…
Алекс Клаус

36
Ви помиляєтесь про Webpack! Це дозволяє поєднувати комплектацію з ледачим завантаженням. Більше того, він прозоро зв'язує відкладені модулі в шматки.
dizel3d

3
@AlexKlaus дякую за приклад! Я шукав щось подібне :)
tftd

3
"Вебпак зовсім інший і займає назавжди освоєння. Це робить не те саме, що і SystemJS, але, використовуючи Webpack, SystemJS стає зайвим." Я повинен погодитися. SystemJS все ще дозволяє розробляти розробники без постійних необхідностей будувати для кожної зміни. Я можу внести зміни в файл TS, зберегти (який автоматично зателефонує tsc.exe і створити його), а потім перезавантажте свою сторінку і не матимуть жодних проблем. За допомогою Webpack мені доведеться перебудувати, що може зайняти значно більше часу, оскільки воно перекомпілює і створить усе . Мені не вдалося знайти жодного способу уникнути цього за допомогою Webpack.
Polantaris

0

Поки я використовував systemjs. Він завантажував файли один за одним, і перше завантаження займало 3-4 секунди, без зменшених файлів. Після переходу на веб-пакет я покращив продуктивність. Тепер потрібно лише завантажити один файл пакету (також поліфіли та вкладки постачальників, які майже ніколи не змінювалися і майже завжди кешувались) і все. Тепер потрібно лише секунду, щоб завантажити додаток на стороні клієнта. Немає додаткової логіки на стороні клієнта. Як менше кількість завантажених окремих файлів, тим вища продуктивність. Під час використання systemjs вам слід подумати про те, щоб динамічно імпортувати модулі для економії роботи. За допомогою веб-пакета ви зосереджуєтесь головним чином на своїй логіці, оскільки продуктивність буде як і раніше хороша, як тільки пакет буде мінімізований та кешований у вашому браузері.


3
Ви відповіли лише на одне з питань ОП, краще було б зробити коментар.
Бен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.