Собираем модули в TypeScript
В посте про компиляцию TypeScript я не стал писать про компиляцию модулей. И как видите код примеров не содержит импортов. Я думаю, что на эту хитрость пошел не только я, но и писатели руководства по TypeScript. С модулями все становится интереснее, особенно для человека не имевшего дела с Javscript модулями. Давайте попытаемся заюзать модули. Установим RxJS:
npm install rxjs
Скопируем пример greeter.ts:
import { Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';
Observable.of(1,2,3).map(x => x + '!!!').forEach((x) => console.log(x)); // etc
И скопилируем:
$ node_modules/.bin/tsc greeter.ts
node_modules/rxjs/Observable.d.ts(1,15): error TS2307: Cannot find module 'rxjs-compat/Observable'.
Это можно поправить установив rxjs-compat:
npm install rxjs-compat
Но дальше летят еще странные ошибки:
$ node_modules/.bin/tsc greeter.ts
node_modules/rxjs/internal/Observable.d.ts(83,59): error TS2693: 'Promise' only refers to a type, but is being used as a value here.
node_modules/rxjs/internal/types.d.ts(34,84): error TS2304: Cannot find name 'Iterable'.
node_modules/rxjs/internal/types.d.ts(38,6): error TS2304: Cannot find name 'Symbol'.
Их я поправил с помощью google:
npm i --save-dev @types/bluebird @types/core-js@0.9.36
Отлично компилируется в greeter.js:
"use strict";
exports.__esModule = true;
var Observable_1 = require("rxjs/Observable");
require("rxjs/add/observable/of");
require("rxjs/add/operator/map");
Observable_1.Observable.of(1, 2, 3).map(function (x) { return x + '!!!'; }).forEach(function (x) { return console.log(x); });
И это работает в NodeJS:
$ node greeter.js
1!!!
2!!!
3!!!
Но мне хочется засунуть это в браузер.
А там нет require
.
И на помощь приходит Browserify:
npm install --save-dev browserify
node_modules/.bin/browserify greeter.js -o bundle.js
И на выходе я получаю bundle.js, который могу вставить в свой index.html:
<!DOCTYPE html>
<html>
<head><title>TypeScript Greeter</title></head>
<body>
<script src="bundle.js"></script>
</body>
</html>
Viola!
- Не раскрыта тема динамической загрузки модулей
- И совсем не понятно почему выбран модуль RxJS
Однако, я надеюсь, это не просто так.