Easily emulate @font-face behavior in react-native.
Using custom fonts in React Native becomes complicated when trying to work with different font weights and styles. Even though the React Native TextStyle
type includes properties for fontFamily
, fontWeight
and fontStyle
, these properties seem to work only for the default built-in fonts, and have limited support when using custom fonts. For this reason, selecting a specific font weight and style is traditionally achieved by specifying the exact PostScript name of the desired loaded font file.
For example:
const style: ViewStyle = {
fontFamily: 'Roboto-MediumItalic',
};
This makes it difficult to achieve merged styles or text style composition. A preferable solution might be something like this:
const style: ViewStyle = {
fontFamily: 'Roboto',
fontWeight: '500',
fontStyle: 'italic',
};
This library aims to make life easier by allowing React Native developers to use fontWeight
and fontStyle
with custom fonts on iOS, Android, and Web.
-
Add the required dependencies to your application's
package.json
:yarn add react-native-font-faces
If you are using Expo and need to load additional custom font files into your app, also add the following:
yarn add expo-font
-
Add a call to
enableFontFaces()
in your application's entry point, and import the desired font faces. Then just use the font family as you would normally expect:// App.tsx import React from 'react'; import { useFonts } from 'expo-font'; import { AppLoading } from 'expo'; import { AppContent } from './AppContent'; import { Roboto_All, enableFontFaces, getExpoFontMap } from 'react-native-font-faces'; enableFontFaces(Roboto_All); export default function App() { const [loaded, error] = useFonts(getExpoFontMap(Roboto_All)); if (!loaded) { return <AppLoading />; } else if (error) { return <Text>{error.message}</Text>; } else { return ( <View style={styles.container}> <StatusBar style="auto" /> <Text style={styles.text}>This should be Regular</Text> <Text style={[styles.text, styles.italic]}>This should be Italic</Text> <Text style={[styles.text, styles.bold]}>This should be Bold</Text> <Text style={[styles.text, styles.bold, styles.italic]}>This should be BoldItalic</Text> <Text style={[styles.text, styles.thin]}>This should be Thin</Text> <Text style={[styles.text, styles.thin, styles.italic]}>This should be ThinItalic</Text> </View> ); } } const styles = StyleSheet.create({ text: { fontFamily: 'Roboto', }, bold: { fontWeight: 'bold', }, thin: { fontWeight: '100', }, italic: { fontStyle: 'italic', }, container: { flex: 1, backgroundColor: '#fff', alignItems: 'center', justifyContent: 'center', }, });
In version 4.x, we removed FontFacesProvider
and added enableFontFaces
. Follow these steps to migrate:
- Remove all instances of
<FontFacesProvider />
. - Add a call to
enableFontFaces()
in your application's entrypoint. - (Optional) Add a call to
useFonts()
(expo-font) orloadFonts()
(react-native-dynamic-fonts) to dynamically load remote fonts.
In version 3.x, we simplified FontFacesProvider
and removed useFontFaces
. Follow these steps to migrate:
- Remove all instances of
useFontFaces()
. - Update your application's
<FontFacesProvider/>
to provide theonLoading
andonError
props (optional).
In version 2.x, we introduced FontFacesProvider
and useFontFaces
, and removed enableFontFaces
. Follow these steps to migrate:
- Remove all instances of
enableFontFaces()
. - Add a
<FontFacesProvider/>
around your application's root component. - Add
const [fontsLoaded] = useFontFaces(...)
inside an inner function component's body and handle thefontsLoaded
value appropriately.