Lazy loading (also known as asynchronous loading) is a
design pattern
A design pattern is the re-usable form of a solution to a design problem. The idea was introduced by the architect Christopher Alexander and has been adapted for various other disciplines, particularly software engineering. The " Gang of Four" b ...
commonly used in computer programming and mostly in web design and development to defer initialization of an object until the point at which it is needed. It can contribute to efficiency in the program's operation if properly and appropriately used. This makes it ideal in use cases where network content is accessed and initialization times are to be kept at a minimum, such as in the case of
web pages. For example, deferring loading of images on a web page until they are needed can make the initial display of the web page faster. The opposite of lazy loading is eager loading.
Examples
With web frameworks
Prior to being established as a web standard,
web framework
A web framework (WF) or web application framework (WAF) is a software framework that is designed to support the development of web applications including web services, web resources, and web APIs. Web frameworks provide a standard way to build an ...
s were generally used to implement lazy loading.
One of these is
AngularJS
AngularJS is a discontinued free and open-source JavaScript-based web framework for developing single-page applications. It was maintained mainly by Google and a community of individuals and corporations. It aimed to simplify both the developm ...
. Since lazy loading decreases bandwidth and subsequently server resources, it is a strong contender to implement in a website, especially in order to improve
user retention by having less delay when loading the page, which may also improve
Search Engine Optimization
Search engine optimization (SEO) is the process of improving the quality and quantity of website traffic to a website or a web page from search engines. SEO targets unpaid traffic (known as "natural" or " organic" results) rather than di ...
.
Below is an example of lazy loading being used in Angular, programmed in
TypeScript
TypeScript is a free and open source programming language developed and maintained by Microsoft. It is a strict syntactical superset of JavaScript and adds optional static typing to the language. It is designed for the development of large appl ...
fro
Farata Systems
@NgModule()
As a web standard
Since 2020, major web browsers have enabled native handling of lazy loading by default.
This allows lazy loading to be incorporated into a webpage by adding
HTML attributes
HTML attributes are special words used inside the opening tag to control the element's behaviour. HTML attributes are a modifier of an ''HTML element type''. An attribute either modifies the default functionality of an element type or provides fu ...
.
The
loading
attribute support two values,
lazy
and
eager
. Setting the value to
lazy
will fetch the resource only when it is required (such as when an image scrolls into view when a user scrolls down), while setting it to
eager
, the default state, the resource will be immediately loaded.
Methods
There are four common ways of implementing the lazy load design pattern: ''lazy initialization''; a ''virtual proxy''; a ''ghost'', and a ''value holder''.
Each has its own advantages and disadvantages.
Lazy initialization
With lazy initialization, the object is first set to
null
.
Whenever the object is requested, the object is checked, and if it is
null
, the object is then immediately created and returned.
For example, lazy loading for a widget can be implemented in the C# programming language as such:
private int myWidgetID;
private Widget myWidget = null;
public Widget MyWidget
Or alternatively, with the
null-coalescing assignment operator ??=
private int myWidgetID;
private Widget myWidget = null;
public Widget MyWidget
This method is the simplest to implement, although if
null
is a legitimate return value, it may be necessary to use a placeholder object to signal that it has not been initialized. If this method is used in a
multithreaded application, synchronization must be used to avoid
race conditions.
Virtual proxy
A virtual proxy is an object with the same interface as the real object. The first time one of its methods is called it loads the real object and then delegates.
Ghost
A
ghost is the object that is to be loaded in a partial state. It may initially only contain the object's identifier, but it loads its own data the first time one of its properties is accessed. For example, consider that a user is about to request content via an online form. At the time of creation, the only information available is that content will be accessed, but the specific action and content is unknown.
An example in PHP:
$userData = array (
"UID" = > uniqid(),
"requestTime" => microtime(true),
"dataType" => "",
"request" => ""
);
if (isset($_POST data' && $userData)
Value holder
A ''value holder'' is a generic object that handles the lazy loading behavior, and appears in place of the object's data fields:
private ValueHolder valueHolder;
public Widget MyWidget => valueHolder.GetValue();
See also
*
Design pattern
A design pattern is the re-usable form of a solution to a design problem. The idea was introduced by the architect Christopher Alexander and has been adapted for various other disciplines, particularly software engineering. The " Gang of Four" b ...
*
Proxy
*
Lazy evaluation
In programming language theory, lazy evaluation, or call-by-need, is an evaluation strategy which delays the evaluation of an expression until its value is needed ( non-strict evaluation) and which also avoids repeated evaluations ( sharing).
T ...
*
Lazy initialization
References
External links
Lazy Loading, Mozilla Developer Network
Software design patterns
{{compu-prog-stub