
With over seven years of experience in web development, Arjun Shrivastava has established himself as a proficient and versatile professional adept in a multitude of technologies and frameworks. Specializing in frontend development, he has demonstrated expertise in React JS, NextJS, JavaScript, and SASS, consistently delivering high-quality and innovative solutions. He has led the development of various projects ranging from e-commerce platforms to internet banking applications, leveraging his skills to enhance user experience and drive business growth. His strong understanding of software architecture, coupled with his ability to adapt to new technologies and industry trends, positions him as a valuable asset capable of contributing to diverse development teams and projects.
Senior Frontend Developer
Emirates Digital WalletSenior Frontend Developer
AGC AlokozaySenior Frontend Developer
Mashreq BankIT Associate
Daffodil SoftwareSoftware Engineer
Naehas Inc
Git

CSS3 & CSS5

tailwind css

Javascript

HTML5

TypeScript

Next.js

Express.js
Node.js
AWS (Amazon Web Services)

React Native

React Query

ReactJS

React Router

Redux Toolkit

Redux-Saga
NPM

Webpack

Sass

NextJS

Storybook

React-Native

react-testing-library

express

Redux

Jest

Cypress

GraphQL

Web Accessibility

Tailwind

Microfrontend

Storybook

AWS

HTML

CSS

SCSS

