OuterSubscriber не определен при объединении с rollup.js

После обновления до Angular2 RC7 я получаю следующую ошибку JavaScript при работе в браузере:

Внешний подписчик не определен

Это происходит только тогда, когда я создаю пакет, используя rollup.js. Если я запускаю приложение с несвязанным JavaScript, оно работает нормально.

Ошибка должна быть как-то связана с rxjs, так как OuterSubscriber является ее частью. Я проверил комплект и не смог найти там OuterSubscriber. Я полагаю, rollup.js считает, что это не нужно и поэтому не включает его.

Окружающая среда:

  • angular, v2.0.0-rc.7
  • rxjs, v5.0.0-beta.12
  • systemjs, v0.19.27
  • gulp-rollup, v2.4.0
  • rollup-stream, v1.13.0

В конфигурации system.js я сопоставляю модули umd (например, core.umd.js) для angular. Для rxjs я использую классическое сопоставление, как в этом примере.

Кто-нибудь знает, что я здесь делаю неправильно?


person tschuege    schedule 14.09.2016    source источник
comment
Я использую angular2 RC6 и rxjs 5 beta 11, у меня такая же проблема.   -  person rgripper    schedule 15.09.2016


Ответы (2)


Rollup 0.34.0 работает с 2.0.0-rc.7 и проверено, что Rollup 0.34.0 работает и с 2.0.0, но мне удалось воспроизвести проблему с 0.35.0.

person steveblue    schedule 15.09.2016
comment
Это исправило это. Мне просто нужно было убедиться, что ни один из других пакетов npm не требует развертывания больше, чем 0.34.x, и тогда это сработало. Большое спасибо. - person tschuege; 19.09.2016

Кажется, в настоящее время есть две проблемы с rollup.

  • rollup не нормализует косые черты в путях ('/' против '\\'), и эта проблема все еще открыта . Чтобы исправить это, rollup.config.js необходимо следующее дополнение:
resolveId(id, from){
    if (id.startsWith('rxjs/') || id.startsWith('rxjs\\')){
        let result = `${__dirname}/node_modules/rxjs-es/${id.replace('rxjs/', '')}.js`;
        return result.replace(/\//g, "\\"); // Add this
    }
}
  • Он ломает код ES2015, но ES5 работает нормально, поэтому ему нужно скомпилировать rxjs-es в ES5 с модулями ES2015 и сделать так, чтобы резольвер свертки использовал его вместо этого. Вот отдельно tsconfig.rx.json:
{
    "compilerOptions": {
        "target": "ES5",
        "module": "ES2015",
        "moduleResolution": "node",
        "sourceMap": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "removeComments": true,
        "noImplicitAny": false,
        "skipLibCheck": true,
        "outDir": "temp/rxjs",
        "allowJs": true
    },
    "include": [
        "node_modules/rxjs-es/**/*.js"
    ],
    "exclude": [
        "wwwroot",
        "node_modules/rxjs-es/rx.js"
    ]
}

и rollup.config.js:

resolveId(id, from){
    if (id.startsWith('rxjs/') || id.startsWith('rxjs\\')){
        let result = `${__dirname}/temp/rxjs/${id.replace('rxjs/', '')}.js`;
        //let result = `${__dirname}/node_modules/rxjs-es/${id.replace('rxjs/', '')}.js`;
        return result.replace(/\//g, "\\");
    }
}
person rgripper    schedule 15.09.2016
comment
Я убедился, что OuterSubscriber отсутствует в моем пакете - person steveblue; 15.09.2016
comment
Я убедился, что OuterSubscriber отсутствует в моем пакете, но я работаю в OS X, а приведенное выше решение предназначено для компьютеров с Windows. - person steveblue; 15.09.2016
comment
Вторая часть может решить вашу проблему - person rgripper; 15.09.2016