代码之家  ›  专栏  ›  技术社区  ›  vicatcu

在离子应用程序中使用Vega图表会导致在某些设备上启动时出现运行时语法错误

  •  0
  • vicatcu  · 技术社区  · 5 年前

    令我非常懊恼的是,我发现我在Android(8.0)手机和iPhone上成功开发和测试的Ionic 4应用程序在Android(8.1)平板电脑的启动屏幕上冻结,在iPad上启动时崩溃。使用 adb logcat vendor-es5.js ,当我深入到我的项目的www文件夹并转到错误的引用行时 SyntaxError: Unexpected token * ,我登陆的代码显然来自 node_modules/d3-delaunay/src/delaunay.js 它使用了es6求幂算子 **

    r = 1e-8 * Math.sqrt((bounds[3] - bounds[1])**2 + (bounds[2] - bounds[0])**2);
    

    我不知道为什么这个代码在你的电脑上有问题 一些 我也不知道是什么导致了这个代码,它不是es5(?)最后进了监狱 供应商-es5.js Math.pow() 果然,运行时走得更远了,但最终在一个来自的函数中再次搁浅 node_modules/vega-dataflow/src/dataflow/load.js 并抱怨说 SyntaxError: Unexpected token function ,具体来说:

    export async function request(url, format) {
    

    供应商-es5.js . 在这一点上,我觉得有些东西是系统性的错误在这里,我不准备了解如何克服它-也许切换图形库?如果可能的话,我想避免这种情况,所以我的问题是:

    1. 为什么会这样?
    2. 为什么它只对一些而不是所有的设备产生影响?

    更新#1

    因为它是一个Ionic4项目,这意味着它是一个angular8项目,这意味着它是一个Webpack项目(在平台的默认设置中)。所以这是我的 angular.json

    {
      "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
      "version": 1,
      "defaultProject": "app",
      "newProjectRoot": "projects",
      "projects": {
        "app": {
          "root": "",
          "sourceRoot": "src",
          "projectType": "application",
          "prefix": "app",
          "schematics": {},
          "architect": {
            "build": {
              "builder": "@angular-devkit/build-angular:browser",
              "options": {
                "outputPath": "www",
                "index": "src/index.html",
                "main": "src/main.ts",
                "polyfills": "src/polyfills.ts",
                "tsConfig": "tsconfig.app.json",
                "assets": [
                  {
                    "glob": "**/*",
                    "input": "src/assets",
                    "output": "assets"
                  },
                  {
                    "glob": "**/*.svg",
                    "input": "node_modules/ionicons/dist/ionicons/svg",
                    "output": "./svg"
                  }
                ],
                "styles": [
                  {
                    "input": "src/theme/variables.scss"
                  },
                  {
                    "input": "src/global.scss"
                  }
                ],
                "scripts": []
              },
              "configurations": {
                "production": {
                  "fileReplacements": [
                    {
                      "replace": "src/environments/environment.ts",
                      "with": "src/environments/environment.prod.ts"
                    }
                  ],
                  "optimization": true,
                  "outputHashing": "all",
                  "sourceMap": false,
                  "extractCss": true,
                  "namedChunks": false,
                  "aot": true,
                  "extractLicenses": true,
                  "vendorChunk": false,
                  "buildOptimizer": true,
                  "budgets": [
                    {
                      "type": "initial",
                      "maximumWarning": "2mb",
                      "maximumError": "5mb"
                    }
                  ]
                },
                "ci": {
                  "progress": false
                }
              }
            },
            "serve": {
              "builder": "@angular-devkit/build-angular:dev-server",
              "options": {
                "browserTarget": "app:build"
              },
              "configurations": {
                "production": {
                  "browserTarget": "app:build:production"
                },
                "ci": {
                  "progress": false
                }
              }
            },
            "extract-i18n": {
              "builder": "@angular-devkit/build-angular:extract-i18n",
              "options": {
                "browserTarget": "app:build"
              }
            },
            "test": {
              "builder": "@angular-devkit/build-angular:karma",
              "options": {
                "main": "src/test.ts",
                "polyfills": "src/polyfills.ts",
                "tsConfig": "tsconfig.spec.json",
                "karmaConfig": "karma.conf.js",
                "styles": [],
                "scripts": [],
                "assets": [
                  {
                    "glob": "favicon.ico",
                    "input": "src/",
                    "output": "/"
                  },
                  {
                    "glob": "**/*",
                    "input": "src/assets",
                    "output": "/assets"
                  }
                ]
              },
              "configurations": {
                "ci": {
                  "progress": false,
                  "watch": false
                }
              }
            },
            "lint": {
              "builder": "@angular-devkit/build-angular:tslint",
              "options": {
                "tsConfig": [
                  "tsconfig.app.json",
                  "tsconfig.spec.json",
                  "e2e/tsconfig.json"
                ],
                "exclude": ["**/node_modules/**"]
              }
            },
            "e2e": {
              "builder": "@angular-devkit/build-angular:protractor",
              "options": {
                "protractorConfig": "e2e/protractor.conf.js",
                "devServerTarget": "app:serve"
              },
              "configurations": {
                "production": {
                  "devServerTarget": "app:serve:production"
                },
                "ci": {
                  "devServerTarget": "app:serve:ci"
                }
              }
            },
            "ionic-cordova-build": {
              "builder": "@ionic/angular-toolkit:cordova-build",
              "options": {
                "browserTarget": "app:build"
              },
              "configurations": {
                "production": {
                  "browserTarget": "app:build:production"
                }
              }
            },
            "ionic-cordova-serve": {
              "builder": "@ionic/angular-toolkit:cordova-serve",
              "options": {
                "cordovaBuildTarget": "app:ionic-cordova-build",
                "devServerTarget": "app:serve"
              },
              "configurations": {
                "production": {
                  "cordovaBuildTarget": "app:ionic-cordova-build:production",
                  "devServerTarget": "app:serve:production"
                }
              }
            }
          }
        }
      },
      "cli": {
        "defaultCollection": "@ionic/angular-toolkit"
      },
      "schematics": {
        "@ionic/angular-toolkit:component": {
          "styleext": "scss"
        },
        "@ionic/angular-toolkit:page": {
          "styleext": "scss"
        }
      }
    }
    

    ... 这是我的 package.json 项目文件:

    {
      "dependencies": {
        "@angular/common": "~8.1.2",
        "@angular/core": "~8.1.2",
        "@angular/forms": "~8.1.2",
        "@angular/http": "^7.2.15",
        "@angular/platform-browser": "~8.1.2",
        "@angular/platform-browser-dynamic": "~8.1.2",
        "@angular/router": "~8.1.2",
        "@ionic-native/core": "^5.15.1",
        "@ionic/angular": "^4.7.1",
        "vega": "~5.6.0",
        "vega-lite": "^3.4.0",
        "vega-themes": "^2.4.0",
        "zone.js": "~0.9.1"
      },
      "devDependencies": {
        "@angular-devkit/architect": "~0.801.2",
        "@angular-devkit/build-angular": "~0.801.2",
        "@angular-devkit/core": "~8.1.2",
        "@angular-devkit/schematics": "~8.1.2",
        "@angular/cli": "~8.1.2",
        "@angular/compiler": "~8.1.2",
        "@angular/compiler-cli": "~8.1.2",
        "@angular/language-service": "~8.1.2",
        "@ionic/angular-toolkit": "~2.0.0",
        "@types/jasmine": "~3.3.8",
        "@types/jasminewd2": "~2.0.3",
        "@types/node": "~8.9.4",
        "codelyzer": "^5.0.0",
        "jasmine-core": "~3.4.0",
        "jasmine-spec-reporter": "~4.2.1",
        "karma": "~4.1.0",
        "karma-chrome-launcher": "~2.2.0",
        "karma-coverage-istanbul-reporter": "~2.0.1",
        "karma-jasmine": "~2.0.1",
        "karma-jasmine-html-reporter": "^1.4.0",
        "protractor": "~5.4.0",
        "ts-node": "~7.0.0",
        "tslint": "~5.15.0",
        "typescript": "~3.4.3"
      }
    }
    

    更新#2

    继续尝试并解决这个问题,我对 :

      "dependences": 
        "tslib": added => "^1.10.0" 
        "vega": "~5.6.0" => "^5.9.0"
        "vega-lite": "^3.4.0" => "^4.0.2"
    
      "devDependencies": 
        "@angular/compiler": "~8.1.2" => "~8.2.9"
        "@angular/compiler-cli": "~8.1.2" => "~8.2.9"
        "typescript": "~3.4.3" => "~3.5.3"
    

    www/vendor-es5.js adb日志 设备)。

    tsconfig.json 项目中的文件:

    {
      "compileOnSave": false,
      "compilerOptions": {
        "baseUrl": "./",
        "outDir": "./dist/out-tsc",
        "sourceMap": true,
        "declaration": false,
        "module": "esnext",
        "moduleResolution": "node",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "importHelpers": true,
        "target": "es2015",
        "typeRoots": [
          "node_modules/@types"
        ],
        "lib": [
          "es2018",
          "dom"
        ]
      },
      "angularCompilerOptions": {
        "fullTemplateTypeCheck": true,
        "strictInjectionParameters": true
      }
    }
    

    ... 至于 vega

        const theme = vega.fivethirtyeight;
        this._view = new vega.View(vega.parse(vegaSpec, theme), {})
          .initialize(this.container.nativeElement)
          .logLevel(vega.Warn)
          .renderer('svg');
    

    adb日志 输出到 E

    01-10 09:17:27.650  6413  6413 E ApkAssets: Error while loading asset assets/natives_blob_64.bin: java.io.FileNotFoundException: assets/natives_blob_64.bin
    01-10 09:17:27.651  6413  6413 E ApkAssets: Error while loading asset assets/snapshot_blob_64.bin: java.io.FileNotFoundException: assets/snapshot_blob_64.bin
    01-10 09:17:27.680  6413  6413 E         : appName=xxxxxx, acAppName=/system/bin/surfaceflinger
    01-10 09:17:27.680  6413  6413 E         : 0
    01-10 09:17:27.683  6413  6413 E         : appName=xxxxxx, acAppName=vStudio.Android.Camera360
    01-10 09:17:27.683  6413  6413 E         : 0
    01-10 09:17:27.781  6413  6413 E MPlugin : Unsupported class: com.mediatek.common.telephony.IOnlyOwnerSimSupport
    01-10 09:17:28.153  6413  6464 E libEGL  : validate_display:99 error 3008 (EGL_BAD_DISPLAY)
    01-10 09:17:28.432  6413  6464 E         : appName=xxxxxx, acAppName=vStudio.Android.Camera360
    01-10 09:17:28.433  6413  6464 E         : 0
    01-10 09:17:28.436  6413  6464 E         : appName=xxxxxx, acAppName=vStudio.Android.Camera360
    01-10 09:17:28.436  6413  6464 E         : 0
    01-10 09:17:28.437  6413  6464 E         : appName=xxxxxx, acAppName=vStudio.Android.Camera360
    01-10 09:17:28.437  6413  6464 E         : 0
    01-10 09:17:30.514  6413  6455 E         : appName=xxxxxx, acAppName=vStudio.Android.Camera360
    01-10 09:17:30.514  6413  6455 E         : 0
    01-10 09:17:30.515  6413  6455 E         : app
    

    ... 好的措施是 W (警告)线路:

    01-10 09:17:27.835  6413  6413 W chromium: [WARNING:password_handler.cc(33)] create-->contents = 0x9c66ec00, delegate = 0xa4b7edd0
    01-10 09:17:27.835  6413  6413 W chromium: [WARNING:password_handler.cc(41)] attaching to web_contents 
    01-10 09:17:27.837  6413  6413 W cr_AwContents: onDetachedFromWindow called when already detached. Ignoring
    01-10 09:17:28.185  6413  6455 W libEGL  : [ANDROID_RECORDABLE] format: 1
    01-10 09:17:28.209  6413  6464 W VideoCapabilities: Unrecognized profile/level 1/32 for video/mp4v-es
    01-10 09:17:28.209  6413  6464 W VideoCapabilities: Unrecognized profile/level 32768/2 for video/mp4v-es
    01-10 09:17:28.209  6413  6464 W VideoCapabilities: Unrecognized profile/level 32768/64 for video/mp4v-es
    01-10 09:17:28.244  6413  6455 W libEGL  : [ANDROID_RECORDABLE] format: 1
    01-10 09:17:28.248  6413  6464 W VideoCapabilities: Unsupported mime video/x-ms-wmv
    01-10 09:17:28.253  6413  6464 W VideoCapabilities: Unsupported mime video/divx
    01-10 09:17:28.262  6413  6464 W VideoCapabilities: Unsupported mime video/xvid
    01-10 09:17:28.268  6413  6464 W VideoCapabilities: Unsupported mime video/flv1
    01-10 09:17:28.274  6413  6464 W VideoCapabilities: Unrecognized profile/level 1/32 for video/mp4v-es
    01-10 09:17:28.485  6413  6413 W cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 6413
    01-10 09:17:28.568  6413  6413 W cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 6413
    
    0 回复  |  直到 5 年前
        1
  •  4
  •   nickbullock    5 年前

    首先我想说的是 vega 包错误-我认为通过npm传递未翻译的代码是一种不好的方法。例如 Angular Package Format 不是很清楚 angular 所以让我们来解决它。

    为什么会这样?

    因为有些开发人员在 es6+ 标准和它是好的,直到你需要 es5 es5级 es6 织女星 ).

    为什么它只对一些而不是所有的设备产生影响?

    老实说,我在本地移动开发方面的经验非常有限——我在这里只能说,例如移动Chrome和桌面Chrome在引擎上有一些不同。这意味着不能保证使用相同的软件将提供相同的结果。有时你可以在手机浏览器中找到漏洞,但在桌面浏览器中却无法重现。

    我认为在你的情况下,一些带有浏览器引擎的设备可以使用 代码-有些就是做不到。

    有没有一种方法可以让我在不切换到其他图形库的情况下解决这个问题?

    对。 我创造了一个 repo 与您的设置非常相似-简单 ionic@4 项目基于 angular@8 .

    es5级 欧洲标准6 混合的。让我们全力以赴吧 es5级 兼容在任何浏览器中工作(我甚至在 ie11 ).
    完成工作的步骤:

    1. 安装依赖项。我们将需要他们采取进一步措施。
    npm i -S regenerator-runtime
    npm i -D @angular-builders/custom-webpack babel-loader @babel/core @babel/preset-env
    
    1. target 属性到 在里面 tsconfig . "target": "es5"
    2. 我们将传送 async/await regenerator-runtime 要添加到的polyfill polyfills.ts 作为 import 'regenerator-runtime/runtime'
    3. 主要步骤。在中更改生成器 angular.json 并将路径添加到 webpack.config.js build serve
           "build": {
              "builder": "@angular-builders/custom-webpack:browser",
              "options": {
                "customWebpackConfig": {
                     "path": "./webpack.config.js"
                  },
    ...
            "serve": {
              "builder": "@angular-builders/custom-webpack:dev-server",
    
    1. 创建 在根文件夹与规则传输织女星和它的依赖关系。我发现他们非常迫切。
    // these dependencies are es6!!!
    const transpileList = ['node_modules/vega', 'node_modules/d3', 'node_modules/delaunator'];
    
    module.exports = function(base) {
        return {
            ...base,
            module: {
                ...base.module,
                rules: [
                    ...base.module.rules,
                    {
                        test: function(fileName) {
                            return transpileList.some(name => fileName.includes(name)) && fileName.endsWith('.js');
                        },
                        use: {
                            loader: 'babel-loader',
                            options: {
                                presets: ['@babel/preset-env']
                            }
                        }
                    }
                ]
            }
        }
    }
    

    es5级 ie11公司