跳到主要内容

19 篇带有“发布”标签的帖子

查看所有标签

发布 React Native 0.65

·3 分钟阅读
Luna Wei
魏璐娜
Meta 软件工程师

今天我们发布了 React Native 0.65 版本,其中包含新版 Hermes、辅助功能改进、包升级等。

Hermes 0.8 有什么新功能?

Hermes,Facebook 开源的、为 React Native 优化的 JavaScript VM,已升级到 0.8.1 版本。此版本的一些突出功能包括:

你可以在这里找到完整的 Hermes 变更日志

按照这里的步骤,如果你的应用还没有启用 Hermes,请启用它以利用这些新功能和提升!

辅助功能修复和添加

去年,Facebook 签署了 GAAD 承诺,以改善 React Native 的可访问性。0.65 版本分享了这项承诺的成果和其他可访问性方面的成就!一些值得注意的更改包括

  • 允许为 iOS 指定高对比度明暗值。更多详细信息请参阅文档
  • 在 Android 上添加了 getRecommendedTimeoutMillis API。这暴露了用户在 Android 可访问性选项中设置的首选默认超时值,适用于可能需要额外时间查看或触达控件等的用户。
  • 常规修复,以确保 TalkBack/VoiceOver 正确播报组件上的 UI 状态,例如 disabledunselected

你可以在这里关注或贡献我们的未解决的辅助功能问题

重要的依赖版本更新和注意事项

  • 现在需要将 react-native-codegen 版本 0.0.7 作为 package.json 中的 devDependency
  • JCenter 已停止服务并变为只读。我们已将 JCenter 作为 Maven 仓库移除,并更新了依赖项以使用 MavenCentral 和 Jitpack。
  • 将 OkHttp 从 v3 升级到 v4.9.1。有关更改的更多详细信息,请参阅升级到 OkHttp 4
  • 升级到 Flipper 0.93 以支持 Xcode 12.5。请参阅此处 Flipper 的更新日志
  • 支持 Android Gradle 插件 7
  • Apple Silicon 需要链接器变通方法。请参阅@mikehardy 的说明

感谢!

此版本包含来自 61 位贡献者的超过 1100 个提交。感谢所有为此版本做出贡献和提供支持的人!您可以在此处找到完整的变更日志

发布 React Native 0.64,支持 iOS 上的 Hermes

·阅读时间:4 分钟
Mike Grabowski
Mike Grabowski
CTO 兼 Callstack 联合创始人

今天我们发布 React Native 0.64,它附带了对 iOS 上 Hermes 的支持。

iOS 上的 Hermes 可选启用

Hermes 是一个为运行 React Native 而优化的开源 JavaScript 引擎。它通过减少内存使用、缩小下载大小和缩短应用程序可用或“交互时间 (TTI)”所需的时间来提高性能。

随着本次发布,我们很高兴地宣布,你现在也可以在 iOS 上使用 Hermes 进行构建。要在 iOS 上启用 Hermes,请在你的 Podfile 中将 hermes_enabled 设置为 true,然后运行 pod install

use_react_native!(
:path => config[:reactNativePath],
# to enable hermes on iOS, change `false` to `true` and then install pods
:hermes_enabled => true
)

请记住,iOS 上的 Hermes 支持仍处于早期阶段。我们在进行进一步基准测试时将其保留为可选启用。我们鼓励您在自己的应用程序上试用它,并告诉我们它的效果如何!

默认启用内联要求

内联要求是 Metro 的一个配置选项,它通过延迟 JavaScript 模块的执行直到它们被使用(而不是在启动时)来改善启动时间。

此功能已存在并被推荐多年,作为可选配置选项,列在我们的文档的性能部分。我们现在为新应用程序默认启用此选项,以帮助人们无需额外配置即可拥有快速的 React Native 应用程序。

内联要求是一种 Babel 转换,它将模块导入转换为内联。例如,内联要求将模块导入调用从文件顶部转换到它被使用的地方。

之前

import {MyFunction} from 'my-module';

const MyComponent = props => {
const result = MyFunction();

return <Text>{result}</Text>;
};

之后

const MyComponent = props => {
const result = require('my-module').MyFunction();

return <Text>{result}</Text>;
};

有关内联要求的更多信息,请参见性能文档

使用 Chrome 查看 Hermes 跟踪

去年,Facebook 赞助了 Major League Hacking 奖学金,支持对 React Native 的贡献。Jessie NguyenSaphal Patro 添加了使用 Chrome DevTools 上的 Performance 选项卡在应用程序使用 Hermes 时可视化其执行的能力。

欲了解更多信息,请查看新文档页面

支持 Proxy 的 Hermes

