admin管理员组文章数量:1188018
I am working with the library ng2-mqtt and I used it im my component like this:
import 'ng2-mqtt/mqttws31.js';
declare var Paho: any;
Now I am getting following error:
ReferenceError: window is not defined at Object.<anonymous> (/Users/Picchu/Documents/em3/node_modules/ng2-mqtt/mqttws31.js:2143:4) at Module._compile (module.js:556:32) at Object.Module._extensions..js (module.js:565:10) at Module.load (module.js:473:32) at tryModuleLoad (module.js:432:12) at Function.Module._load (module.js:424:3) at Module.require (module.js:483:17) at require (internal/module.js:20:19) at Object.<anonymous> (/Users/Picchu/Documents/em3/dist/server.js:18707:18)
How can I fix this issue?
I am working with the library ng2-mqtt and I used it im my component like this:
import 'ng2-mqtt/mqttws31.js';
declare var Paho: any;
Now I am getting following error:
ReferenceError: window is not defined at Object.<anonymous> (/Users/Picchu/Documents/em3/node_modules/ng2-mqtt/mqttws31.js:2143:4) at Module._compile (module.js:556:32) at Object.Module._extensions..js (module.js:565:10) at Module.load (module.js:473:32) at tryModuleLoad (module.js:432:12) at Function.Module._load (module.js:424:3) at Module.require (module.js:483:17) at require (internal/module.js:20:19) at Object.<anonymous> (/Users/Picchu/Documents/em3/dist/server.js:18707:18)
How can I fix this issue?
Share Improve this question asked Oct 20, 2017 at 13:12 mogli moglimogli mogli 2631 gold badge5 silver badges15 bronze badges 1- 2 You can run this part of the code selectively only in the browser by using isPlatformBrowser available in angular/common – Ahmed Shabib Commented Oct 27, 2017 at 4:03
5 Answers
Reset to default 9UPDATE
Extending Leon Li's answer, we can avoid loading components that cannot be rendered on server side if it requires Browser APIs like location or window.
This answer explains how to use
import { PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser, isPlatformServer } from '@angular/common';
constructor( @Inject(PLATFORM_ID) platformId: Object) {
this.isBrowser = isPlatformBrowser(platformId);
}
Just inject PLATFORM_ID into your service, and pass it to isPlatformBrowser
or isPlatformServer
to get a Boolean value. Accordingly you can show/hide the components that cannot be rendered on server if they depend on Browser APIs.
One possible way to avoid server error is not to render the component(if it is an option) that uses window
. Something like:
<ng-container *ngIf="isBrowser">
<!-- mqttws31-component -->
<mqttws31-component></mqttws31-component>
</ng-container>
The isBrowser can be imported from(ng2)
import { isBrowser } from 'angular2-universal';
Or if ng4+, you can also define this in your browser module:
// app.browser
@NgModule({
providers: [
{ provide: 'isBrowser', useValue: true }
]
})
then inject from constructor
export class SomeComponent implements OnInit {
constructor(@Inject('isBrowser') private isBrowser: boolean)
ngOnInit() {
// example usage, this could be anywhere in this Component of course
if (this.isBrowser) {
alert('we're in the browser!');
}
}
Angular 6 In server.ts use:
const domino = require('domino');
const fs = require('fs');
const path = require('path');
const template = fs.readFileSync('dist/browser/index.html').toString();
const win = domino.createWindow(template);
global['window'] = win;
global['document'] = win.document;
global['DOMTokenList'] = win.DOMTokenList;
global['Node'] = win.Node;
global['Text'] = win.Text;
global['HTMLElement'] = win.HTMLElement;
global['navigator'] = win.navigator;
window
shouldn't be used in universal applications on server side, because Node.js doesn't have window
, and having a dummy global.window
currently affects the way Angular detects global variable.
If the package uses window
, an issue can be opened in its repository and/or it can be forked and changed to not use window
.
Since packages that rely on window
often rely on things that are specific to client side, they won't work as expected on server side even if this issue is sorted out.
Package description says:
Depends on the library from: https://eclipse.org/paho/clients/js/
While library description says:
The Paho JavaScript Client is an MQTT browser-based client library written in Javascript that uses WebSockets to connect to an MQTT Broker.
Usually third-party Angular module that isn't supposed to work as expected on server side should be stubbed or mocked; dummy module with fake directives and services is imported in app.server.ts
instead of real module.
Work for me ng9+
// app.module.ts
@NgModule({
providers: [
{ provide: 'isBrowser', useValue: true }
]
})
and replace absolute path (remove first /):
/assets/images/... to assets/images/...
本文标签: javascriptwindow is not defined angular universal third libraryStack Overflow
版权声明:本文标题:javascript - window is not defined angular universal third library - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1738361717a2080854.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论