Импортировать RxJS 6 в браузер?

Теперь, когда все современные браузеры поддерживают модули JavaScript, я пробую importКод прямо в браузере. Мы можем получить npm модули от http://unpkg.com/, и я нашел проект jspm, который оборачивает npm модули в формате, который может быть использован браузером.

Но у меня все еще есть проблемы, особенно с RxJS. RxJS, начиная с версии 6, рекомендует импортировать конструкторы и операторы следующим образом:

import { Observable, Subject, ReplaySubject, from, of, range } from 'rxjs';
import { map, filter, switchMap } from 'rxjs/operators';

Но если я попытаюсь сделать это в браузере с помощью:

import { Observable, Subject, ReplaySubject, from, of, range } from 'https://dev.jspm.io/rxjs@6';
import { map, filter, switchMap } from 'https://dev.jspm.io/rxjs@6/operators';

Я получаю ошибки по этим направлениям:

Uncaught SyntaxError: Запрошенный модуль ' https://dev.jspm.io/rxjs@6/operators' не обеспечивает экспорт с именем 'map'

Я могу обойти это, импортируя весь rxjs модуль и дразнить то, что мне нужно, как я бы использовал CDN:

import rxjs from 'https://dev.jspm.io/rxjs@6';
const { Observable } = rxjs;
import operators from 'https://dev.jspm.io/rxjs@6/operators';
const { map } = operators;

но это побеждает то, что команда Rx пытается сделать, чтобы уменьшить окончательный размер пакета и т.д.

Я уверен, что это не просто проблема RxJS.

Какое решение здесь движется вперед, чтобы наш dev javascript (импортируемый непосредственно в браузер) выглядел так, как будто мы хотели бы передать пакету?

1 ответ

Вот простой стартовый пример rxjs stackblitz:

Короче:

Убедитесь, что у вас есть скрипт для добавления файла rxjs js (например, из CDN)

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.1.0/rxjs.umd.js">

Все импортируется в пространство имен rxjs, поэтому для простого примера использования:

rxjs.of(1, 2, 3)
  .subscribe(x => {
    const element = document.createElement('div');
    element.innerText = 'Data: ' + x;
    document.body.appendChild(element)
  },
  err => { },
  () => {
    const element = document.createElement('div');
    element.innerText = 'All done';
    document.body.appendChild(element)
  });

Синтаксис экспорта модуля es6 находится внутри подпапки _esm2015, Так что вам нужно импортировать:

import { Observable, Subject, ReplaySubject, from, of, range } from 'https://dev.jspm.io/rxjs@6/_esm2015';
import { map, filter, switchMap } from 'https://dev.jspm.io/rxjs@6/_esm2015/operators';

К сожалению, вы не можете просто установить rxjs с npm install rxjs@6 а потом import в браузере, поскольку в источнике распространения отсутствует расширение файла .js в import заявления: https://unpkg.com/@reactivex/rxjs@6.3.3/dist/esm2015/index.js.

Но браузеру нужны расширения файла для import (на данный момент): ( https://developers.google.com/web/fundamentals/primers/modules):

// Not supported (yet):
import {shout} from 'jquery';
import {shout} from 'lib.mjs';
import {shout} from 'modules/lib.mjs';

// Supported:
import {shout} from './lib.mjs';
import {shout} from '../lib.mjs';
import {shout} from '/modules/lib.mjs';
import {shout} from 'https://simple.example/modules/lib.mjs';

Для этого также существует проблема: https://github.com/ReactiveX/rxjs/issues/4416.

На данный момент вы должны положиться на https://jspm.io/ или сделать свой собственный пакет (например, с накопительным пакетом, как предложено @Ovidiu Dolha).

Другие вопросы по тегам