我们已在 Hermes 中添加了 Proxy 支持,从而实现了与 react-native-firebase 和 mobx 等流行社区项目的兼容性。如果您一直在使用这些包,现在可以迁移到 Hermes 项目。

我们计划在即将发布的版本中将 Hermes 作为 Android 的默认 JavaScript 引擎,因此我们正在努力解决人们在使用 Hermes 时遇到的剩余问题。如果您的应用程序因剩余问题而无法采用 Hermes,请在 Hermes GitHub 仓库上提交问题。

React 17

React 17 不包含面向开发者的新功能或重大破坏性更改。对于 React Native 应用程序,主要更改是新的 JSX 转换,使文件不再需要导入 React 即可使用 JSX。

有关 React 17 的更多信息可在React 博客上找到。

主要依赖版本更改

  • 取消了 Android API 级别 16-20 的支持。Facebook 应用程序持续取消对使用率足够低的 Android 版本的支持。由于 Facebook 应用程序不再支持这些版本,并且是 React Native 的主要测试界面,因此 React Native 也取消了支持。
  • 需要 Xcode 12 和 CocoaPods 1.10
  • Node 最低支持版本从 10 提升到 Node 12
  • Flipper 版本提升至 0.75.1

致谢

感谢数百名贡献者帮助 0.64 版本的实现!0.64 变更日志包含了此版本中的所有更改。

发布 React Native 0.63,支持 LogBox

·阅读约8分钟
Mike Grabowski
Mike Grabowski
CTO 兼 Callstack 联合创始人

今天我们发布 React Native 0.63,默认开启 LogBox。

LogBox

我们从社区收到了频繁的反馈,称 React Native 中的错误和警告难以调试。为了解决这些问题,我们审查了 React Native 中的整个错误、警告和日志系统,并从头开始重新设计了它。

Screenshot of LogBox

LogBox 是 React Native 中经过完全重新设计的 redbox、yellowbox 和日志体验。在 0.62 中,我们将 LogBox 作为可选择的功能引入。在此版本中,我们将 LogBox 作为 React Native 中所有体验的默认设置。

LogBox 通过关注三个主要目标来解决错误和警告过于冗长、格式不佳或不可操作的抱怨:

  • 简洁:日志应提供调试问题所需的最小信息量。
  • 格式化:日志应格式化,以便您能快速找到所需信息。
  • 可操作:日志应可操作,以便您能修复问题并继续进行。

为实现这些目标,LogBox 包括:

  • 日志通知:我们重新设计了警告通知,并增加了对错误的支持,以便所有 console.warn 和 console.log 消息都显示为通知,而不是覆盖您的应用程序。
  • 代码帧:现在每个错误和警告都包含一个代码帧,在应用程序内直接显示日志的源代码,让您能够快速识别问题的来源。
  • 组件堆栈:所有组件堆栈现在都从错误消息中剥离,并放入其自己的部分,其中显示前三个帧。这为您提供了一个单一、一致的空间来期望堆栈帧信息,而不会使日志消息混乱。
  • 堆栈帧折叠:默认情况下,我们现在折叠与您的应用程序代码无关的调用堆栈帧,这样您可以快速查看应用程序中的问题,而无需筛选 React Native 内部代码。
  • 语法错误格式化:我们改进了语法错误的格式,并添加了带语法高亮的代码帧,以便您可以看到错误的来源,修复它,并继续编码,而无需 React Native 阻碍您。

我们将所有这些功能封装到改进的视觉设计中,该设计在错误和警告之间保持一致,并允许在一个令人愉悦的 UI 中分页浏览所有日志。

通过此更改,我们还弃用 YellowBox,转而使用 LogBox API。

  • LogBox.ignoreLogs():此函数替代 YellowBox.ignoreLogs([]),用于静默任何与给定字符串或正则表达式匹配的日志。
  • LogBox.ignoreAllLogs():此函数替代 console.disableYellowBox,用于关闭错误或警告通知。注意:这仅禁用通知,未捕获的错误仍将打开全屏 LogBox。

在 0.63 版本中,使用这些已弃用模块或方法时将发出警告。请在它们在 0.64 版本中移除之前,更新您调用这些 API 的地方。

有关 LogBox 和调试 React Native 的更多信息,请参阅此处的文档。

Pressable

React Native 旨在使应用程序满足用户对平台的期望。这包括避免“泄露”——那些细微之处,暗示体验是用 React Native 构建的。这些泄露的一个主要来源是 Touchable 组件:ButtonTouchableWithoutFeedbackTouchableHighlightTouchableOpacityTouchableNativeFeedbackTouchableBounce。这些组件通过允许您为用户交互提供视觉反馈,使您的应用程序具有交互性。然而,由于它们包含与平台交互不匹配的内置样式和效果,用户可以判断体验是使用 React Native 编写的。

