让 SystemJS 使用 angular2 包?

Making SystemJS use angular2 bundle?

我正在尝试在 Chrome 扩展中使用 angular2,但它没有识别出我已经加载了 angular2 包。这是我在文件 /www/popup.html:

中的脚本标签
<script src="lib/js/jquery.min.js"></script>
<script src="lib/js/es6-shim.min.js"></script>
<script src="lib/js/system-polyfills.js"></script>
<script src="lib/js/angular2-polyfills.js"></script>
<script src="lib/js/system.src.js"></script>

<!-- bundles should be used -->
<script src="lib/js/Rx.js"></script>
<script src="lib/js/angular2.dev.js"></script>
<script src="lib/js/router.dev.js"></script>

<script src="app/pages/popup-page.js"></script>

/www/app/pages/popup-page.js 中,如果我设置到 angular2 和 rxjs 源的路径,它将起作用:

System.config({
  defaultJSExtensions: true, // Will prepend .js to the module names

  paths: {
    'angular2/*': '/node_modules/angular2/*', // finds
    'rxjs/*': '/node_modules/rxjs/*',         // finds
    '*': '/www/app/*'
  },
  packages: {
    "app": {
      format: 'register',
      defaultExtension: 'js',
    }
  }
});

但我不想让它单独加载每个 javascript 文件,甚至不想将它们包含在我的扩展程序中。看起来这些包应该在脚本加载时自行注册。

  1. 如果我不包含我的代码所在的路径“*”,我会得到一个 'require is not defined' 试图 运行 脚本。

  2. 如果我不包含 angular2 和 rxjs 的路径,我会让浏览器尝试为每次导入加载“/www/app/angular2/...”,而不是使用包

如果您加载的包中包含通过 <script> 标记注册为系统模块的模块,则您不需要 System.config 中的任何其他内容 - 它将通过内存中的注册名称解析导入。

通过在您的 html 文件中包含 <script src="lib/js/angular2.dev.js"></script>,像 import {Component} from 'angular2/core' 这样的导入语句将在没有任何额外配置的情况下工作。

System.config 中删除 path 选项应该可以解决 angular 导入的问题。 ('*': '/www/app/*' - 这一行基本上将所有内容映射到 /www/app 文件夹...)。

要为您自己的脚本设置路径,请使用 System.config.package["app"]more info here

中的 map 选项

我认为的问题是 defaultJSExtensions。如果我只是将我的 System.config 更改为此它有效:

System.config({
  packages: {
    "app": {
      defaultExtension: 'js',
    }
  }
});

我只是不知道任何地方都有关于所有这些选项的文档。我查看了这些页面(还有更多我没有保存链接的页面),但无法找到所有选项的参考或很好的解释:

您只需要映射 "app" 而不是“*”,如下所述:

System.config({
  defaultJSExtensions: true, // Will prepend .js to the module names

  paths: {
    'angular2/*': '/node_modules/angular2/*', // finds
    'rxjs/*': '/node_modules/rxjs/*',         // finds
    'app': '/www/app' // <------
  },
  packages: {
    "app": {
      format: 'register',
      defaultExtension: 'js',
    }
  }
});