From 13ec73f25188d4897dba9466ca90123396d2f953 Mon Sep 17 00:00:00 2001 From: Aman Mittal Date: Tue, 7 May 2024 18:31:09 +0530 Subject: [PATCH] [docs] Update outdated info in Expo SDK libraries section (#28504) # Why This PR: - Platform compatibility table with platform tags and a screenshot taken from `expo-device` as an example. - Updates info about what an API reference page contains to include the config plugin. - Remove `expo-device` example as it has no relevance here (as a reader I want to learn what an API reference page contains) - Update styles for React Native components API example. # Test Plan Run docs locally and visit: http://localhost:3002/workflow/using-libraries/#expo-sdk-libraries ## Preview ![CleanShot 2024-04-29 at 00 47 37@2x](https://github.com/expo/expo/assets/10234615/16caaeb4-c0fa-4685-9887-94839e71c6ac) # Checklist - [ ] Documentation is up to date to reflect these changes (eg: https://docs.expo.dev and README.md). - [ ] Conforms with the [Documentation Writing Style Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md) - [ ] This diff will work correctly for `npx expo prebuild` & EAS Build (eg: updated a module plugin). --- docs/pages/workflow/using-libraries.mdx | 64 ++++++------------ .../static/images/guides/platform-tags.png | Bin 0 -> 16016 bytes 2 files changed, 21 insertions(+), 43 deletions(-) create mode 100644 docs/public/static/images/guides/platform-tags.png diff --git a/docs/pages/workflow/using-libraries.mdx b/docs/pages/workflow/using-libraries.mdx index a5c6b17b3de00..440380316d1c6 100644 --- a/docs/pages/workflow/using-libraries.mdx +++ b/docs/pages/workflow/using-libraries.mdx @@ -4,11 +4,11 @@ description: Learn how to use libraries based on React Native, Expo SDK and thir --- import { ConfigReactNative } from '~/components/plugins/ConfigSection'; -import PlatformsSection from '~/components/plugins/PlatformsSection'; import InstallSection from '~/components/plugins/InstallSection'; import { BoxLink } from '~/ui/components/BoxLink'; import { Terminal } from '~/ui/components/Snippet'; import { SnackInline } from '~/ui/components/Snippet'; +import ImageSpotlight from '~/components/plugins/ImageSpotlight'; Every app is inevitably going to use a third-party library, so it's important to understand how to determine whether a library is compatible with your project. @@ -21,12 +21,11 @@ To use a React Native component or API in your project, import it from the `reac ```jsx -import * as React from 'react'; import { Text, View } from 'react-native'; export default function App() { return ( - + Hello, world! ); @@ -39,53 +38,35 @@ export default function App() { The Expo SDK picks up where the React Native core libraries end. It provides access to a lot of device and system functionality such as audio, barcode scanning, camera, calendar, contacts, video, and so on. It also adds other powerful libraries like updates, maps, OAuth authentication tools, and more. For more information, see how we decide [what goes into the Expo SDK](https://expo.fyi/whats-in-the-sdk). -To use a library from the Expo SDK, find the one you are looking for in the [API Reference](/versions/latest/) or through the documentation Search bar. +To use a library from the Expo SDK, find the one you are looking for in the [API reference](/versions/latest/) or use the documentation search. -If you initialized your app using `npx react-native init` and you don't have the `expo` package installed in it yet, refer to the [installing Expo modules guide](/bare/installing-expo-modules). +If you initialized your app using `npx react-native init` and you don't have the `expo` package installed in it yet, see the [installing Expo modules guide](/bare/installing-expo-modules) for more information. -At the top of the page you will see a description of the library and a platform compatibility table. It tells you which platforms and environments the library is compatible with. It looks like this: +You will see the platform compatibility tags at the top of each API reference. It tells you which platforms and environments the library is compatible with. For example, the platform tags for the [`expo-device`](/versions/latest/sdk/device/) library look like the following: - + -After the platform compatibility table, there will be an Installation section, with instructions that look like this: +After the platform compatibility table, there is a library's description and a section with instructions on installing the library. For example: -The `npx expo install` command will pick a version of the library that is compatible with your project and then use your JavaScript package manager (such as npm) to install it. - -Next, under the API section the reference page will tell you how to import the library in your code: +The `npx expo install` command picks a library version compatible with your project and then uses your JavaScript package manager (such as npm) to install it. -```js -import * as Device from 'expo-device'; -``` +Next, a typical API reference includes: -This section also lists all of the types, functions, and classes available. If you use TypeScript, you can see this information in your TypeScript-compatible code editor (such as Visual Studio Code) with auto-completion. +- Config plugin usage information if the library requires a config plugin. +- A code example that shows how to use the library. +- API section that lists how to import the library, followed by a list of hooks, props, types, methods, and classes that the library provides. -Now you can use the library in your project: - - - -```jsx -import * as React from 'react'; -import { Text, View } from 'react-native'; -import * as Device from 'expo-device'; - -export default function App() { - return ( - - - {Device.manufacturer}: {Device.modelName} - - - ); -} -``` - - +> **Note**: If you use TypeScript, you can see the information included in the API section in your TypeScript-compatible code editor (such as VS Code) with auto-completion. ## Third-party libraries @@ -93,7 +74,7 @@ export default function App() { [React Native Directory](https://reactnative.directory) is a searchable database of libraries built specifically for React Native. If the library that you are looking for is not provided by React Native or the Expo SDK then this is the best place to look first when trying to find a library for your app. -After the React Native Directory, the [npm registry](https://www.npmjs.com/) is the next best place. The npm registry is the definitive source for JavaScript libraries, but the libraries that it lists may not all be compatible with React Native. React Native is one of many JavaScript programming environments, including Node.js, web browsers, Electron, and more, and npm includes libraries that work for all of these environments. Any library that is compatible with React Native is compatible with the Expo project when you create a [development build](/workflow/overview/#development-builds). However, it may not be compatible with the [Expo Go][expo-go] app. +After the React Native Directory, the [npm registry](https://www.npmjs.com/) is the next best place. The npm registry is the definitive source for JavaScript libraries, but the libraries that it lists may not all be compatible with React Native. React Native is one of many JavaScript programming environments, including Node.js, web browsers, Electron, and more, and npm includes libraries that work for all of these environments. Any library that is compatible with React Native is compatible with the Expo project when you create a [development build](/workflow/overview/#development-builds). However, it may not be compatible with the [Expo Go](https://expo.dev/go) app. ### Determining third-party library compatibility @@ -118,9 +99,9 @@ To determine if a new dependency changes native project directories, you can che ### Installing a third-party library -> We recommend always using `npx expo install` instead of `npm install` or `yarn add` directly because it allows [Expo CLI][expo-cli] to pick a compatible version of a library when possible and also warn you about known incompatibilities. +> We recommend always using `npx expo install` instead of `npm install` or `yarn add` directly because it allows [Expo CLI](/more/expo-cli/) to pick a compatible version of a library when possible and also warn you about known incompatibilities. -Once you have determined if the library is compatible with React Native, use [Expo CLI][expo-cli] to install the package: +Once you have determined if the library is compatible with React Native, use [Expo CLI](/more/expo-cli/) to install the package: @@ -136,13 +117,10 @@ If your project does not support [Expo Prebuild](/workflow/prebuild) then you wo -If the module is not supported in [Expo Go][expo-go], you can create a [development build](/develop/development-builds/introduction/): +If the module is not supported in [Expo Go](https://expo.dev/go), you can create a [development build](/develop/development-builds/introduction/): - -[expo-cli]: /more/expo-cli/ -[expo-go]: https://expo.dev/go diff --git a/docs/public/static/images/guides/platform-tags.png b/docs/public/static/images/guides/platform-tags.png new file mode 100644 index 0000000000000000000000000000000000000000..b90282825fe556e63f6d56a16f5e7d2e0454e89d GIT binary patch literal 16016 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 literal 0 HcmV?d00001