使用systemJS加载Firebase时缺少扩展

使用systemJS加载Firebase时缺少扩展,firebase,systemjs,Firebase,Systemjs,我正在编写一个Angular2应用程序,它通过AngularFire2使用Firebase,我在加载Firebase文件时遇到了麻烦。SystemJS引导应用程序,加载firebase.js,但随后由于缺少扩展名而无法加载其中所需的文件。特别是,它向http://localhost:8080/node_modules/firebase/app而不是http://localhost:8080/node_modules/firebase/app.js。后者存在于捆绑包中,因此绝对是正确的加载对象 这

我正在编写一个Angular2应用程序,它通过AngularFire2使用Firebase,我在加载Firebase文件时遇到了麻烦。SystemJS引导应用程序,加载
firebase.js
,但随后由于缺少扩展名而无法加载其中所需的文件。特别是,它向
http://localhost:8080/node_modules/firebase/app
而不是
http://localhost:8080/node_modules/firebase/app.js
。后者存在于捆绑包中,因此绝对是正确的加载对象

这是我的
system.config.js

(function(global) {

// map tells the System loader where to look for things
var map = {
    'aviary':                               'js',
    'rxjs':                                 'npm:rxjs',
    'firebase':                             'npm:firebase/firebase.js',
    'firebase/app':                         'npm:firebase/app.js',
    'angularfire2':                         'npm:angularfire2',
    '@angular':                             'npm:@angular'
};

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

};
var ngPackageNames = [
    'common',
    'compiler',
    'core',
    'forms',
    'http',
    'platform-browser',
    'platform-browser-dynamic',
    'router',
    'router-deprecated',
    'upgrade',
];

// Individual files (~300 requests):
function packIndex(pkgName) {
    packages['@angular/'+pkgName] = { main: 'index.js', defaultExtension: 'js' };
}

// Bundled (~40 requests):
function packUmd(pkgName) {
    packages['@angular/'+pkgName] = { main: 'bundles/' + pkgName + '.umd.js', defaultExtension: 'js' };
}

// Most environments should use UMD; some (Karma) need the individual index files
var setPackageConfig = System.packageWithIndex ? packIndex : packUmd;

// Add package entries for angular packages
ngPackageNames.forEach(setPackageConfig);
var config = {
    map: map,
    packages: packages,
    paths: {
        'npm:': 'node_modules/'
    }
};

System.defaultExtension = true;
System.config(config);

})(this);
我试过的一件事是

var packages = {
    //...
    'firebase':                     { defaultExtension: 'js' }
};

但这没有帮助。这感觉像是一个配置问题,但我正在努力弄清楚如何让它满足我的需要。

system.config.js
中,
firebase
的包配置不适用,因为您将
firebase
映射到了一个文件,包配置基本上只适用于目录。只有当模块实际上只是一个文件时,映射到文件才起作用。当需要从同一目录加载其他文件时,您必须将模块映射到该目录,并在package config中使用
main
,如下所示:

var map = {
    ...
    'firebase': 'npm:firebase',
}

注:

  • 看起来您不需要为
    firebase/app

  • 在最新版本中,firebase的主文件是
    firebase browser.js
    ,而不仅仅是
    firebase.js

  • 您不需要在包配置中使用
    defaultExtension:'js'
    ,因为
    js
    已经是任何包的默认值

  • 我不确定这行是做什么的,当我删除它时没有任何变化:

    System.defaultExtension = true;
    
  • System.defaultExtension = true;