• Stars
    star
    8,021
  • Rank 4,439 (Top 0.09 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created about 7 years ago
  • Updated 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🚩 FastImage, performant React Native image component.

🚩 FastImage

Performant React Native image component.

Version Downloads Build Status Code Coverage

Watch on GitHub Star on GitHub Tweet


FastImage example app.

React Native's Image component handles image caching like browsers for the most part. If the server is returning proper cache control headers for images you'll generally get the sort of built in caching behavior you'd have in a browser. Even so many people have noticed:

  • Flickering.
  • Cache misses.
  • Low performance loading from cache.
  • Low performance in general.

FastImage is an Image replacement that solves these issues. FastImage is a wrapper around SDWebImage (iOS) and Glide (Android).

Features

  • Aggressively cache images.
  • Add authorization headers.
  • Prioritize images.
  • Preload images.
  • GIF support.
  • Border radius.

Usage

Note: You must be using React Native 0.60.0 or higher to use the most recent version of react-native-fast-image.

yarn add react-native-fast-image
cd ios && pod install
import FastImage from 'react-native-fast-image'

const YourImage = () => (
    <FastImage
        style={{ width: 200, height: 200 }}
        source={{
            uri: 'https://unsplash.it/400/400?image=1',
            headers: { Authorization: 'someAuthToken' },
            priority: FastImage.priority.normal,
        }}
        resizeMode={FastImage.resizeMode.contain}
    />
)

Are you using Glide already using an AppGlideModule?

Are you using Proguard?

If you use Proguard you will need to add these lines to android/app/proguard-rules.pro:

-keep public class com.dylanvann.fastimage.* {*;}
-keep public class com.dylanvann.fastimage.** {*;}
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

Properties

source?: object

Source for the remote image to load.


source.uri?: string

Remote url to load the image from. e.g. 'https://facebook.github.io/react/img/logo_og.png'.


source.headers?: object

Headers to load the image with. e.g. { Authorization: 'someAuthToken' }.


source.priority?: enum

  • FastImage.priority.low - Low Priority.
  • FastImage.priority.normal (Default) - Normal Priority.
  • FastImage.priority.high - High Priority.

source.cache?: enum

  • FastImage.cacheControl.immutable - (Default) - Only updates if url changes.
  • FastImage.cacheControl.web - Use headers and follow normal caching procedures.
  • FastImage.cacheControl.cacheOnly - Only show images from cache, do not make any network requests.

defaultSource?: number

  • An asset loaded with require(...).
  • Note that like the built-in Image implementation, on Android defaultSource does not work in debug mode. This is due to the fact that assets are sent from the dev server, but RN's functions only know how to load it from res.

resizeMode?: enum

  • FastImage.resizeMode.contain - Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding).
  • FastImage.resizeMode.cover (Default) - Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or larger than the corresponding dimension of the view (minus padding).
  • FastImage.resizeMode.stretch - Scale width and height independently, This may change the aspect ratio of the src.
  • FastImage.resizeMode.center - Do not scale the image, keep centered.

onLoadStart?: () => void

Called when the image starts to load.


onProgress?: (event) => void

Called when the image is loading.

e.g. onProgress={e => console.log(e.nativeEvent.loaded / e.nativeEvent.total)}


onLoad?: (event) => void

Called on a successful image fetch. Called with the width and height of the loaded image.

e.g. onLoad={e => console.log(e.nativeEvent.width, e.nativeEvent.height)}


onError?: () => void

Called on an image fetching error.


onLoadEnd?: () => void

Called when the image finishes loading, whether it was successful or an error.


style

A React Native style. Supports using borderRadius.


fallback: boolean

If true will fallback to using Image. In this case the image will still be styled and laid out the same way as FastImage.


tintColor?: number | string

If supplied, changes the color of all the non-transparent pixels to the given color.

Static Methods

FastImage.preload: (source[]) => void

Preload images to display later. e.g.

FastImage.preload([
    {
        uri: 'https://facebook.github.io/react/img/logo_og.png',
        headers: { Authorization: 'someAuthToken' },
    },
    {
        uri: 'https://facebook.github.io/react/img/logo_og.png',
        headers: { Authorization: 'someAuthToken' },
    },
])

FastImage.clearMemoryCache: () => Promise<void>

Clear all images from memory cache.

FastImage.clearDiskCache: () => Promise<void>

Clear all images from disk cache.

Troubleshooting

