我正在创建我的第一个Angular应用程序,我将了解模块加载程序的作用.

仅仅用import从 node 模块加载东西就足够了吗?

我关注了this tutorial(它使用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或其他人)?
最后,在您看来,什么是更好的呢?

推荐答案

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

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

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

如果显式使用此配置文件(和SystemJS)导入应用程序的主模块,则需要此配置文件:

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

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

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

webpack是一位灵活的模块Bundle 者.这意味着它走得更远,不仅处理模块,还提供了打包应用程序的方法(CONCAT文件、UGLIFY文件等).它还为开发提供了加载重新加载的开发服务器.

SystemJS和webpack是不同的,但是使用SystemJS,您仍然有工作要做(例如,有GulpSystemJS builder)来打包您的Angular2应用程序用于生产.

Javascript相关问答推荐

使用reaction创建可排序的表不起作用

Webpack将懒惰加载的模块放入主块中

如何在加载的元数据上使用juserc和await中获得同步负载?

强制执行useStatego struct 化变量[foo,setFoo]的命名约定?

如何从对象嵌套数组的第二级对象中过滤出键

如何修复内容安全策略指令脚本-SRC自身错误?

如何分配类型脚本中具有不同/额外参数的函数类型

if/else JavaScript中的条件行为

我可以从React中的出口从主布局调用一个处理程序函数吗?

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

并不是所有的iframe都被更换

从包含数百行的表中获取更改后的值(以表单形式发送到后端)的正确方法是什么?

Eval vs函数()返回语义

本地库中的chartjs-4.4.2和chartjs-plugin-注解

如何在Angular拖放组件中同步数组?

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

ngOnChanges仅在第二次调用时才触发

更改agGRID/Reaction中的单元格格式

Next.js无法从外部本地主机获取图像

与在编剧中具有动态价值的定位器交互