Reactjs 无法分配给只读属性'__esModule';

Reactjs 无法分配给只读属性'__esModule';,reactjs,ecmascript-6,webpack,babeljs,redux,Reactjs,Ecmascript 6,Webpack,Babeljs,Redux,使用Webpack和Babel编译React和Redux应用程序时,我得到: 未捕获类型错误:无法分配给的只读属性“\uu esModule” 在一些较旧的浏览器中(我猜,您需要安装babel插件添加模块导出,并在中注册此插件: "plugins": [ "babel-plugin-add-module-exports" ] 有关更多信息,请访问。对象。某些Android 4股票浏览器版本和可能使用Webkit中错误实现的其他浏览器上的defineProperty已损坏 检查 并向铬项

使用Webpack和Babel编译React和Redux应用程序时,我得到:

未捕获类型错误:无法分配给的只读属性“\uu esModule”


在一些较旧的浏览器中(我猜,您需要安装
babel插件添加模块导出
,并在
中注册此插件:

"plugins": [
    "babel-plugin-add-module-exports"
]

有关更多信息,请访问。

对象。某些Android 4股票浏览器版本和可能使用Webkit中错误实现的其他浏览器上的defineProperty
已损坏

检查 并向铬项目汇报

好消息是你可以申请解决这个问题

为了使事情变得简单,您只需在捆绑包之前将polyfill复制并粘贴到
标签上即可


这将解决您的问题。

在我的例子中,我解决了在入口点中添加babel register库的问题

在webpack.config.js(配置的webpack 1.x版本)中


我们在安卓4.0上遇到了这个问题,目前我们无法削减对安卓4.0的支持

对于Webpack1.0,当您使用BabelPresetEnv时,只需将其设置为宽松:true。 但是对于Webpack2,松散模式无法解决此问题

最后,我们发现了这个把戏,有点难看

// client_patch.js, For Android 4.0
var defineProperty = Object.defineProperty;
Object.defineProperty = function (exports, name) {
  if (name === '__esModule') {
    exports[name] = true;
    return;
  }
  return defineProperty.apply(this, arguments);
};
并在您的网页包配置文件中

// webpack.config.js
entry: {
  main: [
    path.resolve(__dirname, 'client_patch.js'),
    'index.js'
  ]
}

我不知道为什么会失败。它只在模块开始时分配一次,任何东西都不应该重新分配它,所以这个错误非常奇怪。你能看到它抛出实际错误的位置吗?它抛出第一个导入的模块,其中
导出。u esModule=true;
存在。我假设在第一个
对象之后。defineP调用roperty
,共享导出对象变为只读,以便分配在以后松散构建的模块中中断(但仅在提到的浏览器中抛出)。我可能完全没有注意到这一点,因为除了提供的链接之外,我似乎无法发现其他人有此问题。但这正是我感到困惑的地方。
导出
不是共享的,它应该只局限于单个模块中。我将在稍后设置一个简单的项目来解决此问题,并将其附加到此处,以查看它是否揭示了任何内容。。。谢谢!我们鼓励您链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。请始终引用重要链接中最相关的部分,以防无法访问目标网站或永久脱机。
// client_patch.js, For Android 4.0
var defineProperty = Object.defineProperty;
Object.defineProperty = function (exports, name) {
  if (name === '__esModule') {
    exports[name] = true;
    return;
  }
  return defineProperty.apply(this, arguments);
};
// webpack.config.js
entry: {
  main: [
    path.resolve(__dirname, 'client_patch.js'),
    'index.js'
  ]
}