还有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);
答案 0 :(得分:37)
它允许配置SystemJS以加载使用TypeScript编译器编译的模块。对于匿名模块(每个JS文件一个模块),它允许将模块名称映射到实际包含模块JavaScript代码的JS文件。
这是一个示例。如果我尝试导入名为app/test
的模块,SystemJS将执行:
System.register('app/test', ...
map
app
条目
packages
= app
defaultExtension
条js
条目
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