¿Cuáles son las diferencias entre SystemJS y Webpack?


Estoy creando mi primera aplicación Angular y me gustaría averiguar cuál es el papel de los cargadores de módulos. Por qué los necesitamos? Traté de buscar y buscar en Google y no puedo entender por qué necesitamos instalar uno de ellos para ejecutar nuestra aplicación?

¿No podría ser suficiente usar import para cargar cosas desde módulos de nodos?

He seguido este tutorial (que usa SystemJS) y me hace usar systemjs.config.js archivo:

/**
 * 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);

¿por Qué necesitamos esta configuración archivo?
¿Por qué necesitamos SystemJS(o WebPack u otros)?
Finalmente, en su opinión, ¿qué es lo mejor?

Author: Lazar Ljubenović, 2016-07-08

3 answers

Si vas a la página de SystemJS Github, verás la descripción de la herramienta:

Cargador de módulo dinámico universal - carga módulos ES6, AMD, CommonJS y scripts globales en el navegador y NodeJS.

Debido a que utiliza módulos en TypeScript o ES6, necesita un cargador de módulos. En el caso de SystemJS, el systemjs.config.js nos permite configurar la forma en que los nombres de los módulos se corresponden con sus archivos correspondientes.

Este archivo de configuración (y SystemJS) es necesario si lo usa explícitamente para importar el módulo principal de su aplicación:

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

Cuando se usa TypeScript, y se configura el compilador en el módulo commonjs, el compilador crea código que ya no está basado en SystemJS. En este ejemplo, el archivo de configuración del compilador typescript aparece así:

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

Webpack es un paquete de módulos flexible. Esto significa que va más allá y no solo maneja módulos, sino que también proporciona una forma de empaquetar su aplicación (concat archivos, uglify archivos ...). También proporciona un servidor de desarrollo con carga de recarga para el desarrollo

SystemJS y Webpack son diferentes, pero con SystemJS, todavía tiene trabajo que hacer (con Gulp o SystemJS builder por ejemplo) para empaquetar su aplicación Angular2 para producción.

 109
Author: Thierry Templier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 16:37:42

SystemJS funciona en el lado del cliente. Carga módulos (archivos) dinámicamente bajo demanda cuando se necesitan. No tienes que cargar toda la aplicación por adelantado. Puede cargar un archivo, por ejemplo, dentro de un controlador de clic de botón.

Código 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()
});

Aparte de configurarlo para que funcione, ¡eso es todo lo que hay en SystemJS! Ahora eres un SystemJS pro!

Webpack es completamente diferente y lleva una eternidad dominarlo. No hace lo mismo que SystemJS pero, cuando usando Webpack, SystemJS se vuelve redundante.

Webpack prepara un único archivo llamado bundle.js-Este archivo contiene todo HTML, CSS, JS, etc. Debido a que todos los archivos se agrupan en un solo archivo, ahora no hay necesidad de un cargador perezoso como SystemJS (donde los archivos individuales se cargan según sea necesario).

La ventaja de SystemJS es esta carga lenta. La aplicación debe cargar más rápido porque no está cargando todo en un solo golpe.

La ventaja de Webpack es que, aunque la aplicación puede tome unos segundos para cargar inicialmente, una vez cargado y almacenado en caché es muy rápido.

Prefiero SystemJS pero Webpack parece ser más de moda.

Angular2 quickstart utiliza SystemJS.

Angular CLI utiliza Webpack.

Webpack 2 (que ofrecerá tree shaking) está en beta, por lo que tal vez sea un mal momento para pasar a Webpack.

Nota SystemJS está implementando el estándar de carga de módulos ES6. Webpack es solo otro módulo npm.

Corredores de tareas (opcional lectura para aquellos que quieren entender el ecosistema en el que SystemJS podría existir)

Con SystemJS su única responsabilidad es la carga lenta de archivos, por lo que todavía se necesita algo para reducir esos archivos, transpilar esos archivos (por ejemplo, de SASS a CSS), etc. Estos trabajos que deben realizarse se conocen como tareas.

Webpack, cuando está configurado, hace esto correctamente por usted (y agrupa la salida). Si quieres hacer algo similar con SystemJS normalmente utilice un ejecutor de tareas JavaScript. El ejecutor de tareas más popular es otro módulo npm llamado gulp.

Así que, por ejemplo, SystemJS podría cargar perezosamente un archivo JavaScript minificado que ha sido minificado por gulp. Gulp, cuando se configura correctamente, puede minificar archivos sobre la marcha y recargar en vivo. La recarga en vivo es la detección automática de un cambio de código y una actualización automática del navegador para actualizar. Excelente durante el desarrollo. Con CSS, la transmisión en vivo es posible (es decir, verá la página actualizar el nuevo estilos sin que la página se vuelva a cargar).

Hay muchas otras tareas que Webpack y gulp pueden realizar que serían demasiado numerosas para cubrir aquí. He proporcionado un ejemplo:)

 166
Author: danday74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-04 07:23:46

Hasta ahora estaba usando systemjs. Estaba cargando archivos uno por uno y la primera carga estaba tomando 3-4 segundos sin archivos minificados. Después de cambiar a webpack obtuve una gran mejora en el rendimiento. Ahora solo se necesita cargar un archivo de paquete (también polyfills y libs de proveedores que casi nunca cambian y casi siempre se almacenan en caché) y eso es todo. Ahora solo toma un segundo cargar la aplicación del lado del cliente. No hay lógica adicional del lado del cliente. Como menor el número de archivos individuales cargados como mayor el rendimiento. Al usar systemjs, debe pensar en importar módulos dinámicamente para guardar el rendimiento. Con webpack te centras principalmente en tu lógica porque el rendimiento seguirá siendo bueno una vez que el paquete se minimice y se almacene en caché en tu navegador.

 0
Author: Hrach Gyulzadyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-10 19:13:43