Angular2,systemjs,无法使用Rx.umd.js

时间:2016-08-05 15:55:39

标签: angular rxjs umd

使用最新版本的Angular RC4,Rxjs可用于node_modulesnpmcdn.com目录。

成功的plunker但没有使用.umd.js

http://plnkr.co/edit/B33LOW?f=systemjs.config.js&p=preview

这是下载单个文件的网络标签截图。 enter image description here

当然,这个设置会使很多单独的RxJS文件下载,因为它正在单独读取文件,而不是.umd.js

但是,与其他AngularJS文件一样,当我尝试使用单个umd.js文件时,会发生以下错误。

GET https://npmcdn.com/rxjs@5.0.0-beta.6/bundles/Subject 404 ()
GET https://npmcdn.com/rxjs@5.0.0-beta.6/bundles/Observable 404 ()
GET https://npmcdn.com/rxjs@5.0.0-beta.6/bundles/observable/PromiseObservable 404 ()
...

enter image description here

没有尝试使用.umd.jssystem.config.js

的plunker

http://plnkr.co/edit/rVUNyz?p=preview&f=systemjs.config.js

systemjs.config.js

  var  map = {
    'app':                        'app',

    '@angular':                   'https://npmcdn.com/@angular', // sufficient if we didn't pin the version
    '@angular/router':            'https://npmcdn.com/@angular/router' + routerVer,
    '@angular/forms':             'https://npmcdn.com/@angular/forms' + formsVer,
    '@angular/router-deprecated': 'https://npmcdn.com/@angular/router-deprecated' + routerDeprecatedVer,
    'angular2-in-memory-web-api': 'https://npmcdn.com/angular2-in-memory-web-api', // get latest
    'rxjs':                       'https://npmcdn.com/rxjs@5.0.0-beta.6/bundles',
    'ts':                         'https://npmcdn.com/plugin-typescript@4.0.10/lib/plugin.js',
    'typescript':                 'https://npmcdn.com/typescript@1.9.0-dev.20160409/lib/typescript.js',
 };

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

似乎'rxjs'根本没有使用'package'部分。 我认为使用包中的rxjs部分没有任何区别。

只有让这个plunker工作,我必须在没有bundles

的情况下将地图部分更改为以下内容
  'rxjs':                       'https://npmcdn.com/rxjs@5.0.0-beta.6',

我的问题是'有没有办法在Angular2应用程序中使用Rx.umd.js?'

1 个答案:

答案 0 :(得分:0)

我查看了Rx.umd.js文件,似乎整个包使用了相对路径导入。这意味着当rxjs包的基础(在地图中)具有/ bundle后缀时,它无法找到文件。

这是有道理的,因为你使用的是实际的rxjs包而不是它的' / bundles' 。目录

因此,您所要做的就是:

  1. 在systemjs.config.js的map部分中更改

    'rxjs':                       'https://npmcdn.com/rxjs@5.0.0-beta.6/bundles',
    

    'rxjs':                       'https://npmcdn.com/rxjs@5.0.0-beta.6',
    
  2. 在包部分中,更改

    'rxjs':                       { main: 'Rx.umd.js', defaultExtension: 'js' },
    

    'rxjs':                       { main: 'bundles/Rx.umd.js', defaultExtension: 'js' },
    
  3. 或简单地说,/ bundles应该是pacakge定义的一部分而不是映射,因为映射应该指向包的根。

    这是一个更新的(工作!)plunker,需要进行细微更改:http://plnkr.co/edit/3P6tLYMYOC24zc6JCkgO?f=systemjs.config.js&p=preview

    ---编辑(关注@allenhwkim评论)---

    我进一步研究了它。请注意,systemjs.config.js遵循包(而不是map)部分中的bundle / xxx。参见例如第59行。

    我的猜测是angular有自己对rxjs的引用,它正确定义了包,所以看起来你的包定义被忽略了。

    为了证明包是相关的和使用的,我在(在plnkr中)添加了一个名为rxjs1的虚拟包,我尝试在inedex.html文件中导入它。现在运行plnkr并看到它已导入。尝试将包定义更改为不存在的内容,例如Rxx.umd.js,您将收到错误。使用

    时,软件包def似乎是相关的
    System.import('package-name');
    

    而不是

    import { someClass } from 'package-name';
    

    请注意,当您使用plnkr时,plnkr并不总是会跟踪对包定义的更改,您需要刷新页面。