此外,随着 React Native 的发展以及我们对高质量应用程序的要求提高,这些组件并没有随之成长。React Native 现在支持 Web、桌面和电视等平台,但对其他输入模式的支持一直不足。React Native 需要在所有平台上支持高质量的交互体验。

为了解决这些问题,我们正在发布一个名为 Pressable 的新核心组件。该组件可用于检测各种类型的交互。该 API 旨在提供对当前交互状态的直接访问,而无需在父组件中手动维护状态。它还旨在使平台能够扩展其功能,包括悬停、模糊、焦点等。我们期望大多数人将构建和共享利用 Pressable 作为底层组件的组件,而不是依赖于 TouchableOpacity 等的默认体验。

import {Pressable, Text} from 'react-native';

<Pressable
onPress={() => {
console.log('pressed');
}}
style={({pressed}) => ({
backgroundColor: pressed ? 'lightskyblue' : 'white',
})}>
<Text style={styles.text}>Press Me!</Text>
</Pressable>;

Pressable 组件的简单示例

您可以从文档中了解更多信息。

原生颜色 (PlatformColor, DynamicColorIOS)

每个原生平台都有系统定义的颜色概念。这些颜色会自动响应系统主题设置,如亮色或暗色模式,可访问性设置,如高对比度模式,甚至其在应用程序中的上下文,如包含视图或窗口的特征。

虽然可以通过Appearance API 和/或AccessibilityInfo 检测到其中一些设置并相应地设置您的样式,但这种抽象不仅开发成本高昂,而且只是近似原生颜色的外观。当在混合应用程序中工作时,React Native 元素与原生元素并存,这些不一致性尤为明显。

React Native 现在提供了一个开箱即用的解决方案来使用这些系统颜色。PlatformColor() 是一个新 API,可以像 React Native 中的任何其他颜色一样使用。

例如,在 iOS 上,系统提供了一种名为 labelColor 的颜色。这可以在 React Native 中与 PlatformColor 一起使用,如下所示

import {Text, PlatformColor} from 'react-native';

<Text style={{color: PlatformColor('labelColor')}}>
This is a label
</Text>;

将 Text 组件的颜色设置为 iOS 定义的 labelColor。

另一方面,Android 提供了像 colorButtonNormal 这样的颜色。您可以在 React Native 中使用这种颜色:

import {View, Text, PlatformColor} from 'react-native';

<View
style={{
backgroundColor: PlatformColor('?attr/colorButtonNormal'),
}}>
<Text>This is colored like a button!</Text>
</View>;

将 View 组件的背景颜色设置为 Android 定义的 colorButtonNormal。

您可以从文档中了解有关 PlatformColor 的更多信息。您还可以查看 RNTester 中提供的实际代码示例

DynamicColorIOS 是一个仅适用于 iOS 的 API,允许您定义在亮色和暗色模式下使用的颜色。与 PlatformColor 类似,这可以在任何可以使用颜色的地方使用。DynamicColorIOS 在底层使用 iOS 的 colorWithDynamicProvider

import {Text, DynamicColorIOS} from 'react-native';

const customDynamicTextColor = DynamicColorIOS({
dark: 'lightskyblue',
light: 'midnightblue',
});

<Text style={{color: customDynamicTextColor}}>
This color changes automatically based on the system theme!
</Text>;

根据系统主题更改文本颜色

您可以从文档中了解更多关于 DynamicColorIOS 的信息。

放弃对 iOS 9 和 Node.js 8 的支持

在发布四年多后,我们取消了对 iOS 9 的支持。这一变化将使我们能够通过减少本地代码中需要进行的兼容性检查数量来更快地行动,以检测给定功能是否在某个 iOS 版本上受支持。鉴于其市场份额为 1%,它不应该对您的客户产生太大负面影响。

与此同时,我们正在放弃对 Node 8 的支持。其 LTS 维护周期已于 2019 年 12 月到期。当前的 LTS 是 Node 10,这也是我们现在目标支持的版本。如果您仍在为 React Native 应用程序的开发使用 Node 8,我们鼓励您升级以接收所有最新的安全修复和更新。

其他值得注意的改进

  • 支持在 <Text /> 中渲染 <View /> 而无需明确大小:您现在可以在任何 <Text /> 组件内渲染任何 <View />,而无需明确设置其宽度和高度,这以前并非总是可能。在之前的 React Native 版本中,这会导致 RedBox。
  • 将 iOS LaunchScreen 从 xib 更改为 storyboard:从 2020 年 4 月 30 日起,所有提交到 App Store 的应用都必须使用 Xcode storyboard 提供应用的启动屏幕,并且所有 iPhone 应用都必须支持所有 iPhone 屏幕。此提交调整了默认的 React Native 模板以兼容此要求。

