Running Angular 5 applications inside webworker calls an undefined window object

I am trying to upgrade this (ngx-admin) free Angular template to Angular 5, and then try to run the entire application in WebWorker, as indicated in this SO Post .

I successfully upgraded the application to Angular 5 and it works fine, but when I try to configure the application to run inside Webworker, it causes the following error:

enter image description here

enter image description here

Full code (modified to Angular 5 and webworker) can be found here

I tried adding DefinePlugin to my webpack configuration, but no luck.

webpack.config.json:

new DefinePlugin({ window: undefined, document: undefined }), 

I managed to run the new empty angular-cli application inside the webworker, but I cannot run this template inside the webworker. I assume there is a node package that creates the problem.

Package.json:

 { "scripts": { "ng": "ng", "conventional-changelog": "conventional-changelog", "e2e": "protractor ./protractor.conf.js", "docs": "compodoc -p src/tsconfig.app.json -d docs", "docs:serve": "compodoc -p src/tsconfig.app.json -d docs -s", "release:changelog": "npm run conventional-changelog -- -p angular -i CHANGELOG.md -s", "build": "webpack", "start": "webpack-dev-server --port=4200", "test": "karma start ./karma.conf.js", "pree2e": "webdriver-manager update --standalone false --gecko false --quiet" }, "dependencies": { "@agm/core": "1.0.0-beta.2", "@angular/animations": "5.1.2", "@angular/common": "5.1.2", "@angular/compiler": "5.1.2", "@angular/core": "5.1.2", "@angular/forms": "5.1.2", "@angular/http": "5.1.2", "@angular/platform-browser": "5.1.2", "@angular/platform-browser-dynamic": "5.1.2", "@angular/platform-server": "5.1.2", "@angular/platform-webworker": "^5.1.2", "@angular/platform-webworker-dynamic": "^5.1.2", "@angular/router": "5.1.2", "@asymmetrik/angular2-leaflet": "^2.2.1", "@nebular/auth": "2.0.0-rc.3", "@nebular/theme": "2.0.0-rc.3", "@ng-bootstrap/ng-bootstrap": "1.0.0-beta.5", "@swimlane/ngx-charts": "^7.0.1", "angular2-chartjs": "0.3.0", "angular2-leaflet": "^0.1.0", "angular2-toaster": "4.0.0", "bootstrap": "4.0.0-beta.2", "chart.js": "2.5.0", "ckeditor": "4.6.2", "classlist.js": "1.1.20150312", "core-js": "2.5.1", "d3": "4.8.0", "font-awesome": "4.7.0", "intl": "1.2.5", "ionicons": "2.0.1", "leaflet": "^1.2.0", "nebular-icons": "1.0.6", "ng2-ckeditor": "1.1.9", "ng2-smart-table": "1.1.0", "ng2-tree": "2.0.0-alpha.10", "ngx-charts": "^3.0.2", "ngx-echarts": "1.2.2", "normalize.css": "6.0.0", "pace-js": "1.0.2", "roboto-fontface": "0.8.0", "rxjs": "5.5.6", "socicon": "3.0.5", "tether": "1.4.0", "tinymce": "4.5.7", "typeface-exo": "0.0.22", "web-animations-js": "2.2.5", "zone.js": "0.8.19" }, "devDependencies": { "@angular/cli": "1.5.0", "@angular/compiler-cli": "5.1.2", "@angular/language-service": "5.1.2", "@compodoc/compodoc": "1.0.5", "@types/d3-color": "1.0.4", "@types/jasmine": "2.5.54", "@types/jasminewd2": "2.0.3", "@types/leaflet": "^1.2.4", "@types/node": "8.5.2", "codelyzer": "3.2.1", "conventional-changelog-cli": "1.3.4", "husky": "0.13.3", "jasmine-core": "2.6.4", "jasmine-spec-reporter": "4.1.1", "karma": "1.7.1", "karma-chrome-launcher": "2.1.1", "karma-cli": "1.0.1", "karma-coverage-istanbul-reporter": "1.3.0", "karma-jasmine": "1.1.0", "karma-jasmine-html-reporter": "0.2.2", "npm-run-all": "4.1.2", "protractor": "5.1.2", "rimraf": "2.6.1", "stylelint": "7.13.0", "ts-node": "3.2.2", "tslint": "5.7.0", "tslint-language-service": "0.9.6", "typescript": "2.6.2", "webpack-dev-server": "~2.9.3", "webpack": "~3.8.1", "autoprefixer": "^6.5.3", "css-loader": "^0.28.1", "cssnano": "^3.10.0", "exports-loader": "^0.6.3", "file-loader": "^1.1.5", "html-webpack-plugin": "^2.29.0", "less-loader": "^4.0.5", "postcss-loader": "^1.3.3", "postcss-url": "^5.1.2", "raw-loader": "^0.5.1", "sass-loader": "^6.0.3", "source-map-loader": "^0.2.0", "istanbul-instrumenter-loader": "^2.0.0", "style-loader": "^0.13.1", "stylus-loader": "^3.0.1", "url-loader": "^0.6.2", "circular-dependency-plugin": "^3.0.0", "webpack-concat-plugin": "1.4.0", "copy-webpack-plugin": "^4.1.1", "uglifyjs-webpack-plugin": "1.0.0" } } 
+7
javascript angular webpack angular-cli angular5
source share
1 answer

Web workers do not start in a window and therefore do not have a window. However, if you use libraries that use the window object, you can assign it yourself using the self variable at the top of your code.

 const window = self; 

From MDN :

A worker is an object created using a constructor (for example, Worker ()) that launches a named JavaScript file - this file contains code that will run in the work branch; workers run in a different global context that is different from the current window. Thus , using the window shortcut to get the current global area (instead of itself) inside the Worker, return an error.

The work context is represented by the DedicatedWorkerGlobalScope object in the case of specialized workers (standard workers that are used by a single script; use of shared workers SharedWorkerGlobalScope). A dedicated worker is only accessible from the script that first generated it, while shared workers can be accessed from several scripts.

+5
source share

All Articles