If you have any problems using this library try the steps in troubleshooting and see if they fix it.

Development

Follow these instructions to get the example app running.

Supported React Native Versions

This project only aims to support the latest version of React Native.
This simplifies the development and the testing of the project.

If you require new features or bug fixes for older versions you can fork this project.

Credits

The idea for this modules came from vovkasm's react-native-web-image package. It also uses Glide and SDWebImage, but didn't have some features I needed (priority, headers).

Thanks to @mobinni for helping with the conceptualization

Licenses

  • FastImage - MIT © DylanVann
  • SDWebImage - MIT
  • Glide - BSD, part MIT and Apache 2.0. See the LICENSE file for details.

More Repositories

1

DatePickerCell

📅 Inline/Expanding date picker for table views.
Swift
326
star
2

react-native-progressive-image

🌁 ProgressiveImage, progressively load images with React Native.
Objective-C
205
star
3

ant-design-draggable-modal

The Modal from Ant Design, draggable.
TypeScript
160
star
4

perfect-dark-mode

🌚🌝 Perfect Dark Mode
TypeScript
91
star
5

beezel

Remote build caching for JS monorepos.
TypeScript
30
star
6

i18next-react-native-language-detector

i18next react native language detection.
JavaScript
25
star
7

check-pull-request-title

A GitHub action that checks that a PR title matches a regex pattern.
TypeScript
21
star
8

yarn-workspaces-to-typescript-project-references

Sync Yarn workspace dependencies with TypeScript project references.
TypeScript
20
star
9

react-native-locale-detector

Detects the locale of a user's phone.
Java
17
star
10

typescript-migration-demo

Example of how to incrementally migrate an app to TypeScript.
JavaScript
14
star
11

use-persisted

Persisted versions of useState and useReducer.
TypeScript
12
star
12

redux-saga-request

🏞 Redux Saga Request, request helper for Redux Saga.
JavaScript
11
star
13

react-native-blur-image

React Native Image with cross platform blurRadius property.
Java
10
star
14

redux-shorthand-example

Example of how to use redux shorthand.
JavaScript
9
star
15

gatsby-transformer-cloudinary

Gatsby transformer for Cloudinary.
TypeScript
8
star
16

presskit-static

🗞 A static version of presskit(), with Grunt/Jade/SASS/YAML.
HTML
8
star
17

react-fast-image

🚩 FastImage, performant React image component.
TypeScript
7
star
18

ColorLockView

UITableViewCell highlighting does not change the color of ColorLockViews.
Swift
7
star
19

media.macro

Babel macro to load media.
TypeScript
6
star
20

babelts

Run TypeScript code with Babel.
JavaScript
5
star
21

react-video-tag

Render <video> in React using dangerouslySetInnerHTML.
TypeScript
5
star
22

react-native-camera-roll

Native module to get photos from the device.
Objective-C
5
star
23

advent-of-code-2019

Solutions to Advent of Code 2019.
Reason
5
star
24

media-server

Solution for image and video processing using S3/Lambda/API Gateway/CloudFront.
TypeScript
5
star
25

dv-scripts

Scripts for Node/TypeScript development.
TypeScript
4
star
26

dylans-codemods

Dylan's codemods.
JavaScript
3
star
27

react-splt

A tiny (1kb) React component for split panes (written in ReasonML).
JavaScript
3
star
28

gatsby-cloudinary

This module powers gatsby-remark-cloudinary and gatsby-transformer-cloudinary.
TypeScript
2
star
29

node-docker-monorepo-example

TypeScript
2
star
30

print-yarn-workspace-graph

Print the dependency graph of a yarn workspace.
JavaScript
2
star
31

gatsby-remark-cloudinary

Convert markdown images and videos into custom components with Cloudinary urls.
TypeScript
2
star
32

react-cleaner-markup-example

Example of how you can use React 16 to produce cleaner markup.
JavaScript
1
star
33

rely-example

Example of rely testing.
OCaml
1
star
34

com_dylanvann_bazel_test

Python
1
star
35

bundler-and-compiler-benchmarks

Benchmarks of JavaScript/TypeScript/ReasonML compilation and bundling.
1
star
36

relay-todo-example

Relay + TypeScript + Todo
TypeScript
1
star
37

react-img-tag

This module is for rendering images in React using dangerouslySetInnerHTML.
TypeScript
1
star
38

AIRSensor

An Arduino IR sensor library.
C++
1
star
39

react-native-photo-picker

JavaScript
1
star