致谢

感谢数百位贡献者,他们的努力使 0.63 版本成为可能!

特别感谢 Rick Hanlon 撰写了关于 LogBox 的部分,以及 Eli White 撰写了本文中 Pressable 的部分。

要查看所有更新,请参阅0.63 更新日志

发布 React Native 0.62,支持 Flipper

·阅读时长5分钟
Rick Hanlon
Facebook React Native 核心团队成员

今天我们发布了 React Native 0.62 版本,其中包括默认支持 Flipper。

本次发布正值全球疫情蔓延之际。我们今天发布此版本是为了尊重数百名贡献者的工作,他们使此次发布成为可能,并防止发布进度落后于主分支太多。请注意贡献者帮助解决问题的能力有限,并在必要时准备推迟升级。

默认支持 Flipper

Flipper 是一款用于调试移动应用程序的开发者工具。它在 Android 和 iOS 社区中很受欢迎,在此版本中,我们已默认启用对新旧 React Native 应用程序的支持。

Screenshot of Flipper for React Native

Flipper 提供以下开箱即用的功能:

  • Metro 操作:直接从工具栏重新加载应用并触发开发者菜单。
  • 崩溃报告器:查看 Android 和 iOS 设备的崩溃报告。
  • React DevTools:将最新版本的 React DevTools 与所有其他工具一起使用。
  • 网络检查器:查看设备应用程序发出的所有网络请求。
  • Metro 和设备日志:查看、搜索和筛选来自 Metro 和设备的所有日志。
  • 原生布局检查器:查看和编辑 React Native 渲染器输出的原生布局。
  • 数据库和偏好设置检查器:查看和编辑设备数据库和偏好设置。

此外,由于 Flipper 是一个可扩展的平台,它提供了一个从 NPM 拉取插件的市场,因此您可以发布和安装特定于您的工作流程的自定义插件。在此处查看可用插件 这里

有关更多信息,请查看 Flipper 文档

新的深色模式功能

我们添加了一个新的 Appearance 模块,用于访问用户的外观偏好设置,例如他们首选的配色方案(浅色或深色)。

const colorScheme = Appearance.getColorScheme();
if (colorScheme === 'dark') {
// Use dark color scheme
}

我们还添加了一个 Hook 以订阅用户偏好设置的状态更新。

import {Text, useColorScheme} from 'react-native';

const MyComponent = () => {
const colorScheme = useColorScheme();
return <Text>useColorScheme(): {colorScheme}</Text>;
};

有关更多信息,请参阅 AppearanceuseColorScheme 的文档。

将 Apple TV 移至 react-native-tvos

作为我们精简核心工作的一部分,并使 Apple TV 与 React Native Windows 和 React Native macOS 等其他平台保持一致,我们已开始从核心代码中移除 Apple TV 相关的特定代码。

展望未来,React Native 的 Apple TV 支持将继续在 react-native-community/react-native-tvos 中维护,并与相应的 react-native-tvos NPM 包一起。这是主仓库的完全分支,仅包含支持 Apple TV 所需的更改。

react-native-tvos 的发布将基于 React Native 的公开版本。对于 react-native 的 0.62 版本,请将 Apple TV 项目升级到使用 react-native-tvos 0.62。

更多升级支持

当 0.61 发布时,社区推出了一款新的升级助手工具,以支持开发者升级到新版本的 React Native。升级助手提供了从您当前版本到目标版本的更改差异,让您能够看到特定升级所需进行的更改。

即使有了这个工具,升级时仍然会出现问题。今天,我们宣布升级支持,引入更专业的升级支持。升级支持是一个 GitHub 问题跟踪器,用户可以在其中提交针对其项目升级的特定问题,以获得社区的帮助。

我们一直在努力改进升级体验,希望这些工具能为用户提供在尚未涵盖的边缘情况中所需的帮助。

其他改进

  • LogBox:我们正在添加新的 LogBox 错误和警告体验作为可选功能;要启用它,请在您的 index.js 文件中添加 require('react-native').unstable_enableLogBox()
  • React DevTools v4:此更改包括升级到最新的 React DevTools,它提供了显著的性能提升、改进的导航体验以及对 React Hooks 的全面支持。
  • 可访问性改进:我们对可访问性进行了改进,包括添加了accessibilityValueTouchables 上缺失的 prop,onSlidingComplete 可访问性事件,以及将 Switch 组件的默认 role 从 "button" 更改为 "switch"

