无法将我自己的polyfill用于React Native Object.assign

时间:2018-12-12 20:04:57

标签: reactjs react-native polyfills

由于此问题https://github.com/facebook/metro/commit/9773229227895bfc5a5bde969108a4cbcc270eab#diff-ce1179d24387784c3c5f856c4b5b55d8R59

在某些情况下,

Object.assign在RN的开发版本上失败(在上面的链接的注释中进行了解释)。问题是我的一个节点模块触发了这种特定情况。出于这个原因,我需要填充。

我正在尝试填充自己的Object.assign(基于此https://github.com/facebook/react-native/blob/1151c096dab17e5d9a6ac05b61aacecd4305f3db/Libraries/polyfills/Object.es6.js,除非不检查现有的内容)

当我从节点模块中注销global时,我可以看到它指向我的代码

Object: ƒ Object()
arguments: (...)
assign: ƒ assign(target, varArgs)
arguments: (...)
caller: (...)
length: 2
name: "assign"
prototype: {constructor: ƒ}
__proto__: ƒ ()
[[FunctionLocation]]: objectAssign-polyfill.js:2
[[Scopes]]: Scopes[1]

但是,节点模块似乎仍在使用自己的Object.assign而不是我的多填充模块。

当我修改节点模块中的代码以使用global.Object.assign时,它似乎终于可以工作了。但是,有没有一种方法可以不这样做(因为那样的话我就必须在所有地方都这样做)?

代码如下:

// objectAssign-polyfill.js
Object.defineProperty(Object, 'assign', {
    value: function assign(target, varArgs) {
        'use strict';
        if (target == null) {
            throw new TypeError('Cannot convert undefined or null to object');
        }

        let to = Object(target);

        for (let index = 1; index < arguments.length; index++) {
            let nextSource = arguments[index];

            if (nextSource != null) {
                for (let nextKey in nextSource) {
                    if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
                        to[nextKey] = nextSource[nextKey];
                    }
                }
            }
        }
        return to;
    },
    writable: true,
    configurable: true,
});

// shims.js
import "node-libs-react-native/globals";
import './objectAssign-polyfill'
import { btoa } from "Base64";
import nodeUrl from 'url';

global.btoa = btoa;
global.URL = class URL {
    constructor(url) {
        return nodeUrl.parse(url)
    }
}

// index.js (the root of my RN app)
/** @format */
import "./shims";
import { AppRegistry } from "react-native";
import Core from "./Core";
import { name as appName } from "./app.json";

AppRegistry.registerComponent(appName, () => Core);

0 个答案:

没有答案