使用 Apache thrift 在 Nativescript + Angular 中“无法读取未定义的 属性 'browser'”

'Cannot read property 'browser' of undefined' in Nativescript + Angular using Apache thrift

我正在尝试将 Apache Thrift 与我的 Angular & Nativescript 项目一起使用,但是通过 'tns preview --bundle' 或任何其他 tns 命令我得到

TypeError: Cannot read property 'browser' of undefined
File: "<unknown>, line: 1, column: 265

Apache Thrift v.0.11.0 / 1.0.0dev,Angular v.7.1.0,Nativescript v.5.1.0

在platforms/android/app/src/main/assets/app/vendor.js中我可以看到:

/* istanbul ignore next */
if (undefined.browser) {
    defaultEncoding = 'utf-8'
} else {
    var pVersionMajor = parseInt(undefined.version.split('.')[0].slice(1), 10)

当我期待 global.process.browser 之类的东西时,我却找不到 vendor.js 的另一个和平。 在另一个和平中,我可以看到类似 undefined.nextTick(...) 等的内容。 我知道这是某种 Babel 问题,但我不知道如何解决它。

我使用thrift --gen js:node 脚本生成我的thrift 文件(错误时没有意义)。没有它们,一切都很好,但是后来我试图从 thrift 执行任何 thrift 生成的 file/any 模块,我在上面得到一个异常。 my_component.ts

import { Component, OnInit } from '@angular/core';
import { TJSONProtocol } from 'thrift'; // or anything else 

@Component({...});

export class MyComponent implements OnInit {
    ngOnInit () {
        // console.log(TJSONProtocol); // Uncomment this string to get an exception.
    }
    constructor() {...};
}

ng serve 提供了任何问题。 我希望这里有任何方法可以解决这个错误并使 thrift 与 nativescript 兼容,或者以任何其他方式将 thrift 与 nativescript 一起使用。

当应用程序使用浏览器数据(文档、window 等)时,您需要确保仅当应用程序在浏览器本身中 运行 时才访问此数据,即在 nodejs 中不是这种情况。

为此,请将您需要使用的代码片段放在支票中,例如:

if (typeof window !== 'undefined') {
    // here runs your code...
    console.log(TJSONProtocol);
}

参见:https://angular.io/guide/universal#working-around-the-browser-apis

问题出在默认 webpack.config.js 中,由 Nativescript 提供。在:

plugins: [
        // Define useful constants like TNS_WEBPACK
        new webpack.DefinePlugin({
            "global.TNS_WEBPACK": "true",
            "process": undefined,
        })

您需要删除行 "process": undefined