重大更改

  • 移除 PropTypes:我们正在从核心组件中移除 propTypes,以减少 React Native 核心对应用大小的影响,并倾向于在编译时而非运行时检查的静态类型系统。
  • 移除 accessibilityStates:我们移除了已废弃的 accessibilityStates 属性,转而使用新的 accessibilityState prop,这是一种更具语义性的方式,供组件向辅助功能服务描述其状态信息。
  • TextInput 更改:我们从 TextInput 中移除了 onTextInput,因为它不常见,不符合 W3C 标准,并且难以在 Fabric 中实现。我们还移除了未文档化的 inputView prop 和 selectionState

弃用

  • AccessibilityInfo.fetch 已被弃用,但在此版本中我们添加了一个警告
  • 现在要求设置 useNativeDriver,以支持将来切换默认值。
  • Animated 组件的 ref 现在是内部组件,并且 getNode废弃

致谢

感谢数百位贡献者,他们的努力使 0.62 版本成为可能!

要查看所有更新,请参阅 0.62 更改日志

发布 React Native 0.61,支持 Fast Refresh

·3 分钟阅读
Dan Abramov
Facebook React 核心团队

我们很高兴地宣布 React Native 0.61 发布,其中包含我们称之为 Fast Refresh 的全新重载体验。

Fast Refresh

当我们询问 React Native 社区常见痛点时,其中一个最常见的回答是“热重载”功能已损坏。它对函数组件不可靠,经常无法更新屏幕,并且对拼写错误和失误不具有弹性。我们听说大多数人因为其太不可靠而将其关闭。

在 React Native 0.61 中,**我们将现有的“实时重载”(保存时重载)和“热重载”功能统一为一个名为“Fast Refresh”的全新功能**。Fast Refresh 从头开始实现,遵循以下原则:

  • Fast Refresh **完全支持现代 React**,包括函数组件和 Hooks。
  • Fast Refresh **在出现拼写错误和其他错误后能优雅地恢复**,并在需要时回退到完全重载。
  • Fast Refresh **不执行侵入性代码转换**,因此它足够可靠,可以默认开启。

要查看 Fast Refresh 的实际效果,请观看此视频:

试试看,并告诉我们你的想法!如果你愿意,可以在开发菜单(iOS 上按 Cmd+D,Android 上按 Cmd+M 或 Ctrl+M)中将其关闭。开启和关闭是即时的,因此你可以随时进行操作。

以下是一些 Fast Refresh 的提示:

  • Fast Refresh 默认保留函数组件(和 Hooks!)中的 React 本地状态。
  • 如果你需要在每次编辑时重置 React 状态,你可以在包含该组件的文件中添加特殊的 // @refresh reset 注释。
  • Fast Refresh 始终重新挂载类组件而不保留状态。这确保了其可靠性。
  • 我们都会在代码中犯错!Fast Refresh 在你保存文件后会自动重试渲染。你无需在修复语法或运行时错误后手动重新加载应用程序。
  • 在编辑过程中添加 console.logdebugger 语句是一种很棒的调试技巧。

请在 GitHub 上报告 Fast Refresh 的任何问题,我们会进行调查。

其他改进

  • 修复了 use_frameworks! CocoaPods 支持。 在 0.60 中,我们进行了一些更新,以默认集成 CocoaPods。不幸的是,这破坏了使用use_frameworks! 的构建。这在0.61 中已修复,使得将 React Native 集成到需要使用动态框架构建的 iOS 项目中变得更容易。
  • 添加 useWindowDimensions Hook。 这个新的 Hook 自动提供并订阅尺寸更新,并且在大多数情况下可以替代 Dimensions API。
  • React 已升级到 16.9。 此版本废弃了 UNSAFE_ 生命周期方法的旧名称,包含了对 act 的改进,等等。有关自动迁移脚本和更多信息,请参阅React 16.9 博客文章

破坏性变更

  • 移除 React .xcodeproj。 在 0.60 中,我们通过 CocoaPods 引入了自动链接支持。我们还将 CocoaPods 集成到 e2e 测试运行中,从现在起,我们有了一个统一的标准方式来将 RN 集成到 iOS 应用程序中。这有效地废弃了 React .xcodeproj 支持,并且从 0.61 开始已移除该文件。注意:如果您已使用 0.60 自动链接,则不应受到影响。

致谢

感谢所有为 0.61 的实现做出贡献的人!

要查看所有更新,请查看0.61 变更日志

发布 React Native 0.60

·6 分钟阅读
Ryan Turner
核心维护者与 React Native 开发者

经过数百位贡献者数月的辛勤工作,React Native 核心团队自豪地宣布发布 0.60 版本。此版本处理了 Android 和 iOS 平台的重大迁移,并解决了许多问题。这篇博客文章涵盖了此版本的亮点。一如既往,请参阅变更日志以获取更详细的信息。最后,感谢所有贡献者帮助我们实现了这一里程碑!

关注可访问性

