【问题标题】:Making SystemJS use angular2 bundle?让 SystemJS 使用 angular2 包?
【发布时间】:2016-03-04 21:42:54
【问题描述】:

我正在尝试在 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. 如果我不包含指向我的代码所在的路径“*”,我会在尝试运行脚本时收到“未定义要求”。

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

【问题讨论】:

    标签: angular systemjs


    【解决方案1】:

    如果你加载一个包,该包的模块通过&lt;script&gt; 标签注册为系统模块,你不需要System.config 中的任何其他内容 - 它会通过内存中的注册名称解析导入。

    通过在您的 html 文件导入语句中包含 &lt;script src="lib/js/angular2.dev.js"&gt;&lt;/script&gt;,例如 import {Component} from 'angular2/core',无需任何额外配置即可工作。

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

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

    【讨论】:

    • popup-page 不是一个模块,尽管我已经用打字稿编写了它。它没有任何导入,它只是调用System.config,然后调用System.import('./app/pages/popup-boot')。我见过的示例将此代码作为 html 中的内联脚本,但 chrome 扩展禁止内联脚本,因此我将其设为单独的脚本并将其包含在脚本标记中。 popup-boot 有第一个语句 import {provide} from 'angular2/core';,我在尝试查找 `/www/app/angular2/core.js' 时遇到 404 错误,因此由于某种原因它无法识别捆绑包。跨度>
    • 我误解了您如何使用 popup-page.js.. 尝试删除 path 配置(这应该可以解决角度导入问题)。然后尝试为 app 包添加mapmap: { app: "/www/app" }.. 之类的东西将您的应用程序文件的导入映射到它们所在的文件夹。
    【解决方案2】:

    我认为问题是defaultJSExtensions。如果我只是将我的System.config 更改为此它就可以工作:

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

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

    【讨论】:

      【解决方案3】:

      您只需要映射“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',
          }
        }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-07
        • 2016-12-12
        • 1970-01-01
        • 2016-05-11
        • 2016-10-09
        • 2016-12-21
        • 2016-06-22
        • 2016-10-21
        相关资源
        最近更新 更多