![](/img/trans.png)
[英]Angular Server side rendering error HTMLCanvasElement.exports.nyi
[英]Angular 9 universal Server side rendering (SSR) error HTMLCanvasElement
Error: NotYetImplemented
at HTMLCanvasElement.Wo4J.exports.nyi (/path/server/main.js:1:3906285)
at rj.nf (/path/server/main.js:1:1929447)
at /path/server/main.js:1:1930713
at Object.ADia (/path/server/main.js:1:2061225)
at __webpack_require__ (/path/server/main.js:1:295)
at Object.7PEY (/path/server/main.js:1:1216808)
at __webpack_require__ (/path/sen3aPro/server/main.js:1:295)
at Object.d2mR (/path/server/main.js:1:5425768)
at __webpack_require__ (/path/server/main.js:1:295)
at Object.ZAI4 (/path/server/main.js:1:3975117)
我收到此錯誤 angular 9 服務器端渲染我正在使用開放街道 map (OSM),我認為ngx-openlayers會導致此問題,因為當我刪除它時我沒有錯誤
我嘗試僅在客戶端加載AngularOpenlayersModule模塊和使用此模塊的組件,但沒有運氣
我的SharedModule.ts :
import {NgModule, PLATFORM_ID} from '@angular/core';
import {OsmViewComponent} from './osm-view/osm-view.component';
import {AngularOpenlayersModule} from 'ngx-openlayers';
import {CommonModule, isPlatformBrowser} from '@angular/common';
let osmC = [];
let ol = [];
if (isPlatformBrowser(PLATFORM_ID)) {
osmC = [OsmViewComponent];
ol = [AngularOpenlayersModule];
}
@NgModule({
imports: [
CommonModule,
AngularOpenlayersModule
],
declarations: [
OsmViewComponent
],
exports: [
OsmViewComponent
],
})
export class SharedModule {}
我的依賴是:
"dependencies": {
"@angular/animations": "~9.0.3",
"@angular/cdk": "^9.1.2",
"@angular/common": "~9.0.3",
"@angular/compiler": "~9.1.3",
"@angular/core": "~9.1.3",
"@angular/fire": "^5.4.0",
"@angular/forms": "~9.0.3",
"@angular/platform-browser": "~9.0.3",
"@angular/platform-browser-dynamic": "~9.0.3",
"@angular/router": "~9.0.3",
"@auth0/angular-jwt": "^4.2.0",
"@fortawesome/fontawesome-free": "^5.12.1",
"@types/chart.js": "^2.9.15",
"animate.css": "^3.7.2",
"boostrap": "^2.0.0",
"bootstrap": "^4.1.3",
"chart.js": "^2.9.3",
"easy-pie-chart": "^2.1.7",
"firebase": "^7.14.4",
"get-blob-duration": "^1.1.0",
"hammerjs": "^2.0.8",
"lodash": "^4.17.15",
"mdbootstrap": "^4.14.0",
"ng-circle-progress": "^1.5.1",
"ng-uikit-pro-standard": "file:ng-uikit-pro-standard-9.0.0.tgz",
"ng2-charts": "^2.3.0",
"ng5-slider": "^1.2.4",
"ngx-device-detector": "^1.4.2",
"ngx-openlayers": "^1.0.0-next.15",
"ol": "^6.3.1",
"openlayers": "^4.6.5",
"recordrtc": "^5.5.9",
"rxjs": "~6.5.4",
"screenfull": "^3.3.0",
"tslib": "^1.10.0",
"units-converter": "^1.0.2",
"zone.js": "~0.10.2"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.900.4",
"@angular/cli": "~9.1.3",
"@angular/compiler-cli": "~9.1.3",
"@angular/language-service": "~9.0.3",
"@types/node": "^12.11.1",
"@types/jasmine": "~3.5.0",
"@types/jasminewd2": "~2.0.3",
"codelyzer": "^5.1.2",
"jasmine-core": "~3.5.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~4.3.0",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~2.1.0",
"karma-jasmine": "~2.0.1",
"karma-jasmine-html-reporter": "^1.4.2",
"protractor": "~5.4.3",
"ts-node": "~8.3.0",
"tslint": "~5.18.0",
"typescript": "~3.7.5"
}
就像我在這個答案中指出的那樣,開放層依賴於pixelworks
庫,它會在導入庫時嘗試創建 canvas 元素(即使您實際上並未實例化開放層映射)。 這在服務器端不起作用,會導致 SSR 進程崩潰
基於我不需要渲染 map 服務器端這一事實,我的 hack 是修改server.js
文件(或main.js
9+ 的 main.js)以刪除有問題的代碼位
sed -i "s/var context = document.createElement('canvas').getContext('2d');/var context = null;/" dist/server.js
這將允許代碼執行繼續服務器端。 當客戶端 angular 應用程序接管時,map 將僅在瀏覽器中啟動。
在創建 map 的組件中,您還可以使用 isPlatformbrowser 檢查您是在執行代碼客戶端還是服務器端僅實例化isPlatformbrowser
客戶端
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.