可访问性 API 方面有许多改进,例如 announceForAccessibility,以及对 rolesaction supportflags 等的改进。可访问性是一门复杂的科学,但我们希望这些改进能让 A11Y 变得更容易一些。请务必查看 2019 年 6 月的 React Native 开源更新,了解这些变化的更多详情。

全新开始

React Native 的启动界面已更新!感谢许多贡献者帮助创建了新的 UI。这个新的“Hello World”将以更友好、更具吸引力的方式欢迎用户进入生态系统。

The new init screen helps developers get started from the get-go with resources and a good example

AndroidX 支持

AndroidX 是 Android 生态系统向前迈出的重要一步,旧的支持库工件正在被弃用。对于 0.60 版本,React Native 已迁移到 AndroidX。这是一个破坏性更改,您的原生代码和依赖项也需要迁移

通过此更改,React Native 应用程序将需要开始使用 AndroidX。它们不能在同一个应用程序中并排使用,因此所有应用程序代码和依赖项代码都需要使用其中一个。

matt-oakesdiscussions-and-proposals

虽然您自己的原生代码需要您自己迁移,但 @mikehardy@cawfree@m4tt72 开发了一个名为“jetifier”的巧妙工具来修补您的 node_modules。库维护者需要升级,但此工具为您提供了一个临时解决方案,同时给他们时间发布 AndroidX 版本。因此,如果您发现与 AndroidX 迁移相关的错误,请尝试一下。

CocoaPods 默认支持

CocoaPods 现已成为 React Native iOS 项目的一部分。如果您还没有这样做,请务必从现在开始使用 xcworkspace 文件打开 iOS 平台代码(提示:从根项目目录尝试 xed ios)。此外,内部包的 podspec 已经更改,以使其与 Xcode 项目兼容,这将有助于故障排除和调试。升级到 0.60 版本时,预计需要对您的 Podfile 进行一些直接的更改,以引入这一令人兴奋的支持。请注意,我们知道与 use_frameworks! 存在兼容性问题,我们正在跟踪一个问题,其中包含解决方案和未来的补丁。

精简核心移除

WebViewNetInfo 之前已被提取到单独的存储库中,在 0.60 版本中,我们已完成将其从 React Native 存储库中迁移。此外,为了响应社区对新 App Store 政策的反馈,Geolocation 已被提取。如果您还没有,请通过添加对 react-native-webview@react-native-community/netinfo@react-native-community/geolocation 的依赖来完成迁移。如果您想要自动化解决方案,请考虑使用 rn-upgrade-deprecated-modules。自提取以来,维护人员已向这些存储库提交了 100 多个提交,我们很高兴看到社区的支持!

原生模块现在自动链接

致力于 React Native CLI 的团队对原生模块链接进行了重大改进,称为 autolinking!大多数情况下将不再需要使用 react-native link。同时,该团队全面修改了链接过程。请务必 react-native unlink 任何现有依赖项,如上述文档中所述。

升级助手

@lucasbento@pvinis@kelset@watadarkstar 创建了一个名为 升级助手 的强大工具,使升级过程更加简单。它帮助 React Native 用户(使用现有应用程序或复杂自定义)查看版本之间的变化。请查看更新的升级文档,并立即为您的升级路径尝试一下!

Upgrade Helper cleanly and easily shows the changes needed to migrate to a different version of React Native

致库维护者的注意事项

AndroidX 的更改几乎肯定需要更新您的库,因此请务必尽快包含支持。如果您暂时无法升级,请考虑使用 jetifier 检查您的库,以确认用户能够在构建时修补您的库。

查看 autolinking 文档以更新您的配置和自述文件。根据您库以前的集成方式,您可能还需要进行一些额外的更改。请查看 CLI 的 dependencies 指南,了解如何定义您的依赖接口。

致谢

虽然这些是我们注意到的亮点,但还有许多其他值得兴奋的地方。要查看所有更新,请查看变更日志。一如既往,请继续关注更多新闻。与此同时,享受 0.60 版本吧!

发布 React Native 0.59

·7分钟阅读
Ryan Turner
核心维护者与 React Native 开发者

欢迎来到 React Native 的 0.59 版本!这是一个又一个重要版本,共有 88 位贡献者提交了 644 次提交。贡献也以其他形式出现,所以衷心感谢您维护问题、促进社区发展以及向人们传授 React Native 的知识。本月带来了一些备受期待的更改,我们希望您会喜欢它们。

🎣 Hooks 来了

React Hooks 是此版本的一部分,它允许您在组件之间重用有状态逻辑。关于 hooks 有很多讨论,但如果您还没有听说过,请查看下面的一些精彩资源

务必在您的应用中尝试一下。我们希望您像我们一样发现重用令人兴奋。

📱 更新的 JSC 意味着 Android 上的性能提升和 64 位支持

