230 lines
6.0 KiB
Markdown
230 lines
6.0 KiB
Markdown
# Zone.js's support for non standard apis
|
|
|
|
Zone.js patched most standard APIs such as DOM event listeners, XMLHttpRequest in Browser, EventEmitter and fs API in Node.js so they can be in zone.
|
|
|
|
But there are still a lot of non standard APIs that are not patched by default, such as MediaQuery, Notification,
|
|
WebAudio and so on. We are adding support to those APIs, and our progress is updated here.
|
|
|
|
## Currently supported non standard Web APIs
|
|
|
|
* MediaQuery
|
|
* Notification
|
|
|
|
## Currently supported polyfills
|
|
|
|
* webcomponents
|
|
|
|
Usage:
|
|
|
|
```
|
|
<script src="webcomponents-lite.js"></script>
|
|
<script src="node_modules/zone.js/dist/zone.js"></script>
|
|
<script src="node_modules/zone.js/dist/webapis-shadydom.js"></script>
|
|
```
|
|
|
|
## Currently supported non standard node APIs
|
|
|
|
## Currently supported non standard common APIs
|
|
|
|
* bluebird promise
|
|
|
|
Browser Usage:
|
|
|
|
```
|
|
<script src="zone.js"></script>
|
|
<script src="bluebird.js"></script>
|
|
<script src="zone-bluebird.js"></script>
|
|
<script>
|
|
Zone[Zone['__symbol__']('bluebird')](Promise);
|
|
</script>
|
|
```
|
|
|
|
After those steps, window.Promise will become a ZoneAware Bluebird Promise.
|
|
|
|
Node Sample Usage:
|
|
|
|
```
|
|
require('zone.js');
|
|
const Bluebird = require('bluebird');
|
|
require('zone.js/dist/zone-bluebird');
|
|
Zone[Zone['__symbol__']('bluebird')](Bluebird);
|
|
Zone.current.fork({
|
|
name: 'bluebird'
|
|
}).run(() => {
|
|
Bluebird.resolve(1).then(r => {
|
|
console.log('result ', r, 'Zone', Zone.current.name);
|
|
});
|
|
});
|
|
```
|
|
|
|
In NodeJS environment, you can choose to use Bluebird Promise as global.Promise
|
|
or use ZoneAwarePromise as global.Promise.
|
|
|
|
To run the jasmine test cases of bluebird
|
|
|
|
```
|
|
npm install bluebird
|
|
```
|
|
|
|
then modify test/node_tests.ts
|
|
remove the comment of the following line
|
|
|
|
```
|
|
//import './extra/bluebird.spec';
|
|
```
|
|
|
|
## Others
|
|
|
|
* Cordova
|
|
|
|
patch `cordova.exec` API
|
|
|
|
`cordova.exec(success, error, service, action, args);`
|
|
|
|
`success` and `error` will be patched with `Zone.wrap`.
|
|
|
|
to load the patch, you should load in the following order.
|
|
|
|
```
|
|
<script src="zone.js"></script>
|
|
<script src="cordova.js"></script>
|
|
<script src="zone-patch-cordova.js"></script>
|
|
```
|
|
|
|
## Usage
|
|
|
|
By default, those APIs' support will not be loaded in zone.js or zone-node.js,
|
|
so if you want to load those API's support, you should load those files by yourself.
|
|
|
|
For example, if you want to add MediaQuery patch, you should do like this:
|
|
|
|
```
|
|
<script src="path/zone.js"></script>
|
|
<script src="path/webapis-media-query.js"></script>
|
|
```
|
|
|
|
* rxjs
|
|
|
|
`zone.js` also provide a `rxjs` patch to make sure rxjs Observable/Subscription/Operator run in correct zone.
|
|
For details please refer to [pull request 843](https://github.com/angular/zone.js/pull/843). The following sample code describes the idea.
|
|
|
|
```
|
|
const constructorZone = Zone.current.fork({name: 'constructor'});
|
|
const subscriptionZone = Zone.current.fork({name: 'subscription'});
|
|
const operatorZone = Zone.current.fork({name: 'operator'});
|
|
|
|
let observable;
|
|
let subscriber;
|
|
constructorZone.run(() => {
|
|
observable = new Observable((_subscriber) => {
|
|
subscriber = _subscriber;
|
|
console.log('current zone when construct observable:', Zone.current.name); // will output constructor.
|
|
return () => {
|
|
console.log('current zone when unsubscribe observable:', Zone.current.name); // will output constructor.
|
|
}
|
|
});
|
|
});
|
|
|
|
subscriptionZone.run(() => {
|
|
observable.subscribe(() => {
|
|
console.log('current zone when subscription next', Zone.current.name); // will output subscription.
|
|
}, () => {
|
|
console.log('current zone when subscription error', Zone.current.name); // will output subscription.
|
|
}, () => {
|
|
console.log('current zone when subscription complete', Zone.current.name); // will output subscription.
|
|
});
|
|
});
|
|
|
|
operatorZone.run(() => {
|
|
observable.map(() => {
|
|
console.log('current zone when map operator', Zone.current.name); // will output operator.
|
|
});
|
|
});
|
|
```
|
|
|
|
Currently basically everything the `rxjs` API includes
|
|
|
|
- Observable
|
|
- Subscription
|
|
- Subscriber
|
|
- Operators
|
|
- Scheduler
|
|
|
|
is patched, so each asynchronous call will run in the correct zone.
|
|
|
|
## Usage.
|
|
|
|
For example, in an Angular application, you can load this patch in your `app.module.ts`.
|
|
|
|
```
|
|
import 'zone.js/dist/zone-patch-rxjs';
|
|
```
|
|
|
|
* electron
|
|
|
|
In electron, we patched the following APIs with `zone.js`
|
|
|
|
1. Browser API
|
|
2. NodeJS
|
|
3. Electorn Native API
|
|
|
|
## Usage.
|
|
|
|
add following line into `polyfill.ts` after loading zone-mix.
|
|
|
|
```
|
|
//import 'zone.js/dist/zone'; // originally added by angular-cli, comment it out
|
|
import 'zone.js/dist/zone-mix'; // add zone-mix to patch both Browser and Nodejs
|
|
import 'zone.js/dist/zone-patch-electron'; // add zone-patch-electron to patch Electron native API
|
|
```
|
|
|
|
there is a sampel repo [zone-electron](https://github.com/JiaLiPassion/zone-electron).
|
|
|
|
* socket.io-client
|
|
|
|
user need to patch `io` themselves just like following code.
|
|
|
|
```javascript
|
|
<script src="socket.io-client/dist/socket.io.js"></script>
|
|
<script src="zone.js/dist/zone.js"></script>
|
|
<script src="zone.js/dist/zone-patch-socket-io.js"></script>
|
|
<script>
|
|
// patch io here
|
|
Zone[Zone.__symbol__('socketio')](io);
|
|
</script>
|
|
```
|
|
|
|
please reference the sample repo [zone-socketio](https://github.com/JiaLiPassion/zone-socketio) about
|
|
detail usage.
|
|
|
|
* jsonp
|
|
|
|
## Usage.
|
|
|
|
provide a helper method to patch jsonp. Because jsonp has a lot of implementation, so
|
|
user need to provide the information to let json `send` and `callback` in zone.
|
|
|
|
there is a sampel repo [zone-jsonp](https://github.com/JiaLiPassion/test-zone-js-with-jsonp) here,
|
|
sample usage is:
|
|
|
|
```javascript
|
|
import 'zone.js/dist/zone-patch-jsonp';
|
|
Zone['__zone_symbol__jsonp']({
|
|
jsonp: getJSONP,
|
|
sendFuncName: 'send',
|
|
successFuncName: 'jsonpSuccessCallback',
|
|
failedFuncName: 'jsonpFailedCallback'
|
|
});
|
|
```
|
|
* ResizeObserver
|
|
|
|
Currently only `Chrome 64` native support this feature.
|
|
you can add the following line into `polyfill.ts` after loading `zone.js`.
|
|
|
|
```
|
|
import 'zone.js/dist/zone';
|
|
import 'zone.js/dist/zone-patch-resize-observer';
|
|
```
|
|
|
|
there is a sample repo [zone-resize-observer](https://github.com/JiaLiPassion/zone-resize-observer) here
|