SystemJS和Webpack有什么区别?

sma*_*use 213 node-modules systemjs webpack angular

我正在创建我的第一个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);
Run Code Online (Sandbox Code Playgroud)

为什么我们需要这个配置文件?
为什么我们需要SystemJS(或WebPack或其他)?
最后,在您看来哪个更好?

dan*_*y74 185

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()
});
Run Code Online (Sandbox Code Playgroud)

除了将其配置为工作之外,这就是SystemJS的全部内容!您现在是SystemJS专业版!

Webpack完全不同,需要永远掌握.它不像SystemJS那样做,但是,当使用Webpack时,SystemJS变得多余.

Webpack准备一个名为bundle.js的文件 - 这个文件包含所有HTML,CSS,JS等.因为所有文件都捆绑在一个文件中,所以现在不需要像SystemJS那样的延迟加载器(其中单个文件被加载为需要).

SystemJS的优势在于延迟加载.应用程序加载速度更快,因为您没有在一次点击中加载所有内容.

Webpack的优点在于,虽然应用程序最初可能需要几秒钟才能加载,但一旦加载并缓存,它就会闪电般快速.

我更喜欢SystemJS,但Webpack似乎更时尚.

Angular2快速入门使用SystemJS.

Angular CLI使用Webpack.

Webpack 2(将提供树摇动)处于测试阶段,因此可能是转移到Webpack的不利时机.

注意SystemJS正在实施ES6模块加载标准.Webpack只是另一个npm模块.

任务运行者(对于想要了解SystemJS可能存在的生态系统的人的可选读数)

使用SystemJS,它的唯一责任是延迟加载文件,因此仍需要一些东西来缩小这些文件,转换这些文件(例如从SASS到CSS)等.这些必须完成的工作称为任务.

Webpack在配置后,会正确地为您执行此操作(并将输出捆绑在一起).如果你想用SystemJS做类似的事情,你通常会使用JavaScript任务运行器.最受欢迎的任务运行器是另一个名为gulp的 npm模块.

因此,例如,SystemJS可能会延迟加载由gulp缩小的缩小的JavaScript文件.Gulp,正确设置后,可以动态缩小文件并实时重新加载.实时重新加载是自动检测代码更改和自动浏览器刷新以进行更新.在开发期间很棒.使用CSS,可以实时流式传输(即,您可以看到页面更新新样式,而不会重新加载页面).

Webpack和gulp可以执行许多其他任务,这些任务太多而无法覆盖.我提供了一个例子:)

  • 你对Webpack错了!它允许您将捆绑与延迟加载相结合.此外,它透明地将延迟模块捆绑成块. (34认同)
  • 我也发现SystemJS和JSPM比webpack更容易使用.此外,我发现生产包更小(与另一个webpack示例项目相比).这是我关于这个主题的帖子:http://stackoverflow.com/questions/40256204/jspm-vs-webpack-for-angular-2 (7认同)
  • 您可以使用`angular2-router-loader`来使用Webpack和Lazy加载.查看更多https://medium.com/@daviddentoom/angular-2-lazy-loading-with-webpack-d25fe71c29c1 (7认同)
  • @AlexKlaus感谢您的榜样!我在寻找类似的东西:) (3认同)
  • "Webpack完全不同,需要永远掌握.它与SystemJS不同,但在使用Webpack时,SystemJS变得多余." 我不同意.SystemJS仍然允许开发开发,而不必经常为每个更改构建.我可以更改TS文件,保存(将自动调用tsc.exe并构建它),然后重新加载我的页面,没有任何问题.使用Webpack,我必须重建,这可能需要更长的时间,因为它将重新编译和构建*所有*.我无法找到任何方法来避免使用Webpack. (3认同)
  • Webpack和Lazy加载的更新.包的最后转世是[ng-router-loader](https://github.com/shlomiassaf/ng-router-loader).它包含在[AngularClass/angular-starter](https://github.com/AngularClass/angular-starter)(Angular4 Webpack Starter)中. (2认同)

Thi*_*ier 125

如果您转到SystemJS Github页面,您将看到该工具的描述:

通用动态模块加载器 - 在浏览器和NodeJS中加载ES6模块,AMD,CommonJS和全局脚本.

因为您在TypeScript或ES6中使用模块,所以需要模块加载器.在SystemJS的情况下,systemjs.config.js允许我们配置模块名称与其相应文件匹配的方式.

如果您明确使用它来导入应用程序的主模块,则此配置文件(和SystemJS)是必需的:

<script>
  System.import('app').catch(function(err){ console.error(err); });
</script>
Run Code Online (Sandbox Code Playgroud)

使用TypeScript并将编译器配置到commonjs模块时,编译器会创建不再基于SystemJS的代码.在此示例中,typescript编译器配置文件将如下所示:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs", // <------
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  }
}
Run Code Online (Sandbox Code Playgroud)

Webpack是一个灵活的模块捆绑器.这意味着它更进一步,不仅处理模块,还提供了一种打包应用程序的方法(concat文件,uglify文件,......).它还为开发服务器提供负载重新加载以进行开发

SystemJS和Webpack不同,但是使用SystemJS,您仍然需要做的工作(例如使用GulpSystemJS构建器)来封装Angular2应用程序以进行生产.

  • 谷歌正式转向webpack.所以我想最好坚持使用社区的大多数人.我很快将我的systemJS项目迁移到webpack.虽然不完全确定如何做到这一点. (10认同)
  • 实际上,对于生产来说,为模块加载大量文件(单个文件(~300个请求)或捆绑(~40个请求))效率不高.您需要将所有内容收集到一个或两个(您的代码和第三方库代码),离线编译模板(ngc)并利用树摇动来最小化捆绑的重量.本文可能会引起您的兴趣:http://blog.mgechev.com/2016/06/26/tree-shaking-angular2-production-build-rollup-javascript/.您还需要uglify CSS文件. (4认同)
  • 当您说"使用SystemJS时,您还有工作要做(例如使用Gulp或SystemJS构建器)来封装您的Angular2应用程序以进行生产"这是我目前使用`npm start`获得的内容吗? (2认同)