React Native 使用 JSC(JavaScriptCore)来为您的应用程序提供动力。Android 上的 JSC 已经有几年没有更新了,这意味着很多现代 JavaScript 功能都不受支持。更糟糕的是,与 iOS 的现代 JSC 相比,它的性能很差。随着此版本的发布,所有这些都将改变。

感谢 @DanielZlotin@dulmandakh@gengjiawen@kmagiera@kudo 的出色工作,JSC 赶上了过去几年。这带来了 64 位支持、现代 JavaScript 支持和大幅性能改进。此外,感谢他们现在使这个过程变得可维护,以便我们可以在未来的 WebKit 改进中受益,而无需做太多额外的工作,也感谢 Software Mansion 和 Expo 使这项工作成为可能。

💨 通过内联 require 实现更快的应用启动

我们希望默认情况下帮助人们拥有高性能的 React Native 应用程序,并正在努力将 Facebook 的优化带给社区。应用程序按需加载资源,而不是减慢启动速度。此功能称为“内联 require”,因为它允许 Metro 识别需要延迟加载的组件。具有深层和多样化组件架构的应用程序将看到最大的改进。

source of the metro.config.js file in the 0.59 template, demonstrating where to enable inlineRequires

我们需要社区告诉我们它如何工作,然后我们才会默认启用它。当您升级到 0.59 时,将有一个新的 metro.config.js 文件;将选项设置为 true 并给我们您的反馈!阅读更多关于内联 require 的信息,请参阅性能文档,以对您的应用程序进行基准测试。

🚅 精益核心正在进行中

React Native 是一个庞大而复杂的项目,拥有复杂的存储库。这使得代码库对贡献者而言可接近性较低,难以测试,并且作为开发依赖项而言过于臃肿。精简核心是我们将代码迁移到单独的库以实现更好管理的努力,以解决这些问题。过去的几个版本已经迈出了第一步,但让我们认真起来

您可能会注意到,更多的组件现在已正式弃用。这是个好消息,因为这些功能现在有了活跃维护它们的拥有者。请注意警告消息,并迁移到这些功能的新库,因为它们将在未来版本中移除。下表列出了组件、其状态以及您可以迁移到的新库。

组件已弃用?新家
AsyncStorage0.59@react-native-community/react-native-async-storage
ImageStore0.59expo-file-systemreact-native-fs
MaskedViewIOS0.59@react-native-community/react-native-masked-view
NetInfo0.59@react-native-community/react-native-netinfo
Slider0.59@react-native-community/react-native-slider
ViewPagerAndroid0.59@react-native-community/react-native-viewpager

在接下来的几个月里,将有更多组件遵循这条通往精简核心的道路。我们正在寻找这方面的帮助——请前往精简核心伞项目贡献一份力量。

👩🏽‍💻 CLI 改进

React Native 的命令行工具是开发者进入生态系统的入口,但它们长期存在问题,并且缺乏官方支持。CLI 工具已移至新仓库,并且专门的维护者团队已经取得了一些令人兴奋的改进。

现在日志格式化得更好了。命令现在几乎立即运行——您会立即注意到差异

0.58&#39;s CLI is slow to start0.58&#39;s CLI is nearly instantaneous

🚀 升级到 0.59

我们听取了您关于React Native 升级过程的反馈,我们正在采取措施改进未来版本的体验。要升级到 0.59,我们建议使用rn-diff-purge 来确定您当前 React Native 版本与 0.59 之间有哪些更改,然后手动应用这些更改。一旦您的项目升级到 0.59,您就可以使用新改进的 react-native upgrade 命令(基于 rn-diff-purge!)来升级到 0.60 及更高版本,因为有更新的版本可用。

🔨 破坏性变更

0.59 版本中的 Android 支持已根据 Google 的最新建议进行了清理,这可能会导致现有应用程序出现潜在的破坏。此问题可能会表现为运行时崩溃和一条消息:“您需要使用 Theme.AppCompat 主题(或其后代)与此活动”。我们建议更新您项目的 AndroidManifest.xml 文件,确保 android:theme 值是一个 AppCompat 主题(例如 @style/Theme.AppCompat.Light.NoActionBar)。

react-native-git-upgrade 命令在 0.59 中已被删除,取而代之的是新改进的 react-native upgrade 命令。

🤗 感谢

许多新贡献者协助从 flow 类型启用原生代码生成解决 Xcode 警告——这些是学习 React Native 工作原理并为更大的利益做出贡献的好方法。谢谢!请留意未来类似的问题。

虽然这些是我们注意到的亮点,但还有许多其他值得兴奋的地方。要查看所有更新,请查看变更日志。0.59 是一个巨大的版本——我们迫不及待地想让您试用它。

今年剩下的时间里,我们还将带来更多改进。敬请期待!

