react-native start 报告:Error: UNKNOWN: 未知错误,打开 ...\.babel.json
react-native start 报告:Error: UNKNOWN: 未知错误,打开 ...\.babel.json
我在Windows 7上有一个正在开发的RN环境。一切都很好,直到昨天我运行“react-native start”后突然报错。\n错误信息:\n
[2016-12-26 09:58:17] HMR服务器正在监听 /hot React打包器就绪。 fs.js:557 return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); ^ 错误: UNKNOWN: 未知错误,打开 'C:\Users\xitao\.babel.json' at Object.fs.openSync (fs.js:557:18) at Object.fs.writeFileSync (fs.js:1222:33) at save (C:\RN\LearnRN\node_modules\babel-register\lib\cache.js:45:16) at _combinedTickCallback (internal/process/next_tick.js:67:7) at process._tickCallback (internal/process/next_tick.js:98:9) fs.js:557 return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); ^ 错误: UNKNOWN: 未知错误,打开 'C:\Users\xitao\.babel.json' at Object.fs.openSync (fs.js:557:18) at Object.fs.writeFileSync (fs.js:1222:33) at save (C:\RN\LearnRN\node_modules\babel-register\lib\cache.js:45:16) at _combinedTickCallback (internal/process/next_tick.js:67:7) at process._tickCallback (internal/process/next_tick.js:98:9) fs.js:557 return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); ^ 错误: UNKNOWN: 未知错误,打开 'C:\Users\xitao\.babel.json' at Object.fs.openSync (fs.js:557:18) at Object.fs.writeFileSync (fs.js:1222:33) at save (C:\RN\LearnRN\node_modules\babel-register\lib\cache.js:45:16) at _combinedTickCallback (internal/process/next_tick.js:67:7) at process._tickCallback (internal/process/next_tick.js:98:9)
\n我谷歌了这个错误,没有找到解决办法。\n我删除了.babel.json文件,错误仍然出现。\n我重新初始化了一个新项目,仍然是同样的错误。我卸载了node.js和python,然后按照RN官网的“入门指南”重新安装,仍然是同样的错误。\n我安装了react-native-cli 2.0.1和1.3.0,仍然是同样的错误。\n似乎这个RN项目即使有错误也可以工作。但你永远不知道这个错误什么时候会影响到我的项目。
问题的原因是在C:\Users\Me路径下存在一个无效的babel.json文件,解决方法是删除该文件并重新生成一个,并且给该文件授予读取权限。
具体步骤如下:
1. 删除.babel.json文件
2. 运行react-native run-android命令(重新生成.babel.json文件)
3. 在Windows资源管理器中打开C:\Users\yourUserName路径(不是IE浏览器)
4. 右键点击.babel.json文件,选择“属性”
5. 进入安全选项卡,点击“高级”按钮
6. 点击“更改权限...”按钮,再点击“添加...”按钮
7. 在“选择要应用的对象”输入框中输入Everyone,点击“确定”
8. 在权限窗口中勾选“允许完全控制”,点击“确定”
9. 点击“确定”
10. 再次运行react-native run-android命令(问题应该已解决)
问题的原因是:在构建过程中,babel-register在每个tick上将缓存写入~/.babel.json文件中。由于写入是同步的,所以在单个节点线程内不会出现竞争条件。由于Node是单线程设计,这必须是由Java中的某些并行执行触发了多个并行的节点线程。
解决方法是:需要在React Native中修复这个问题,可能需要与babel-register协调解决。可以将这个问题提交到相关的GitHub问题中,链接为https://github.com/facebook/react-native/issues/11803。
参考链接:https://stackoverflow.com/a/56617922/8740349