CI/CD
Technologies: ReactJS, React-Native, Redux, react-swr, HTML, CSS, TypeScript, GA4, Storybook, Azure,
Technologies: NodeJS, ReactJS, MySQL, TypeScript, Webpack, redux, redux-saga, Microfrontend, Storybook, Jest, HTML, CSS, JavaScript, AWS, Jenkins,
Technologies: ReactJS, NodeJS, Web-Sockets, PostgreSQL, HTML, CSS, JavaScript, react-native, AWS, Google Analytics
Technologies: ReactJS, Google Extension APIs, Google Analytics, MongoDB, WebSocket, HTML, CSS, JavaScript, AWS, Jest
I'm a senior front-end developer. My name is, and I'm a senior front-end developer with eight years of experience in total. Most of my experience is working on React. I'm proficient in JavaScript, Node.js, and MySQL databases. I'm very passionate about building reusable components and applications that are scalable, user-centric, and accessible. I also have experience working on React Native to build cross-platform mobile applications. I've been involved in implementing code review processes and coding standards to enhance code and processes. I've also implemented Continuous Integration and Continuous Deployment (CICD) in our pipeline to save time in our day-to-day activities.
We can manage the Node.js version in a continuous integration workflow. So, we have a platform through which we can manage the Node.js version in the CICD workflow, only that allows us to change the version of Node.js according to our need. We can just go into the configuration of that tool, whatever tool we are using for our CICD. For example, if we are using GitHub's actions, we can simply specify what Node.js version we want to use, and we can simply specify that there. Or if we are using a tool like, for example, Selenium, we can just specify the Node.js version that we need, and it will be picked up by our continuous integration pipeline.
Yes. So in a large-scale React application, we have several ways to manage our state. We can use third-party state management libraries like Redux or MobX. And if you don't want to use a third-party library, we can simply use React's Context API. We can create different contexts according to features, and we can manage state by Context API as well. We can leverage reducers to handle complex state in components. However, I would prefer using a library like Redux or MobX if we find the need in our large-scale React application. If I had to choose between Redux and MobX, I would go with MobX because it's lightweight compared to Redux, and it's also more performant.
To prevent memory leaks in a React JS application with complex state logic, we should have a keen eye on any subscription if we are having, and we should close those subscriptions when the component is getting unmounted. For example, if we are subscribing through a socket. So, that socket is consuming a lot of memory. We should always remember that we need to close that socket subscription inside the component's unmount life cycle method if we are using a class-based component. And if we are using a function-based component, then we can simply return a function from the useEffect hook, and that will act as an unmount component will unmount life cycle hook. It applies to everything, like a socket subscription, or if you are listening for an event on the DOM. Maybe we are listening for a scroll event, or some other event. So, all these events, we should detach from the DOM when the component is unmounting. That's how we can prevent memory leaks in a ReactJS application with very complex state logic.
To integrate a serverless API with the React application to ensure optimal performance, we can consider several ways to do that. However, for a very large-scale application where optimal performance is a priority, I think we should go with an API library like Xero, or we should use React Query to integrate that because libraries like React Query provide caching strategies, and they provide caching. They provide background fetching. They provide pagination. All these things we do not need to explicitly code ourselves, and they provide that kind of optimization implicitly toward the developer. So if you want to integrate a serverless API or a normal API as well, we should go with a library like React Query or maybe a library like SWR. They provide a lot of performance benefits, caching benefits, background fetching, and pagination, and many new things.
return a JSX. So maybe we can wrap it with some tag, or maybe we can wrap it, with the fragment, of React. Let's fix the bug. The issue is that the component is returning an object when the `loading` state is false, which is not allowed in React. We can fix this by wrapping the object in a JSX element, such as a React Fragment. Here's the corrected code: ```typescript import React, { useState, useEffect } from 'react'; interface User { // Add properties here } const UserList = () => { const [users, setUsers] = useState<User[]>([]); const [loading, setLoading] = useState(false); useEffect(() => { setLoading(true); fetch('https://api.example.com/users') // Replace with your API endpoint.then(response => response.json()).then(data => { setUsers(data); setLoading(false); }); }, []); if (loading) return null; // This is already correct return ( <React.Fragment> {users.map(user => ( <div key={user.id}> <h2>{user.name}</h2> <p>{user.email}</p> </div> ))} </React.Fragment> ); }; export default UserList; ``` Note that I also added a `key` prop to the `div` element inside the `map` function to ensure that React can keep track of the elements.
In what ways does utilizing TypeScript's strict typing benefit a Node.js backend API? Okay. In what ways does it tell you that its strict typing benefits a Node.js backend API? Yeah. So if we are using TypeScript on Node.js code, then it would give us the typing benefits, like it gives us when we are writing TypeScript code in a React.js application or a frontend application in Node.js when we are writing an API. You know, and then we are using TypeScript, then it will definitely give us auto suggestions, you know, that what this API will accept as a body if it is a post API or what parameters it needs. It will accept if it is a get API. So those static typing benefits it will give in case of Node.js backend API. We are using TypeScript for that. And TypeScript is very beneficial because it gives you static errors upfront when we are writing the code. So, it's a good way to prevent a lot of issues if we are writing code in TypeScript rather than normal JavaScript.
Yes, definitely, we can create a React component using Material UI that adheres to two SOLID principles. And I think we always follow SOLID principles when we are writing code in general. So, these SOLID principles stand for single responsibility, Liskov substitution principle, open close principle, and the others. And we should always follow the SOLID principle when we are writing code for a real-world application. Or in general, when we are writing code, if we follow these principles, then we will write a maintainable, readable, and extendable code. And it will prevent a lot of bugs as well if we follow these principles.
What factors influence the choice of state management solutions in a large React application? Yes, so this question is a very important question when we are choosing what state management solutions we need to use for our large React applications. So I think this depends totally on the application and the use case that we are trying to solve. And you know, the choice to choose a third-party library as our state management solution or if we are going to use the context API totally depends upon the type of application, the type of problem that we are trying to solve. Maybe we do not need to use a third-party library altogether in our use case, or maybe we need to use that library. So that depends on the use case of the problem and the nature of the application that we're trying to solve. I think that would mostly influence the choice of state management solution in large React applications. And I've seen that sometimes we overlooked this question, and we used a third-party library. But in reality, we did not need to use that third-party library. Instead, we could have used the context API or maybe we could have used a sync external store hook, or maybe we could have used a user reducer hook for solving this particular problem. But we introduced a third-party library, and now we are maintaining a lot of code for that library. And we need to maintain that code. We need to have a clear understanding of what we do not need, I think. So I think we should always carefully choose what problem we are trying to solve and what library or what functions the front-end framework we are using is going to provide.
Okay. Your team is planning a refactor of an aging front end code base to a modern React architecture. How do you evaluate and prioritize the components for refactoring considering performance, maintaining duty, and business impact? Okay. Your team is planning a refactor of an aging front end code base to a modern edge architecture. How do you evaluate and prioritize the components for refactoring? Considering performance, maintaining business impact. Okay. Yes. Yes. So I have done this in my past as well. So I was refactoring an old front end application to a modern architecture. So there, what we have done is we have refactored it, you know, component by component. So we have used a component-based architecture. So first of all, what we have done is we have created all the common components, all the reusable components into React. So, like, all the atomic components, first of all, we created all the atomic components as reusable components as reusable React components, and we created our design library system from that. So that in the future, as well, or when we will start migrating, we don't create these little or small components again and again. So we'll create those atomic components and we'll create a design library system from that. And everybody in the team who is part of that migration can use those reusable components. After creating those reusable components, we'll go with the route by route, maybe. If your application has a lot of routes, we can go route by route. Or maybe what we can do is we can see what component or what page in our application is very slow, you know, and we can pick those first. So, to choose what pages or what components need to be migrated first, we can use a strategy called the Pareto principle, which tells us what area we should work on or where we will put less effort and we'll get more impact. So we can use that principle and we can find out the areas where we should work first and where we should optimize or refactor the component. So that principle can tell us the areas in our application. And after finding those areas in which we need to work first, we can go and refactor that component or page to our modern React architecture in a component-based architecture. So now we have already in place our design library system. So we don't need to create everything from scratch. Also, we can use libraries like Material UI or Shared UI components or Tailwind CSS to further increase our time to refactor that code base to React architecture.
To set up a development environment to work with both JavaScript and Node.js efficiently, we can use a lot of libraries that are available. If you want to create a full-stack application, we can use the Next.js framework because it provides both the edge and Node.js environment. If you don't want to use a full-stack framework like Next.js, what we can do is have two separate projects, one for React and one for Node.js. We can set up a React project with Vite, a build tool, and set up a Node.js project separately. Alternatively, we can use pnpm to handle and then create a monorepo architecture where we have our React and Node.js projects handle as a monorepo. So, there are plenty of ways by which we can set up and manage our Node.js development environment efficiently.