systemjs.config.js在angular 2打包结构中做了什么?

时间:2016-05-25 14:15:57

标签: angular

还有var map,packages,var config在这里做什么我在这里有点困惑 他们做任何配置。我看过每个项目,我发现他们放在这个文件的所有地方。这个功能有什么作用?

 (function(global) {

      // map tells the System loader where to look for things
      var map = {
        'app':                        'app', // 'dist',
        'rxjs':                       'node_modules/rxjs',
        'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
        '@angular':                   'node_modules/@angular',
    'primeng':                        'node_modules/primeng'
      };

      // packages tells the System loader how to load when no filename and/or no extension
      var packages = {
        'app':                        { main: 'boot.js',  defaultExtension: 'js' },
        'rxjs':                       { defaultExtension: 'js' },
        'angular2-in-memory-web-api': { defaultExtension: 'js' },
        'primeng':                    { defaultExtension: 'js' }
      };

      var packageNames = [
        '@angular/common',
        '@angular/compiler',
       //
      ];

      // add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' }
      packageNames.forEach(function(pkgName) {
        packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
      });

      var config = {
        map: map,
        packages: packages
      }

      // filterSystemConfig - index.html's chance to modify config before we register it.
      if (global.filterSystemConfig) { global.filterSystemConfig(config); }

      System.config(config);

    })(this);

2 个答案:

答案 0 :(得分:37)

它允许配置SystemJS以加载使用TypeScript编译器编译的模块。对于匿名模块(每个JS文件一个模块),它允许将模块名称映射到实际包含模块JavaScript代码的JS文件。

这是一个示例。如果我尝试导入名为app/test的模块,SystemJS将执行:

  • 尝试查找预先注册的模块(使用System.register('app/test', ...
  • 如果没有,它将调查其配置以构建执行加载相应文件的请求:
    • map
    • 有一个app条目
    • packages = app
    • defaultExtensionjs条目
  • 请求将为http://localhost:3000/app/test.js。如果您有map: { app: dist },请求将为http://localhost:3000/dist/test.js

答案 1 :(得分:5)

systemjs.config.js定义SystemJS中 Path Normalization 的配置。你使用SystemJS加载一些东西:

System.import('app/main.js')

这会导致SystemJS尝试加载您的应用,从文件app / main.js开始。然而,SystemJS做的第一件事 规范化路径(app / main.js),这意味着它根据路径翻译 systemjs.config.js中的规则。

Systemjs.config.js为SystemJS导入的任何内容定义了不同类型的别名

地图

地图部分有两个用途:

路径别名

在使用SystemJS加载模块的应用程序中,map部分用于别名路径的一部分,以告诉SystemJS特定命名模块实际位于何处。例如,您可能正在使用SystemJS加载您的应用程序,如下所示:

System.import('app/main.js')

现在,假设您确实要在以下位置找到您的应用文件:

/assets/js/app.

您可以在'地图中定义此内容。 systemjs.config.js中的部分:

// map tells the System loader where to look for things
map: {
  'app': '/assets/js/app'
}

然后,SystemJS将在以下位置查找您的主文件:

/assets/js/app/main.js

识别模块的位置

SystemJS的主要目的是提供一个模块系统,以满足浏览器中缺乏通用ES模块支持的需求,其中一种方法是使用“地图”。 systemjs.config.js的一部分,用于标识在哪里查找模块。

对于使用标准ES'导入'在您的应用内导入的所有模块。语句,map部分标识SystemJS将在何处找到它们(在使用SystemJS加载应用程序之后)。这是一个常见的例子:

    // map tells the System loader where to look for things
    map: {
        // angular bundles
        '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
        '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
        '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',

这意味着当您第一次在根模块中执行此操作时:

import { NgModule } from '@angular/core';

... SystemJS将通过在其默认位置查找Angular核心库来处理导入(假设它是使用npm安装的):

/node_modules/@angular/core/bundles/core.umd.js

现在,你可能想知道' npm:'被转换为' / node_modules',那就是'路径' systemjs.config.js的一部分:

路径

此部分定义了在' map'下定义的模块路径部分的别名。那种' npm'可以在上面的例子中使用别名如下:

paths: {
  // paths serve as alias
  'npm:': '/node_modules/'
}

这样做可以在您添加到地图的任何路径中替换任何出现的 ' npm'部分,它将被替换为字符串' / node_modules /'

官方文件:https://github.com/systemjs/systemjs/blob/master/docs/config-api.md#paths

来自文档:

  

包为设置元和地图配置提供了便利   这是特定于共同路径的。

例如,如果您想加载这样的应用程序:

System.import('app')

然后,您可以为' packages':

添加此部分
    // packages tells the System loader how to load when no filename and/or no extension
    packages: {
        app: {
            main: 'index.js'
            defaultExtension: 'js',
            meta: {
                './*.js': {
                    loader: false,
                }
            }
        }

以下是细分:

main: 'index.js'

包或路径别名的主要入口点(如果它还没有在地图'部分中提供)

defaultExtension: 'js'

要假设的文件扩展名(如果它尚未提供)。在这种情况下,如果未指定文件类型,请查找.js文件。

meta: {
    './*.js': {
        loader: false,
    }
}

SystemJS需要确定如何正确加载模块的信息。在这种情况下,不要为任何' .js'调用模块加载器。我们的应用程序中的文件(如果你正在使用TypeScript,你需要这样做 - 你只希望SystemJS在转换TypeScript时加载模块,你需要忽略已转换的.js文件)

(有关' meta' - https://github.com/systemjs/systemjs/blob/master/docs/config-api.md#meta

的更多信息,请参阅文档

另请参阅此处的官方文档,以获得有关'套餐的完整说明。部分:

https://github.com/systemjs/systemjs/blob/master/docs/config-api.md#packages