Ryan 和整个 React Native 核心团队

发布 0.56

·6 分钟阅读
Lorenzo Sciandra
Drivetribe 的核心维护者和 React Native 开发者

期待已久的 React Native 0.56 版本现已发布 🎉。这篇博客文章重点介绍了此新版本中引入的一些更改。我们还想借此机会解释一下自三月以来我们一直忙碌的事情。

突破性更改的困境,或者说,“何时发布?”

贡献者指南解释了所有 React Native 更改所经历的集成过程。该项目由许多不同的工具组成,需要协调和持续支持才能使一切正常运行。再加上为项目做出贡献的活跃开源社区,您将对整个项目的令人费解的规模有所了解。

随着 React Native 令人印象深刻的采用,破坏性更改必须非常小心地进行,而且过程并不像我们希望的那么顺利。我们决定跳过 4 月和 5 月的发布,以便核心团队能够集成和测试一组新的破坏性更改。专门的社区交流渠道在此过程中一直被使用,以确保 2018 年 6 月(0.56.0)版本对于那些耐心等待稳定版本的人来说尽可能地轻松采用。

0.56.0 完美吗?不,就像所有软件一样:但我们已经达到了一个平衡点,即“等待更多稳定性”与“测试导致成功结果,因此我们可以继续前进”之间的权衡,我们觉得已经准备好发布它。此外,我们知道一些问题尚未最终的 0.56.0 版本中解决。大多数开发者应该可以顺利升级到 0.56.0。对于那些被上述问题阻碍的开发者,我们希望在我们的讨论中见到您,我们期待与您一起解决这些问题。

您可以将 0.56.0 视为构建更稳定框架的基础:它可能需要一到两周的广泛采用才能解决所有边缘情况,但这将导致 2018 年 7 月(0.57.0)发布版本更加出色。

我们想用感谢所有 67 位贡献者在总共 818 次提交中 (!) 的辛勤工作来结束本节,这些工作将帮助您的应用程序变得更好 👏。

现在,话不多说...

重大变更

Babel 7

如您所知,允许我们所有人使用最新和最出色 JavaScript 功能的转译工具 Babel 即将发布 v7 版本。由于这个新版本带来了一些重要的更改,我们认为现在是升级的好时机,这将使 Metro 能够利用其改进

如果您在升级时遇到问题,请参阅相关的文档部分

现代化 Android 支持

在 Android 上,许多周边工具已发生变化。我们已更新到 Gradle 3.5Android SDK 26Fresco 1.9.0 和 OkHttp 3.10.0,甚至将 NDK API 目标设置为 API 16。这些更改应该会顺利进行并导致更快的构建。更重要的是,它将帮助开发人员遵守下个月生效的新的 Play 商店要求

为此,我们要特别感谢Dulmandakh提交了许多 PR,使其成为可能👏。

朝着这个方向还需要采取一些步骤,您可以在专门的问题中关注 Android 支持更新的未来规划和讨论(以及JSC 的一个附带问题)。

新的 Node、Xcode、React 和 Flow – 哦天哪!

Node 8 现在是 React Native 的标准。它实际上已经在测试中,但随着 Node 6 进入维护模式,我们全力以赴。React 也更新到了 16.4,这带来了大量的修复。

我们正在放弃对 iOS 8 的支持,使 iOS 9 成为可定位的最旧 iOS 版本。我们预计这不会成为问题,因为任何可以运行 iOS 8 的设备都可以升级到 iOS 9。这一更改使我们能够删除为运行 iOS 8 的旧设备实现变通方法的很少使用的代码。

持续集成工具链已更新以使用 Xcode 9.4,确保所有 iOS 测试都在 Apple 提供的最新开发者工具上运行。

我们已升级到 Flow 0.75 以使用许多开发者赞赏的新错误格式。我们还为更多组件创建了类型。如果您尚未在项目中强制执行静态类型,请考虑使用 Flow 在编码时而不是在运行时识别问题。

还有很多其他事情...

例如,YellowBox 被替换为新的实现,这使得调试变得更好。

有关完整的发布说明,请参阅此处的完整变更日志。并请记住关注升级指南,以避免迁移到此新版本时出现问题。


最后一点:从本周开始,React Native 核心团队将恢复每月会议。我们将确保让每个人都了解所涵盖的内容,并确保在未来的会议中随时获取您的反馈。

祝大家编码愉快!

LorenzoRyan 和整个 React Native 核心团队

附言: 一如既往,我们想提醒大家,React Native 仍处于 0.x 版本,因为仍有许多更改正在进行中——因此请记住,在升级时,是的,可能仍然会崩溃或出现问题。在问题中和提交 PR 时互相帮助——并记住遵循强制执行的行为准则:屏幕另一边总有一个人。