AdvancedTechniquesforAngularPerformanceEnhancement StrategiesforOptimizingRenderingReducingLatencyandImprovingUserExperienceinModernWebApplications
AdvancedTechniquesforAngularPerformanceEnhancement StrategiesforOptimizingRenderingReducingLatencyandImprovingUserExperienceinModernWebApplications
net/publication/386215104
CITATIONS READS
0 6
1 author:
Alejandro Ramos
Universidad de San Andrés
9 PUBLICATIONS 11 CITATIONS
SEE PROFILE
All content following this page was uploaded by Alejandro Ramos on 28 November 2024.
I. Introduction
A. Background on Angular
1. Overview of Angular Framework
Angular is a platform and framework for building single-page client applications using
HTML and TypeScript. Developed and maintained by Google, it provides a robust and
scalable solution for modern web application development. Angular is often referred to as
"Angular 2+" to distinguish it from its predecessor, AngularJS (or Angular 1.x). Angular's
architecture is based on components and services, enabling modular development and
fostering reusability and maintainability.
17
The core philosophy of Angular revolves around declarative templates, dependency
injection, end-to-end tooling, and integrated best practices to solve development
challenges. Its powerful features include a component-based architecture, reactive
programming with RxJS, a comprehensive router, and a powerful CLI (Command Line
Interface) that streamlines the development workflow. Angular also emphasizes testability,
providing comprehensive support for unit and end-to-end testing.[1]
Angular's component-based architecture promotes encapsulation and separation of
concerns, allowing developers to break down complex UIs into smaller, reusable
components. Each component in Angular consists of a template, a class that defines the
component's behavior, and metadata that describes how the component should be
processed, instantiated, and used at runtime. This modular approach enhances
maintainability and scalability, making it easier to manage large codebases and collaborate
with teams.
18
Angular, being a comprehensive framework, offers several tools and techniques to
optimize performance. These include Ahead-of-Time (AOT) compilation, tree shaking,
lazy loading, and change detection strategies. AOT compilation pre-compiles the
application during the build process, reducing the amount of JavaScript to be parsed and
executed at runtime. Tree shaking eliminates unused code, reducing the bundle size and
improving load times. Lazy loading allows for the deferral of module loading until they
are needed, enhancing initial load performance. Change detection strategies, such as
OnPush, optimize how and when the UI updates in response to data changes, reducing
unnecessary computations.[3]
19
costly in large applications. Techniques like OnPush change detection and immutability
can significantly reduce the overhead of change detection, improving the application's
responsiveness.
Additionally, leveraging Angular's Ahead-of-Time (AOT) compilation can enhance
performance by pre-compiling the application during the build process. AOT compilation
reduces the amount of JavaScript to be parsed and executed at runtime, resulting in faster
load times and better performance. Combined with tree shaking, which eliminates unused
code, AOT compilation can produce smaller and more efficient bundles.
20
-Efficient Data Handling: Best practices for managing and processing data efficiently,
including the use of RxJS for reactive programming.
-Performance Profiling and Monitoring: Utilizing profiling tools and performance
metrics to identify bottlenecks and measure the impact of optimizations.
-Optimizing Network Requests: Techniques to minimize the impact of network requests,
including caching strategies and efficient data fetching.
-Improving Rendering Performance: Strategies to optimize the rendering performance
of the application, including virtual scrolling and component reuse.
21
II. Fundamentals of Angular Performance
A. Angular Architecture
1. Core Components and Modules
Angular, a platform and framework for building single-page client applications using
HTML and TypeScript, is built on several core components and modules. Understanding
these core elements is crucial for optimizing performance.
Components: Components are the fundamental building blocks of Angular applications.
Each component consists of a TypeScript class, an HTML template, and a CSS stylesheet.
The class contains properties and methods to handle data and user interactions. The
template defines the view, and the stylesheets provide the appearance. By using
components, developers can divide the application into smaller, manageable parts, each
responsible for a specific piece of functionality.
Modules: Angular applications are modular. A module is a cohesive block of code
dedicated to a particular application domain, a workflow, or a closely related set of
capabilities. Modules can import functionalities from other modules and export
functionalities to be used elsewhere in the application. The root module, typically named
AppModule, is the entry point of the application. Angular uses other modules like
BrowserModule, HttpClientModule, and FormsModule to provide essential services and
functionalities.
Services: Services in Angular are used to share data and logic across components. They
are typically singleton objects, created once and shared throughout the application.
Services are defined as classes and are used to encapsulate business logic and data access.
Dependency injection (DI) is used to provide services to components and other services.
22
B. Common Performance Issues
1. Memory Leaks
Memory leaks are one of the most common performance issues in Angular applications. A
memory leak occurs when the application retains references to objects that are no longer
needed, preventing the garbage collector from reclaiming memory. Over time, this can lead
to increased memory usage and degraded performance.
Unsubscribed Observables: One of the primary sources of memory leaks in Angular is
unsubscribed observables. Observables are used extensively in Angular for handling
asynchronous operations. However, if subscriptions to observables are not properly
managed, they can continue to consume memory even after the component that created
them has been destroyed. To prevent this, developers should unsubscribe from observables
in the ngOnDestroy lifecycle hook or use the async pipe in templates, which automatically
handles subscription and unsubscription.[1]
Detached DOM Elements: Another common cause of memory leaks is detached DOM
elements. When a component is destroyed, its associated DOM elements should also be
removed. However, if there are lingering references to these elements, they can remain in
memory. This can happen if event listeners are not properly removed or if third-party
libraries retain references to DOM elements. Developers should ensure that all event
listeners are cleaned up and that third-party libraries are used correctly.[8]
23
One-Way vs. Two-Way Binding: Angular supports both one-way and two-way data
binding. One-way binding updates the view when the model changes, while two-way
binding updates both the view and the model. Two-way binding can be convenient but may
introduce performance overhead due to additional change detection cycles. Developers
should use one-way binding whenever possible and reserve two-way binding for scenarios
where it is essential.
Avoiding Excessive Bindings: Binding too many properties in a template can lead to
performance issues. Each binding creates a watcher that Angular must check during change
detection. Developers should avoid binding properties that rarely change and consider
using pure pipes, which are only recalculated when their inputs change.
Optimizing Change Detection: As mentioned earlier, using the OnPush change detection
strategy can improve performance by reducing the number of change detection cycles.
Additionally, developers can use trackBy functions with ngFor to optimize list rendering
and prevent unnecessary re-renders.
In conclusion, understanding the fundamentals of Angular's architecture and change
detection mechanism is essential for optimizing performance. By addressing common
performance issues such as memory leaks, slow rendering times, and inefficient data
binding, developers can create fast and efficient Angular applications. Proper management
of observables, efficient template code, optimized data binding, and smart use of Angular's
change detection strategies are key to achieving optimal performance.[10]
2. Chrome DevTools
Chrome DevTools is an essential suite of web developer tools integrated directly into the
Google Chrome browser. It provides a comprehensive set of features for debugging,
profiling, and analyzing the performance of web applications. The Performance panel in
Chrome DevTools allows developers to record and analyze the runtime performance of
their applications.[10]
24
With Chrome DevTools, developers can capture detailed performance traces, visualize the
call stack, and identify performance bottlenecks. The tool provides a breakdown of the time
spent on various activities such as scripting, rendering, and painting, helping developers
pinpoint areas that need optimization.[12]
Moreover, Chrome DevTools offers features like the Lighthouse audit and the ability to
simulate different network conditions. These features enable developers to test their
applications under various scenarios and ensure optimal performance across different
environments.
3. Lighthouse
Lighthouse is an open-source, automated tool for improving the quality of web pages. It
provides audits for performance, accessibility, progressive web apps, SEO, and more.
Developers can run Lighthouse in Chrome DevTools, from the command line, or as a Node
module.[13]
Lighthouse generates detailed reports on various performance metrics, including First
Contentful Paint (FCP), Time to Interactive (TTI), and more. These reports highlight areas
where the application meets best practices and areas needing improvement. The tool also
provides actionable recommendations to help developers enhance the performance and
overall quality of their applications.
For example, Lighthouse can identify large JavaScript bundles that may be slowing down
the initial load time. By following the recommendations, such as code splitting and lazy
loading, developers can optimize the performance and provide a better user experience.
25
A low FCP value is crucial for providing a good user experience. Users are more likely to
stay engaged with a web page if they see content appearing quickly. To achieve a low FCP,
developers can optimize the delivery of critical resources, reduce render-blocking scripts,
and prioritize above-the-fold content.
Techniques such as server-side rendering, preloading critical resources, and optimizing
CSS can help improve FCP. By ensuring that the initial content is rendered quickly,
developers can create a positive first impression and keep users engaged.
C. Benchmarking Strategies
1. Setting up Test Environments
Creating accurate and consistent test environments is essential for reliable performance
benchmarking. A controlled environment ensures that the performance results are
reproducible and comparable across different tests. There are several key considerations
when setting up test environments for performance benchmarking.
Firstly, it is important to use dedicated hardware and network configurations to minimize
external factors that may affect the results. Running tests on real devices, rather than
emulators, provides more accurate measurements. Additionally, isolating the test
environment from other processes and network traffic ensures that the results are not
influenced by background activities.
Secondly, using consistent test data and scenarios is crucial for obtaining reliable
benchmarks. This includes using the same datasets, user interactions, and test scripts for
each benchmarking session. By maintaining consistency, developers can accurately
compare the performance of different versions or configurations of their applications.
Lastly, automating the benchmarking process can help streamline the testing workflow and
reduce human errors. Tools like Selenium, Puppeteer, and Lighthouse CLI can be used to
automate the execution of performance tests and generate reports. Automated tests can be
scheduled to run at regular intervals, providing continuous insights into the performance
of the application.[16]
26
2. Interpreting Results
Interpreting performance benchmarking results requires a thorough understanding of the
metrics and their implications. It is important to analyze the results in the context of the
application's goals and user expectations. Here are some key steps to effectively interpret
benchmarking results.
Firstly, comparing the results against established performance baselines and industry
standards helps identify areas needing improvement. For instance, if the Time to Interactive
(TTI) is significantly higher than the recommended threshold, it indicates that the
application may need optimization to improve interactivity.
Secondly, identifying performance trends over time can provide valuable insights. By
tracking performance metrics across different versions or releases, developers can
determine whether the changes introduced have positively or negatively impacted the
performance. This trend analysis helps in making informed decisions about future
optimizations and enhancements.
Thirdly, correlating performance metrics with user behavior and feedback can provide a
holistic view of the application's performance. For example, if users report slow load times
or unresponsive interactions, analyzing the corresponding performance metrics can help
pinpoint the root causes. This user-centric approach ensures that performance
improvements align with user expectations and lead to a better overall experience.[16]
Lastly, prioritizing performance optimizations based on the impact and feasibility is
crucial. Not all performance issues have the same level of impact on the user experience.
By focusing on high-impact optimizations, developers can achieve significant performance
gains with limited resources. Techniques like code splitting, lazy loading, and optimizing
critical rendering paths can provide substantial improvements with relatively low
effort.[17]
By leveraging these benchmarking strategies and interpreting the results effectively,
developers can continuously monitor, analyze, and optimize the performance of their web
applications, ensuring a seamless and responsive user experience.
27
- When the component is explicitly marked for check using markForCheck.
The primary advantage of OnPush is that it minimizes the number of checks Angular
performs, thereby enhancing the application's performance. This is particularly beneficial
in scenarios where the data does not change frequently or when the data updates are
predictable and controlled.
However, using OnPush requires developers to be more mindful of how data flows through
their application. Since Angular will not automatically detect changes to objects or arrays
that are mutated directly, developers must ensure they create new instances of objects or
arrays when they update them. This ensures that Angular's change detection mechanism
can detect the change and update the view accordingly.
28
Implementing lazy loading in Angular involves several steps:
1.Create a Lazy-Loaded Module: Define a module that will be loaded lazily. This module
should contain the components, services, and other resources that are specific to a particular
feature or section of the application.
2.Configure Routing: Update the application's routing configuration to use the
loadChildren property for the routes that should be lazy-loaded. This property specifies the
module to load when the route is activated.
3.Use Dynamic Imports: Ensure that the module specified in the loadChildren property is
imported dynamically using the import function.
Here’s an example of how to configure lazy loading in Angular:
typescript
const routes: Routes = [
{
path: 'feature',
loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule)
}
];
By implementing lazy loading, applications can significantly reduce the initial load time,
as only the necessary resources are loaded initially. This leads to a better user experience,
especially for large applications with many features.
29
Implementing code splitting in Angular is straightforward, as Angular’s built-in tools and
libraries, such as the Angular CLI and Webpack, provide support for code splitting and
lazy loading out of the box.
30
"aot": true,
...
}
}
By enabling AOT, developers can ensure that their Angular applications are optimized for
performance and security, leading to a better user experience and more efficient resource
usage.
D. Tree Shaking
1. Concept of Tree Shaking
Tree shaking is a technique used to optimize JavaScript bundles by removing unused code.
The term "tree shaking" refers to the process of shaking a tree to remove dead leaves,
analogous to removing dead or unused code from the application.
Tree shaking works by analyzing the dependency graph of the application and identifying
code that is not used or referenced. This unused code is then excluded from the final bundle,
resulting in smaller bundle sizes and improved load times.
Tree shaking is particularly effective in modern JavaScript applications that use ES6
modules, as the static structure of ES6 modules allows for better analysis and optimization.
By leveraging tree shaking, developers can ensure that only the necessary code is included
in the final bundle, leading to more efficient and performant applications.
31
bash
ng build --prod
This command triggers the production build process, which includes tree shaking, AOT
compilation, and other optimizations.
3.Verify Bundle Size: After building the application, verify the bundle size to ensure that
tree shaking has been applied correctly. Tools like source-map-explorer can be used to
analyze the bundle and identify any remaining unused code.
By configuring tree shaking in Angular, developers can ensure that their applications are
optimized for performance, with smaller bundle sizes and faster load times. This leads to a
better user experience and more efficient resource usage.
32
B. Optimizing Template Rendering
Template rendering is a crucial aspect of web applications, as it directly impacts the user
experience by determining how quickly and efficiently the UI is updated and displayed.
33
2. Pagination strategies
Pagination is another effective strategy for handling large data sets. By dividing the data
into smaller, manageable chunks (pages), the application can load and render only the data
required for the current view.
Pagination can be implemented in various ways, such as:
-Client-side pagination: The entire data set is loaded initially, and the application manages
the pagination logic on the client side.
-Server-side pagination: The server responds with only the data required for the current
page, reducing the amount of data transferred and processed on the client side.
Server-side pagination is especially beneficial for very large data sets or when dealing with
limited client resources, as it minimizes the workload on the client and leverages the
server's processing power.
By combining virtual scrolling and pagination strategies, developers can efficiently
manage large data sets, ensuring optimal performance and a seamless user experience.
34
2.Network First: This method tries to fetch the resource from the network first. If the
network request fails (e.g., the user is offline), it serves the resource from the cache. This
strategy is useful for dynamic content like API responses.
3.Cache Only: This approach serves resources exclusively from the cache. If the resource
is not cached, the request fails. It's suitable for critical resources that are guaranteed to be
cached during the service worker's installation phase.
4.Network Only: This strategy fetches resources solely from the network, bypassing the
cache entirely. It's appropriate for resources that must always be up-to-date and where
offline access is not a concern.
B. HTTP Caching
1. Setting HTTP Headers
HTTP caching is a fundamental optimization technique that leverages HTTP headers to
control how and for how long browsers and intermediate proxies cache resources. Key
HTTP headers include:
1.Cache-Control: This header specifies directives for caching mechanisms in both
requests and responses. Common directives are:
- max-age: Defines the maximum time (in seconds) a resource is considered fresh.
- no-cache: Forces caches to submit the request to the origin server for validation before
releasing a cached copy.
- no-store: Prevents caching of the resource at any stage.
- public and private: Control whether the response can be cached by any cache or only by
the browser's cache, respectively.
2.Expires: This header provides an absolute expiration date and time for the cached
resource. However, it is often superseded by Cache-Control directives.
35
Properly configuring these headers can significantly improve application performance by
reducing server load, minimizing latency, and enhancing user experience.
C. State Management
1. NgRx for State Management
NgRx is a reactive state management library for Angular applications based on the Redux
pattern. It provides a single source of truth for application state, enabling predictable state
transitions and simplifying state management.
1.Store: The store is a centralized state container that holds the application state. It is an
immutable object that can only be modified through dispatched actions.
2.Actions: Actions are payloads of information that send data from the application to the
store. They describe the type of change to be made to the state. Actions are dispatched
using the store.dispatch method.
3.Reducers: Reducers specify how the state changes in response to actions. They are pure
functions that take the current state and an action as arguments and return a new state.
4.Selectors: Selectors are pure functions used to extract specific pieces of state from the
store. They help optimize performance by selecting only the necessary data, reducing
unnecessary re-renders.
5.Effects: Effects handle side effects, such as asynchronous operations and interactions
with external services. They listen for particular actions and perform tasks like HTTP
requests, dispatching new actions based on the results.
36
NgRx facilitates the development of scalable and maintainable applications by providing a
structured approach to state management, ensuring that state changes are predictable and
traceable.
37
the need for the Just-in-Time (JIT) compiler. This means that the browser can render the
application more quickly, as it doesn't have to compile the code at runtime.
Tree Shaking:Tree shaking is a technique used to eliminate dead code, which refers to
parts of the code that are never used or executed. By analyzing the dependency tree of the
application, Angular CLI can remove these unnecessary parts, reducing the final bundle
size and improving load times.
Differential Loading: Differential loading allows Angular CLI to create two separate
bundles for modern and legacy browsers. Modern browsers can take advantage of ES2015+
features, while legacy browsers receive a bundle that includes polyfills and code transpiled
to ES5. This approach ensures optimal performance for users regardless of the browser
they are using.[24]
Moreover, Angular CLI offers various commands and flags to further customize the
production build process. For example, developers can use the --prod flag to enable
production mode, which activates various performance optimizations and minifies the
output. Additionally, the --aot flag can be used to enable AOT compilation explicitly, and
the --build-optimizer flag can further optimize the build by removing Angular decorators
and other unnecessary code.
38
side, SSR generates the HTML on the server and sends it to the client. This approach
provides several advantages:
Improved Performance: SSR can improve the initial load time of the application by
rendering the content on the server and sending fully rendered HTML to the client. This
reduces the time it takes for the user to see the content, as the browser doesn't need to wait
for JavaScript to be downloaded and executed.[23]
SEO Benefits:Search engines often have difficulty indexing content that is rendered on
the client side. SSR ensures that the content is available in the HTML response, making it
easier for search engines to crawl and index the application. This can improve the
application's search engine ranking and visibility.
Enhanced User Experience: By delivering fully rendered HTML, SSR can provide a better
user experience, especially for users on slower networks or devices with limited processing
power. The initial load time is reduced, and the content is visible to the user more quickly,
resulting in a smoother and more responsive experience.[17]
Better Social Media Sharing:When sharing links on social media platforms, SSR ensures
that the metadata and content are available in the HTML response. This allows social media
platforms to generate rich previews of the shared content, enhancing the visibility and
engagement of the shared links.
39
import { AppServerModule } from './src/main.server';
import { APP_BASE_HREF } from '@angular/common';
import { existsSync } from 'fs';
const app = express();
const distFolder = join(process.cwd(), 'dist/<app-name>/browser');
const indexHtml = existsSync(join(distFolder, 'index.original.html')) ?
'index.original.html' : 'index';
app.engine('html', ngExpressEngine({
bootstrap: AppServerModule,
}));
app.set('view engine', 'html');
app.set('views', distFolder);
app.get('*.*', express.static(distFolder, {
maxAge: '1y'
}));
app.get('*', (req, res) => {
res.render(indexHtml, { req, providers: [{ provide: APP_BASE_HREF, useValue:
req.baseUrl }] });
});
app.listen(4000, () => {
console.log(Node Express server listening on http://localhost:4000);
});
Step 3: Update Angular Configuration:The next step is to update the Angular
configuration to include a server build target. This can be done by adding a new build target
to the angular.json file:
json
{
"projects": {
"<app-name>": {
"architect": {
"build": {
40
"options": {
"outputPath": "dist/<app-name>/browser"
}
},
"server": {
"options": {
"outputPath": "dist/<app-name>/server"
}
}
}
}
}
}
Step 4: Build and Serve the Application:Finally, build the application for both the client
and server, and then start the server:
sh
ng build --prod
ng run <app-name>:server
node dist/<app-name>/server/main.js
This will start the server and render the Angular application on the server, delivering fully
rendered HTML to the client.
41
Automated Monitoring: Setting up automated monitoring can help detect performance
issues early and ensure that they are addressed promptly. This can be achieved by
integrating performance monitoring tools with CI/CD pipelines. For example, Lighthouse
CI can be integrated with a CI/CD pipeline to run performance tests on every build and
generate detailed performance reports.[26]
Alerting and Reporting:Implementing alerting mechanisms can help notify developers of
potential performance issues in real-time. Tools like New Relic and Datadog offer alerting
features that can be configured to trigger notifications based on predefined performance
thresholds. Additionally, regular performance reports can be generated and shared with the
development team to provide insights into the application's performance over time.
42
scalability of a web application. By implementing these practices, development teams can
ensure that their applications remain performant, secure, and maintainable over time.
VIII. Conclusion
A. Summary of Key Findings
1. Effective Techniques for Improving Angular Performance
In our research, we identified several effective techniques that can significantly enhance
the performance of Angular applications. One of the primary techniques is the
implementation of Change Detection Strategy. Angular's default change detection
mechanism can be optimized by using the OnPush strategy, which allows the developer to
control when the component's view should be updated. This results in fewer checks and
faster performance.
Another crucial technique is the use of Angular's built-in trackBy function in ngFor
directives. The trackBy function helps Angular keep track of items in a list, thereby
reducing the number of DOM manipulations needed when the list changes. This is
especially beneficial for applications dealing with large datasets.[15]
Lazy loading of modules is also a highly recommended practice. By loading modules only
when they are required, the initial load time of the application can be significantly reduced.
This is achieved by breaking the application into smaller modules and loading them on
demand.
Additionally, we found that optimizing template expressions can lead to substantial
performance gains. Complex expressions or functions called within the template are
evaluated every time Angular's change detection runs, which can be costly. Simplifying
these expressions or moving logic to the component class can mitigate this issue.
Finally, using Angular's Ahead-of-Time (AOT) compilation can improve the performance
of the application. AOT compiles the Angular application during the build process, which
reduces the amount of work the browser has to do at runtime. This results in faster
rendering and a smaller application size.
43
The overall result is a more robust application that not only meets user expectations but
also stands out in a competitive market. Performance optimization is not just a technical
necessity but a strategic advantage that enhances both user satisfaction and business
outcomes.
44
Lastly, ignoring mobile optimization is a critical oversight. Many users access applications
on mobile devices, which have different performance constraints compared to desktops.
Ensuring that the application is responsive and optimized for mobile usage is essential for
delivering a consistent user experience.
References
[1] P., Japikse "Building web applications with .net core 2.1 and javascript: leveraging
modern javascript frameworks." Building Web Applications with .NET Core 2.1 and
JavaScript: Leveraging Modern JavaScript Frameworks (2019): 1-615
[2] C., Zimmerle "Reactive-based complex event processing: an overview and energy
consumption analysis of cep.js." ACM International Conference Proceeding Series (2019):
84-93
[3] Q., Zhang "Artificial neural networks enabled by nanophotonics." Light: Science and
Applications 8.1 (2019)
[4] A., Kulshreshta "Web based accounting integrated management system (aims) over
cloud using mean stack." IEEE International Conference on Issues and Challenges in
Intelligent Computing Techniques, ICICT 2019 (2019)
45
[5] Jani, Yash. "Angular performance best practices." European Journal of Advances in
Engineering and Technology 7.3 (2020): 53-62.
[6] L., You "Jdap: supporting in-memory data persistence in javascript using intel's pmdk."
Journal of Systems Architecture 101 (2019)
[7] Q., Zhang "Development and implementation of web front-end of cloud platform for
intelligent seeder operation supervision." Journal of Chinese Agricultural Mechanization
40.6 (2019): 167-172
[8] B., Khaldi "Swarm robots circle formation via a virtual viscoelastic control model."
Proceedings of 2016 8th International Conference on Modelling, Identification and
Control, ICMIC 2016 (2017): 725-730
[9] S.V., Kalinichenko "Simulation in matlab of a vertical walking three-link robot." AIP
Conference Proceedings 2195 (2019)
[10] M., Gholami "Lower body kinematics monitoring in running using fabric-based
wearable sensors and deep convolutional neural networks." Sensors (Switzerland) 19.23
(2019)
[11] H., Puškarić "Development of web based application using spa architecture."
Proceedings on Engineering Sciences 1.2 (2019): 457-464
[12] J., Sun "Selwasm: a code protection mechanism for webassembly." Proceedings -
2019 IEEE Intl Conf on Parallel and Distributed Processing with Applications, Big Data
and Cloud Computing, Sustainable Computing and Communications, Social Computing
and Networking, ISPA/BDCloud/SustainCom/SocialCom 2019 (2019): 1099-1106
[13] D., Johannes "A large-scale empirical study of code smells in javascript projects."
Software Quality Journal 27.3 (2019): 1271-1314
[14] D., Sindhanaiselvi "Design and implementation of indoor tracking system using
inertial sensor." Lecture Notes in Electrical Engineering 521 (2019): 465-473
[15] B., Nelson "Getting to know vue.js: learn to build single page applications in vue from
scratch." Getting to Know Vue.js: Learn to Build Single Page Applications in Vue from
Scratch (2018): 1-265
[16] V.K., Kotaru "Angular for material design: leverage angular material and typescript
to build a rich user interface for web apps." Angular for Material Design: Leverage Angular
Material and TypeScript to Build a Rich User Interface for Web Apps (2019): 1-364
[17] C., Rieger "Towards the definitive evaluation framework for cross-platform app
development approaches." Journal of Systems and Software 153 (2019): 175-199
[18] M.C., Loring "Semantics of asynchronous javascript." ACM SIGPLAN Notices 52.11
(2017): 51-62
[19] E., Nikulchev "Study of cross-platform technologies for data delivery in regional web
surveys in the education." International Journal of Advanced Computer Science and
Applications 10.10 (2019): 14-19
46
[20] A., Biørn-Hansen "A survey and taxonomy of core concepts and research challenges
in cross-platform mobile development." ACM Computing Surveys 51.5 (2019)
[21] A., Sterling "Nodejs and angular tools for json-ld." Proceedings - 13th IEEE
International Conference on Semantic Computing, ICSC 2019 (2019): 392-395
[22] N.G., Obbink "An extensible approach for taming the challenges of javascript dead
code elimination." 25th IEEE International Conference on Software Analysis, Evolution
and Reengineering, SANER 2018 - Proceedings 2018-March (2018): 391-401
[23] V., Venkatraman "Quantitative structure-property relationship modeling of grätzel
solar cell dyes." Journal of Computational Chemistry 35.3 (2014): 214-226
[24] O.C., Ann "A study on satisfaction level among amateur web application developers
towards pigeon-table as nano web development framework." Journal of Organizational and
End User Computing 31.3 (2019): 97-112
[25] K.L., Du "Neural networks and statistical learning, second edition." Neural Networks
and Statistical Learning, Second Edition (2019): 1-988
[26] C., Gleason "“it's almost like they're trying to hide it": how user-provided image
descriptions have failed to make twitter accessible." The Web Conference 2019 -
Proceedings of the World Wide Web Conference, WWW 2019 (2019): 549-559
47