July 2020 Summaries
62 posts from LogRocket
Filter
Month:
Year:
Post Summaries
Back to Blog
CSS has developed significantly over the years to meet the demands of modern UI design, emphasizing the importance of theming, which allows for the styling of websites to vary according to context while maintaining visual coherence. This process involves using CSS variables, also known as custom properties, to define and reuse values, thereby enhancing flexibility and efficiency in web design. The article illustrates how developers can create theme-aware applications by implementing CSS variables and JavaScript, allowing for real-time theme switching, such as between dark and light modes. It highlights the benefits of using local storage to remember user preferences, ensuring a consistent experience upon subsequent visits. Additionally, the text discusses the advantages of CSS variable inheritance and local scoping, which facilitate the creation of adaptable and visually appealing websites. Moreover, LogRocket is introduced as a tool for monitoring and improving digital experiences, offering features like session replay and automated user struggle identification.
Jul 31, 2020
1,215 words in the original blog post.
Chakra UI is a modular component library for React applications that leverages Emotion and Styled System to provide utility props for styling components, facilitating isolated UI component development and speeding up the app-building process. The guide demonstrates creating a login form using Chakra UI, highlighting features such as theme toggling using ColorModeProvider and useColorMode hook, and integrating a ThemeProvider to manage default or custom themes. It introduces the creation of a ThemeToggler component to switch between light and dark modes, and a login form leveraging Flex and Box components to structure layout, while employing FormControl and Input components for user input. The tutorial also covers handling user login with a mock API call, managing loading states with CircularProgress, and displaying error messages using an Alert component. Additionally, it explains implementing show/hide password functionality with an InputGroup, and managing user authentication state using React's useState and useEffect hooks. The overall approach showcases the flexibility and customizability of Chakra UI, emphasizing its ability to support a responsive design system with style utilities and theme management.
Jul 31, 2020
3,028 words in the original blog post.
Rust, a fast and reliable low-level language, is gaining prominence for performance-focused network and web applications, particularly due to its high-level ergonomics and asynchronous I/O support. With the increasing importance of data privacy, authentication has become a critical component of web applications, and Rust offers a variety of high-quality, production-ready libraries, or "crates," to address these needs. The guide evaluates nine such libraries based on popularity, completeness, maintenance, and support for stable Rust, including crates like "cookie" for session management and "jsonwebtoken" for JWT token handling. It also highlights the "oauth2" crate for OAuth 2 protocol implementation and additional libraries for one-time password generation and cryptography. Some libraries, such as "boringauth" and "oxide-auth," are still in development but show potential for future use. The guide underscores the importance of authentication in modern web applications and the robust solutions Rust provides to support secure and efficient authentication processes.
Jul 31, 2020
1,630 words in the original blog post.
Chrome 85 introduces several significant updates to DevTools, enhancing its utility for web developers. Key improvements include the ability to edit styles created with the CSS Object Model API and support for new JavaScript features, such as the optional chaining operator, with improved auto-completion. The Sources panel now offers enhanced syntax highlighting for private fields and methods, and provides better support for WebAssembly files by displaying bytecode offsets. Additionally, the Performance panel now consistently displays caching information and shows event times relative to user navigation. These updates, along with the adoption of Lighthouse 6.0, broaden the capabilities of DevTools, making it a more robust tool for debugging and optimizing web applications.
Jul 30, 2020
1,159 words in the original blog post.
This guide explores the creation of a CRUD web API using Rust and MongoDB, highlighting the transition from a relational database, like Postgres, to a document database. It utilizes the official MongoDB Rust library to support both synchronous and asynchronous operations, with the example focusing on building a CRUD API for managing books. The setup requires a recent Rust installation, a local MongoDB instance, and an HTTP request tool. The guide details the step-by-step process of creating a small application with modules for database access, error handling, and CRUD operations, and demonstrates how to initialize a MongoDB client, define routes, and handle HTTP requests. The example illustrates how to perform basic CRUD operations such as creating, fetching, editing, and deleting books, emphasizing the intuitive and well-documented nature of the MongoDB driver for Rust. Additionally, it mentions using tools like LogRocket for monitoring and debugging Rust applications, providing insight into user experiences and performance issues.
Jul 30, 2020
1,841 words in the original blog post.
This tutorial explores the process of testing a warp web application in Rust, focusing on integration and end-to-end tests. It walks through the creation of a small to-do app that integrates a database and external HTTP service, emphasizing the use of mocks to simulate external dependencies. While mocking can simplify testing by replacing real components with fake implementations, this approach may miss edge cases if the mock is flawed. The tutorial discusses the trade-offs of using real databases and web services in automated testing, considering factors like infrastructure, reproducibility, and speed. To demonstrate these concepts, the tutorial begins with basic mock solutions and progressively moves towards using real databases and HTTP services, ensuring the solution is fully automated and reproducible. It also covers the setup of testing environments, the use of the wiremock library for simulating external web services, and the integration of real HTTP requests to wiremock, culminating in full end-to-end tests that involve running the actual web service. The tutorial emphasizes the importance of understanding various testing techniques and their trade-offs to effectively test distributed web services.
Jul 29, 2020
3,845 words in the original blog post.
The author reflects on their experience with Rust, a programming language known for its strong type system and features that enhance code reliability and minimize bugs. Initially frustrated by the Rust compiler's strictness, the author grew to appreciate its ability to catch errors early in the development process. The guide delves into specific Rust features such as strong typing, monads, tagged unions, and exhaustiveness checks, illustrating how these can reduce the need for integration tests by ensuring code correctness at compile time. By leveraging newtypes and early data validation, developers can avoid dealing with invalid data, while separating decision-making from execution helps streamline unit testing. The author argues that the combination of these strategies significantly lowers the risk of errors in integration code, suggesting a focus on end-to-end tests and unit tests as a more efficient approach. Overall, these practices contribute to a maintainable and robust codebase, capturing the essence of the Rust programming philosophy, which emphasizes writing reliable and safe software.
Jul 29, 2020
2,366 words in the original blog post.
Performance optimization in Vue.js web applications can significantly enhance both user and developer experiences by implementing strategies such as lazy loading route components, minimizing the use of external libraries, compressing and optimizing images, lazy loading images, and reusing functionalities across the app. Lazy loading defers the initialization of components until they are needed, reducing the initial load time, while minimizing external libraries prevents unnecessary code bloat, ensuring the app remains lightweight. Image optimization and lazy loading are crucial for managing bundle sizes, especially in media-heavy applications, and can be achieved using tools like Adobe Photoshop or CDNs for compression. Reusing functionalities, such as notifications, through mixins can streamline code, making it more maintainable and reducing redundancy. Tools like LogRocket offer solutions for monitoring and debugging Vue.js applications by replaying user sessions and capturing detailed logs, thereby facilitating a deeper understanding of user interactions and issues.
Jul 29, 2020
1,729 words in the original blog post.
Sortable.js is a popular library for handling drag-and-drop, list sorting, and reordering in JavaScript applications, with widespread support across frameworks like React, AngularJS, and Vue, as well as compatibility with most modern browsers. The tutorial focuses on implementing Sortable.js in a React project using the react-sortablejs wrapping component, allowing users to create, edit, and delete list items while toggling between list and grid views. The process involves setting up a React environment, installing necessary dependencies like Axios and Bootstrap, and managing state and CRUD operations through components such as ActionModal and ListItem. The tutorial highlights the importance of using object IDs for list items to ensure sorting functionality and demonstrates how to customize the user interface with styled-components and CSS. It encourages users to explore official documentation for further customization and understanding of Sortable.js and react-sortablejs.
Jul 28, 2020
3,141 words in the original blog post.
Internet Explorer, once a dominant browser due to its integration with Windows, has become largely obsolete due to its inability to keep up with modern web standards and features. Despite still being installed by default on some Windows 10 systems, it is widely disliked and unsupported by major websites such as YouTube, GitHub, and Apple. This sentiment is shared by developers who struggle with IE's lack of support for modern JavaScript, HTML, and CSS features, leading to performance issues and security vulnerabilities. Microsoft officially replaced IE with Edge in 2015, which is built on a more modern and efficient Chromium engine. The continued use of IE is seen as a hindrance to progress, and many developers and companies have moved on to more advanced browsers that offer better performance, security, and support for the latest web technologies.
Jul 28, 2020
1,470 words in the original blog post.
The text explores how JavaScript can be used in conjunction with CSS to enhance transitions and animations in Vue applications, focusing on the functionality provided by transition event hooks. These hooks allow developers to execute JavaScript code at various stages of an element's attachment or removal from the DOM, offering more control over user interface interactions and improving user experience. The article provides examples of how to use these hooks, like @before-enter and @after-leave, in combination with CSS animations defined through keyframes, and explains the flexibility of using JavaScript either alongside or independently of CSS. Additionally, it highlights tools like LogRocket for debugging and monitoring Vue applications, which help developers understand user interactions and improve digital experiences by replaying user sessions and capturing detailed user data.
Jul 27, 2020
1,120 words in the original blog post.
CSS variables, also known as custom properties, function similarly to variables in programming languages, allowing for the declaration and consumption of values within CSS rulesets. These variables, defined using a double hyphen syntax (e.g., --varName), enable the application of consistent styling across different elements by using the `var()` function to retrieve and apply their values. The scope of CSS variables is determined by where they are declared in the CSS hierarchy, with global variables declared in the `:root` selector being accessible throughout the entire document. Local variables are scoped to their parent element and its children, ensuring modularity and facilitating theming without requiring multiple stylesheets. CSS variables are supported by major browsers, though older versions may lack compatibility, and fallback values can be implemented to ensure consistent styling across different environments. The hoisting feature of CSS variables allows them to be utilized before they are declared, enhancing their flexibility and power in creating clean and efficient design systems.
Jul 27, 2020
1,789 words in the original blog post.
The article provides a comprehensive guide on self-hosting a Sapper application using DigitalOcean, detailing the process from setting up a virtual server to deploying the app. It outlines the steps necessary to configure a DigitalOcean droplet, install and set up Node.js and an Nginx reverse proxy, and manage the application with PM2 for reliability. The author explains how to use Git hooks for streamlined deployment and discusses setting up Nginx server blocks with caching for improved performance. Additionally, the guide covers the process of adding a domain name using CloudFlare for SSL, ensuring secure access to the application. The author shares personal insights and practical tips for troubleshooting common issues, aiming to help developers effectively manage and deploy their Sapper projects on their own servers.
Jul 27, 2020
3,178 words in the original blog post.
Developers are increasingly adopting a single codebase approach for multiple operating systems, facilitated by frameworks like Electron and Vue. Electron, a JavaScript framework, enables the creation of desktop applications using JavaScript and HTML, while Vue is a library for building interactive web applications. The text provides a detailed tutorial on creating a markdown preview app using Vue and Electron, including setting up the Vue environment, integrating Electron with Vue CLI, and enhancing the user interface with Bootstrap. A significant part of the tutorial covers implementing a markdown previewer, with both a complex method involving custom Vue directives and a simpler method using the vue-directive-markdown package. The process involves configuring various components, handling dependencies, and setting up a user interface that previews markdown content dynamically. The tutorial highlights the benefits of using Vue and Electron for creating applications that work seamlessly across Windows, Mac, and Linux, emphasizing the growing need for adaptable coding practices in modern software development.
Jul 24, 2020
2,173 words in the original blog post.
Web developers use icons to enhance the visual appeal, navigability, and engagement of websites and apps, as they are recognized patterns that can often replace text entirely. This tutorial explores several popular and free icon libraries suitable for JavaScript projects, including Feather, Font Awesome, Bootstrap Icons, Ionicons, css.gg, Tabler Icons, and React Icons. These libraries offer a range of icons that are easy to set up, compatible with various frameworks, and can be imported individually to avoid bloating applications with unused icons. Each library provides unique features, such as Feather's clean design, Font Awesome's extensive collection, Bootstrap Icons' compatibility with Bootstrap components, Ionicons' versatility across different platforms, css.gg's pure CSS construction, Tabler's customizable stroke width, and React Icons' integration with multiple icon sources. Developers are encouraged to select libraries based on essential icons for their applications, as most icons are available for free and significantly improve user interaction and comfort.
Jul 24, 2020
1,315 words in the original blog post.
The tutorial details the process of building a mobile and web application using the Ionic framework and Amazon Web Services (AWS) to create an event keeper app. It involves setting up a backend using Node.js, Express, and MongoDB, and configuring AWS S3 for image storage. The frontend is developed with Ionic, leveraging Angular for application structure, with Capacitor for native functionality. The tutorial guides users through creating and configuring the backend server, setting up a MongoDB database, and integrating AWS for image handling. It also covers building a user interface with Ionic's components, creating services for handling HTTP requests, and implementing functionality to add and display events. Additional features include implementing loading spinners and toast notifications to improve user experience. The guide emphasizes the integration of frontend and backend systems, providing a comprehensive approach to developing a full-stack application.
Jul 23, 2020
3,177 words in the original blog post.
Redux is a highly popular state management solution in modern UI development, renowned for its ability to maintain scalable, predictable, and performant applications, especially in large-scale projects. While it has received both praise and criticism, its effectiveness largely depends on the specific needs and scale of the application. Redux centralizes app state, enabling features like time traveling and state persistence, and is most effective when used with practices such as immutability and feature-based file structuring, known as the Ducks pattern. The introduction of Redux Toolkit addresses many of the criticisms regarding boilerplate code and complexity, streamlining development while maintaining code quality. Redux DevTools further enhance the development experience by providing powerful debugging capabilities. Despite debates on its necessity, Redux remains a top choice for state management, offering significant benefits when implemented thoughtfully, though developers must carefully decide which values to store globally versus locally to optimize performance and scalability.
Jul 23, 2020
1,723 words in the original blog post.
Frontend web development has become increasingly complex, posing challenges in creating scalable and reliable UI systems that function across diverse devices and browsers. As UI systems expand, maintenance becomes difficult, and without consistent regression testing, bugs affecting usability, accessibility, and maintainability may go unnoticed until after code deployment. Chromatic, developed by Storybook core maintainers, addresses these issues by enhancing UI development and testing workflows. Chromatic offers a cloud service that integrates with Storybook, allowing teams to publish, update, and review UI components collectively. It provides visual regression testing by generating screenshots of UI components, enabling teams to detect visual bugs early and facilitate feedback. Additionally, it supports Git and CI integration, improving version control and deployment workflows. By offering both free and paid plans, Chromatic allows developers to test and refine their projects efficiently, fostering early bug detection and streamlined UI testing, while also serving as a hub for team feedback and collaboration.
Jul 23, 2020
3,544 words in the original blog post.
Moon.js is a lightweight, functional, and declarative JavaScript library designed to simplify the development of user interfaces by relying on pure functions and drivers to manage views, state, HTTP requests, and routing. The tutorial demonstrates building a blogging application using Moon.js, leveraging its HTTP driver to fetch data from the JSONPlaceholder API and display it dynamically in the browser. Moon.js supports modular development with drivers for time, storage, HTTP, and routing, enabling developers to focus on application logic while managing side effects effectively. The setup process involves installing Moon.js globally, bootstrapping a project, and integrating Tailwind CSS for styling, culminating in a functional application capable of fetching and rendering paginated data. The tutorial also highlights the importance of frontend monitoring using tools like LogRocket to ensure application performance and error tracking, emphasizing the need for visibility as frontend complexity increases with additional libraries and dependencies.
Jul 22, 2020
1,582 words in the original blog post.
Emotion is a high-performance, flexible CSS-in-JS library that offers a range of features to enhance the styling of modern applications. It is framework-agnostic, allowing it to be seamlessly integrated across different projects, including both web and mobile platforms, which is particularly useful for creating cohesive design systems. Emotion stands out with its CSS prop feature, enabling direct styling of components without the need for styled components, and supports theming, media queries, and server-side rendering by default. The library's small bundle size and fast runtime make it an attractive choice over other libraries like styled-components. While Emotion is praised for its speed and consistency, the decision to use it depends on specific project needs and familiarity with CSS-in-JS concepts.
Jul 22, 2020
1,935 words in the original blog post.
React-query v2 has introduced several new features and improvements, including changes to the API and overall performance enhancements. A notable update is the addition of a new query state called 'idle,' allowing more precise messaging based on query status. The queryCache now re-fetches only active queries, enhancing efficiency, while the global configuration object is now sectioned into shared, queries, and mutations sub-objects. The update also simplifies query status management by allowing the assignment of queries to a single variable using new booleans like isLoading, isSuccess, and isError. The process of migrating from version 1 to version 2 involves updating the global configuration and query handling in the app components, ensuring the application maintains its functionality with the new version. These enhancements are aimed at improving developer experience and application performance.
Jul 22, 2020
1,090 words in the original blog post.
Rust-analyzer is an integrated development environment (IDE) server designed for the Rust programming language, offering features such as semantic analysis, smart code completion, syntax highlighting, and code execution. It is built to enhance the programming experience by analyzing only the active code in an IDE, making it efficient and responsive. Unlike the Rust Language Server (RLS), rust-analyzer maintains a persistent compilation process and integrates seamlessly with various IDEs like VS Code, Vim, and Emacs through plugins. Key features include symbol search, datatype detection, error popups, and auto-creation of missing modules, all designed to streamline coding and debugging processes. The guide also highlights how rust-analyzer supports enhanced code navigation and structure understanding, making it a preferred choice over RLS for many developers. The tutorial concludes by encouraging users to leverage rust-analyzer's capabilities for improved code quality and productivity, suggesting tools like LogRocket for further debugging and performance monitoring of Rust applications.
Jul 21, 2020
1,159 words in the original blog post.
When starting a new React project, developers can choose from various toolchains like create-react-app, Next, or Gatsby, each offering different benefits and complexities. However, for smaller projects, it's feasible to build a custom lightweight toolchain using essential packages such as Parcel for bundling, ESLint and Prettier for linting and formatting, Babel for transpiling, and fetch for data fetching. This approach allows for a deeper understanding of the build process and flexibility in adding more sophisticated tools as needed. By setting up a bespoke toolchain, developers gain insight into the underlying mechanics of React applications and can tailor their development environment to their specific needs without relying on preconfigured solutions. The custom toolchain setup includes basic configurations for styling with CSS, SCSS, or styled-components, and demonstrates how to incorporate data fetching and user component rendering, encouraging developers to explore additional tools like routing and form management as they grow more comfortable with React's ecosystem.
Jul 21, 2020
2,010 words in the original blog post.
PHP developers may find coding for Gutenberg, the new WordPress editor, challenging due to its reliance on React and JavaScript. The author shares personal experiences and tips for adapting to this new paradigm, highlighting the importance of studying the Gutenberg team's code for better understanding. Intensive use of the WordPress editor can help discover reusable functionalities, and developers are encouraged to explore Gutenberg's documentation, despite its complexity. The guide advises using the @wordpress/create-block package for scaffolding, distinguishing between blocks and components, and reusing Gutenberg components when appropriate. It also suggests exploring external component libraries and styling with Sass, while providing insights on customizing webpack. Keeping blocks updated with Gutenberg's frequent releases is emphasized, cautioning against potential breaking changes. The text concludes by weighing the complexity of Gutenberg against legacy WordPress solutions, advising developers to assess their actual needs before committing to using Gutenberg.
Jul 21, 2020
3,101 words in the original blog post.
The text discusses the complexity of state management in frontend applications, particularly focusing on Vuex, a state management library for Vue.js applications. Vuex, which is inspired by the Flux architecture, differs from Redux by allowing specific mutation rules that are more intuitive and less verbose. The article highlights the new features in Vuex version 4.0.0-beta, which include support for Vue 3's Composition API and enhanced TypeScript integration, allowing developers to create fully typed stores. It emphasizes that the latest version introduces breaking changes, such as removing global typings for this.$store within Vue components, requiring developers to provide their own augment declarations. The text also outlines the use of mutations, actions, and getters within Vuex, showing how they can be statically typed, and discusses the importance of these features for static analysis and self-documenting code. Despite being in beta, Vuex 4 promises exciting changes, such as the removal of mapXXX and the integration of the createLogger function into the core package. The document concludes by recommending tools like LogRocket for debugging Vue applications, which can replay user sessions and monitor Vue mutations and actions.
Jul 20, 2020
1,653 words in the original blog post.
Data is increasingly essential in decision-making, but raw data alone lacks value without insight, which is where data science and visualization tools play a crucial role. The tutorial outlines how to build a Nuxt.js Dashboard Application utilizing Cube.js, an open-source analytics framework, to transform and visualize data efficiently. Cube.js simplifies the development of scalable analytics features by providing a server infrastructure and frontend SDKs compatible with various frameworks. The guide details setting up a PostgreSQL database, using Cube.js to define data schemas, and integrating with Highcharts for creating visual representations like pie and bar charts. This process involves initializing a Nuxt.js project, setting up a Cube.js client, and creating interactive components to display data insights, emphasizing the framework's capability to handle large-scale data efficiently.
Jul 20, 2020
2,848 words in the original blog post.
The tutorial provides a comprehensive guide on building a YouTube video search application using Angular and RxJS. It involves creating a single-page app that interacts with the YouTube search API to retrieve videos based on a user query, utilizing tools like TypeScript, Angular, and RxJS for efficient asynchronous programming and modular design. The app comprises three main components—search-input, search-list, and search-container—with the search service handling API interactions. The tutorial also emphasizes setting up a development environment, including obtaining an API token from Google, and highlights the use of RxJS operators to manage user input and API calls efficiently. In addition to covering the technical setup and code structure, it suggests using Semantic-UI for styling and discusses the integration of the app into the root component of an Angular application. Finally, the tutorial concludes with instructions on running the application and understanding the core concepts of Angular and RxJS, while highlighting the potential for further enhancement and complex feature integration using the YouTube API.
Jul 20, 2020
3,662 words in the original blog post.
In situations where API requests initiate CPU-intensive operations that could block other requests, task queues are employed to defer processing, thereby enhancing application scalability and performance. The NestJS documentation highlights that queues can smooth processing peaks, break up monolithic tasks, and facilitate reliable communication across services. Bull, a Node library built on Redis, provides a robust queue system that simplifies Redis's functionality, handling complex use cases with an API that abstracts low-level details. To use Bull, Redis must be installed, after which queues can be instantiated, and tasks can be added as serializable JavaScript objects. Each queue can function as a job producer, consumer, or event listener, supporting various job options like delay, priority, and concurrency to manage task execution. Event listeners can monitor job progress and status changes, both locally and globally. A practical example is an e-commerce company using a task queue to manage email notifications for new products, ensuring these emails are sent without disrupting normal operations. Bull's functionality is complemented by tools like LogRocket, which monitors network requests and user sessions to diagnose issues in web applications.
Jul 17, 2020
1,880 words in the original blog post.
Bref is a composer package that facilitates running serverless PHP applications on AWS Lambda by providing necessary layers for PHP support, which Lambda doesn't natively offer. The tutorial guides users through building and deploying a serverless PHP application to process incoming emails using SendGrid Inbound Parse, including setting up a local development environment with Composer, npm, and the serverless CLI tools. It details creating a project with Bref, configuring SendGrid to handle incoming emails, and using Slack API for notifications. The tutorial also covers setting up AWS credentials and deploying the application to Lambda, with instructions on managing IAM roles and permissions. The application processes JSON payloads from emails, extracts sender and recipient information, and sends notifications to Slack, showcasing the integration of serverless functions with cloud services. Users are encouraged to explore further resources like Bref and serverless framework documentation for advanced features and security enhancements through Lambda Authorizers.
Jul 16, 2020
1,444 words in the original blog post.
In 2020, frontend developers continue to grapple with the challenges of excessive tooling, particularly with Babel, a compiler that facilitates compatibility of modern JavaScript with older browsers. While Babel is commonly used for transpiling new syntax into older formats and polyfilling missing features, the text suggests several alternatives to optimize development processes. One approach involves focusing on supporting only modern browsers to avoid the complexities of transpiling, though this can be constrained by the need to support legacy software in large corporations. Another method includes using the eslint-plugin-compat in Visual Studio Code to flag incompatible code without transpiling, giving developers more control over their production code. The text also highlights SWC, a faster Rust-based alternative to Babel with fewer dependencies, as a viable option for automatic translation. Additionally, Google Closure Compiler and TypeScript are mentioned as alternatives but require more complex setups. The emphasis is on assessing customer browser usage through analytics to determine the necessity of old browser support, thereby potentially simplifying development workflows.
Jul 16, 2020
2,498 words in the original blog post.
Next.js versions 9.3 and 9.4 introduced major enhancements aimed at improving both performance and developer experience, making it a preferred framework for server-side rendering and static site generation. These updates include new data-fetching methods like getStaticProps and getServerSideProps for optimized static site generation and server-side rendering, alongside getStaticPaths for dynamic routes. The introduction of SASS support and component-level styles allows for more flexible styling options, while the enhanced 404 page and fast refresh feature improve user and developer experience by optimizing error handling and hot reloading. Additionally, Next.js now offers improved environment variable handling, native fetch API support in Node.js, and simplified import paths with absolute imports. These updates collectively enhance the framework’s functionality, making it an attractive choice for developers looking to upgrade from previous versions.
Jul 16, 2020
1,309 words in the original blog post.
Gutenberg, the React-based WordPress editor, is available as a rapidly evolving plugin and as a core integration in WordPress, featuring block-based components for content creation and future site building. These blocks facilitate database content saving and user interaction, and plugins often bundle multiple blocks. The latest Gutenberg release includes a block directory for easy single-block plugin installation during editing. Developers can scaffold single-block plugins using tools like @wordpress/create-block, which generates necessary files and supports the block directory by providing a predefined configuration customizable with webpack, Babel, and ESLint. For multi-block plugins, developers create separate block folders and adapt the main plugin file to include all blocks. Additionally, wp-env simplifies the setup of a local WordPress environment using Docker, facilitating plugin development with customizable parameters in the .wp-env.json file. This new setup, along with emerging tools, reduces the complexity of Gutenberg projects, previously requiring extensive knowledge of React, JavaScript, and other modern technologies, and enables faster development cycles with tools like Hot Module Replacement.
Jul 15, 2020
1,927 words in the original blog post.
The article introduces gdbgui, a browser-based debugging tool built on top of gdb, which enhances the debugging experience for compiled languages like C, C++, Go, and Rust by providing a visual interface. Unlike gdb, gdbgui allows developers to add breakpoints, view stack traces, and modify context and parameter values directly in a web browser, facilitating easier navigation and debugging. It utilizes WebSockets for communication between the browser and backend, creating a seamless connection for real-time debugging. Installation of gdbgui is recommended through pipx for an isolated environment to avoid version conflicts, and the tool offers features such as memory address hyperlinks, variable tracking over time, and a customizable interface with options to adjust themes and command visibility. The guide emphasizes gdbgui’s utility for developers who lack access to a full IDE debugger, providing a quick way to set up a visual debugging interface across various programming languages, although some configuration adjustments might be needed for languages other than C.
Jul 15, 2020
1,635 words in the original blog post.
Testing is a critical phase in application development, ensuring reliability and performance, and this tutorial focuses on testing Vue components using the Vue Testing Library. This library, part of the larger Testing Library family, emphasizes testing applications as users would interact with them, building on Vue Test Utils and DOM Testing Library. The tutorial provides a step-by-step guide on setting up a testing environment with Jest and Babel for Vue projects, and demonstrates testing procedures for various Vue components, including simple counters, input forms, and more complex components that require external data. It highlights the use of methods such as getByText and fireEvent to simulate user interactions, and emphasizes the importance of testing in reflecting real user scenarios to foster better testing practices. Additionally, the tutorial discusses debugging strategies to address test failures and enhance testing accuracy, with a nod toward tools like LogRocket for monitoring user interactions in Vue applications.
Jul 15, 2020
1,774 words in the original blog post.
CSS-in-JS is a design pattern that addresses challenges in scaling CSS by using JavaScript modules for smaller file separation and unique local naming for scoping. However, this approach can lead to increased loading times as modern UI libraries like React rely on JavaScript bundles, which can grow significantly. Compiled, a library developed by Atlassian Labs, offers a solution by analyzing code at build time and transforming it into components that do not generate CSS at runtime, thus resolving performance issues associated with dynamic CSS generation. It mimics styling patterns from libraries like styled-components and Emotion and allows seamless integration without additional configuration. To use Compiled with React, developers need to install specific packages and plugins for Babel or TypeScript compilers, ensuring efficient styling without runtime costs.
Jul 14, 2020
1,047 words in the original blog post.
The text offers a detailed exploration of Kubernetes node operators, focusing on their definition, purpose, and the advantages they offer in automating application deployment and management across various cloud platforms. Node operators enhance Kubernetes by providing application-specific automation, utilizing custom resources and controllers to maintain and extend cluster functionality without altering the core Kubernetes code. The text outlines best practices for building these operators using tools like the Operator SDK, emphasizing the importance of testing, leveraging built-in resources, and maintaining a declarative approach to configuration. It provides a step-by-step guide to create a node operator, highlighting the role of custom resources and controllers in achieving a seamless automation experience. The document underscores the significance of operators in simplifying complex tasks, such as managing stateful applications and enforcing security policies, thereby facilitating efficient and error-free administration of Kubernetes environments.
Jul 14, 2020
2,458 words in the original blog post.
The article explores efficient techniques for creating engaging visual effects on the web using SVG (Scalable Vector Graphics) while minimizing data transmission. It highlights the importance of SVG's z-indexing rules, demonstrating how graphical elements like circles and rectangles can be layered to create visual interest. The piece explains how to manipulate the appearance and position of these elements using attributes such as radius and fill, and introduces animation techniques like animateTransform to rotate and alter properties over time. By using examples of layered and animated shapes, the article illustrates how to effectively create complex visual effects with simple code, emphasizing that properly timed animations can significantly enhance user engagement. Additionally, it mentions tools like LogRocket for monitoring and optimizing digital experiences, underscoring the importance of performance in web development.
Jul 13, 2020
1,570 words in the original blog post.
Angular 10, released four months after version 9, introduces a range of new features, breaking changes, and deprecated APIs designed to enhance the development experience. Notable updates include warnings for CommonJS imports to optimize code bundles, stricter settings enabled via a --strict flag for better maintainability and optimization, and updated browser support that excludes older browsers like IE and UC browsers. Key breaking changes involve updates to TypeScript version 3.9 and modifications in input field behavior, form validators, and error logging for templates with unknown properties. The new version also addresses navigation cancellation behavior for resolvers with empty observables, improving the overall functionality. Developers looking to upgrade can use the command ng update @angular/cli @angular/core, and tools like LogRocket are available to aid in debugging and monitoring Angular apps by capturing user sessions and providing detailed logs of user interactions and application state.
Jul 13, 2020
841 words in the original blog post.
The article introduces two new font-relative length units in CSS, lh and rlh, which are designed to set element heights based on the line height of the current or root element, respectively. These units aim to offer more flexible styling options, particularly in vertically aligning inline-block elements. However, they are still in experimental stages with limited browser support and potential usage concerns, such as the inability to precisely control line numbers and the dependency on font and text size, which can vary across different browsers. The article advises caution in using these units in production environments and suggests keeping track of ongoing developments and discussions to better understand their future implementation. Additionally, LogRocket is mentioned as a tool for monitoring client-side performance in complex web frontends, offering features like session replay and automated user experience analysis to enhance digital experiences.
Jul 13, 2020
1,316 words in the original blog post.
Accessing deeply nested properties in JavaScript can often lead to errors if any part of the property chain is null or undefined, traditionally requiring developers to implement cumbersome checks. The optional chaining operator, introduced as part of the ES2020 proposal and supported by modern browsers, simplifies this process by allowing properties to be accessed safely using the `?.` syntax, which returns undefined instead of throwing an error if a property doesn't exist. This operator can be used for method calls and dynamic property access, enhancing code readability and reliability by avoiding the need for verbose conditional checks. Additionally, it can be combined with the nullish coalescing operator (??) to provide default values when properties are not found. Despite its benefits, the optional chaining operator cannot be used on the left-hand side of an assignment and should be applied judiciously to avoid unnecessary short-circuiting of expressions.
Jul 10, 2020
2,026 words in the original blog post.
Moveable is an npm package created by Younkue Choi that enables various dynamic interactions such as dragging, resizing, scaling, rotating, and warping for components in web applications. This tutorial guides users through setting up Moveable in a vanilla JavaScript environment, providing step-by-step instructions to implement its features. Users are shown how to make components draggable by initializing a Moveable instance and setting options like `draggable: true`, followed by handling events with the `on` method to apply transformations. The tutorial also covers implementing resizable, scalable, and rotatable features, explaining the differences between resizing and scaling, and the importance of keeping aspect ratios. Additionally, the warpable feature is demonstrated, allowing for distortion of elements. Moveable supports integration with major frameworks like React, Angular, Preact, Vue, and Svelte, and offers a Storybook page for users to experiment with features. The tutorial emphasizes the flexibility of Moveable in enhancing user interactions in web development.
Jul 10, 2020
1,858 words in the original blog post.
In a detailed exploration of dependency injection (DI) for TypeScript, the author shares their journey of developing a custom DI library called Fusion. Frustrated by the complexity of existing DI frameworks, they created a streamlined solution in fewer than 300 lines of code that supports both React and generic TypeScript applications. Fusion leverages TypeScript decorators and JavaScript Proxies to automate the injection of dependencies, focusing on simplicity and flexibility without the need for a traditional container. The library allows for lazy initialization of singletons, enhancing code maintainability and testability while promoting loose coupling between components. Fusion is open-sourced, offering developers the opportunity to explore, customize, and potentially improve upon this lightweight yet effective DI system.
Jul 09, 2020
4,149 words in the original blog post.
Managing state in React applications can become complicated as the complexity of the application increases, prompting the use of state machines as a more organized alternative. State machines, such as XState and Robot, provide a structured approach to defining an application's states, transitions, and side effects, ensuring the app does not enter an impossible state. XState, created by David Khourshid, and Robot, developed by Mathew Philips, both facilitate the creation and execution of finite state machines in user interfaces, although they differ in their implementation; XState uses option objects while Robot employs functional programming techniques. The guide illustrates how these libraries can simplify state management by demonstrating a React component that fetches data from an API, emphasizing the control and scalability benefits state machines offer over traditional state management methods in React.
Jul 09, 2020
2,037 words in the original blog post.
Snowpack is a modern, lightweight build tool for web applications that leverages native browser ES modules to eliminate the need for bundling in development, thereby accelerating the build process as codebases grow. The release of Snowpack 2.0 introduced significant enhancements, including O(1) file builds that allow only changed files to be rebuilt, improving development speed and efficiency. This update also features improved automatic Hot Module Replacement (HMR) support, enhanced development environment performance, customizable build scripts, zero-config prototyping, and new Create Snowpack App (CSA) templates for various JavaScript frameworks and static site generators like React, Vue, and Svelte. These advancements make Snowpack a powerful tool for modern web development, enabling developers to streamline workflows and maintain high performance without extensive configuration.
Jul 09, 2020
1,210 words in the original blog post.
The article provides an in-depth exploration of CSS at-rules, categorizing them into general and nesting rules, and discusses their practical applications and browser support. It explains how general rules like @charset, @import, and @namespace should be placed at the top of the stylesheet to define character encoding, import external CSS, and prevent style collisions, respectively. Nesting rules such as @document, @font-face, @keyframes, and @media are highlighted for their roles in page-specific styling, custom font usage, defining CSS animations, and creating responsive designs. The article also touches on experimental features like @property, which aims to address certain CSS issues but lacks widespread browser support. It emphasizes the importance of understanding these rules and checking their browser compatibility to ensure effective implementation in projects.
Jul 08, 2020
2,232 words in the original blog post.
OrbitDB is a decentralized, peer-to-peer (P2P) database system designed for the decentralized web, utilizing libp2p and the InterPlanetary File System (IPFS) to facilitate data storage and synchronization across a network of peers. Unlike traditional databases, OrbitDB operates without a central repository, allowing each peer to host its own database instance while maintaining data consistency through conflict-free replicated data types (CRDTs). This structure supports decentralized applications (DApps) by enabling direct peer communication, automatic data replication, and customizable access controls, enhancing security and scalability. OrbitDB's architecture allows for a variety of database types, including key-value stores, document databases, and immutable logs, each supporting CRUD operations via a clean API interface. Despite its potential, OrbitDB and IPFS remain in alpha stages, indicating ongoing development and limited support for certain operating systems like Windows. This innovative framework is particularly suited for blockchain and other decentralized applications, offering both online and offline functionality with the assurance of eventual data consistency.
Jul 08, 2020
3,397 words in the original blog post.
RedwoodJS is an opinionated, full-stack, serverless web application framework that simplifies the development of JAMstack applications by integrating React, GraphQL, and Prisma. It provides a React-like frontend delivered via CDN, communicates with the backend through GraphQL on AWS Lambdas, and supports deployment with a simple git push, particularly to platforms like Netlify. The framework's unique features include a declarative data fetching system called "Cells," a simple yet powerful routing mechanism, and a CLI tool inspired by Rails for generating necessary components and migrating databases. While RedwoodJS is still in its alpha stage, making it unsuitable for production-level applications, it shows potential for evolving into a standard tool for building full-stack web applications due to its ease of use and logical decision-making processes. Despite some limitations with Lambda function lengths and serverless database connections, Redwood accommodates full-stack applications and aims to improve over time with minimal developer effort.
Jul 08, 2020
1,981 words in the original blog post.
WebAssembly is presented as a solution for developers looking to port legacy C/C++ code to JavaScript, offering near-native performance and the ability to integrate performance-intensive tasks into web applications. Serving as a compilation target for languages like C/C++ and Rust, WebAssembly allows developers to import compiled .wasm files into web apps, thereby leveraging existing C/C++ libraries and improving application performance, especially for tasks such as 3D games, virtual and augmented reality, or computer vision. The article explains how to use Emscripten to transpile C++ code into WebAssembly, discusses the integration process using JavaScript, and provides a practical example by walking through the creation of a tic-tac-toe game. The game logic is written in C++, transpiled into WebAssembly, and accessed via JavaScript, demonstrating how existing code can be reused and optimized for the web. The article concludes by highlighting the versatility of WebAssembly in enabling the execution of complex applications on the web efficiently.
Jul 07, 2020
1,595 words in the original blog post.
The article explores the limitations of TypeScript in preventing runtime errors, particularly highlighting that static type checking does not guarantee the absence of all potential errors, such as those arising from unexpected external data structures. It presents manual validation and the use of validation libraries like ajv as methods to address these issues, discussing their advantages and disadvantages. A novel approach, dynamic type validation, is introduced, which combines TypeScript types with JSON schema validation to ensure that types and validators remain synchronized. This method involves generating validators directly from TypeScript type definitions using a tool like typescript-json-validator, thereby improving consistency between the codebase and schema while maintaining error-checking capabilities. The article ultimately suggests that while TypeScript offers many benefits, developers should implement dynamic validations for any external data sources to ensure robustness and reliability in their applications.
Jul 07, 2020
3,091 words in the original blog post.
Hegel is a static type checker library designed to identify typing errors early in JavaScript code without requiring runtime execution, offering a robust alternative to TypeScript and Flow by implementing a strong type system and superior type inference capabilities. Unlike TypeScript, Hegel avoids introducing new language features and does not support type coercion or the 'any' type, focusing instead on pure JavaScript with minimal annotations. It provides a more sound and provable type system, ensuring no unexpected runtime errors, and simplifies the development process by not requiring specific file extensions or comments. Hegel differs from Flow in its ability to infer types more effectively, particularly with generic types, allowing developers to write clear and concise code without the need for extensive annotations. To use Hegel, developers simply install its CLI package and run it to check for typing errors, with the option to strip typing syntax using tools like Babel or flow-remove-types for production environments.
Jul 07, 2020
1,727 words in the original blog post.
Initially designed for simple browser effects, JavaScript has evolved to become a crucial programming language, though its dynamic typing can lead to bugs in complex web applications. Scala.js emerges as an alternative with its strong typing system that mitigates such issues during compilation, offering developers confidence in variable declarations and data types. Scala.js enables unified code development for both frontend and backend, leveraging Scala's advantages and JVM libraries. The setup involves tools like sbt and JDK, while Scala.js supports DOM manipulation, templating with scalatags, and integration with frameworks like React, Vue, and Angular. Despite a steeper learning curve compared to TypeScript, Scala.js offers robust features beyond type-checking, making it suitable for sophisticated web development. The tutorial concludes with a demonstration of building a countdown timer using Scala.js, highlighting its potential for enhancing code maintainability and performance monitoring.
Jul 06, 2020
2,903 words in the original blog post.
Web workers are utilized in web development to run tasks in the background, preventing the main UI thread from freezing during heavy computational tasks. This guide explores the basics of web workers, including their implementation and usage in React applications, with a focus on addressing UI performance issues caused by tasks like sorting large datasets. The useWorker hook is introduced as a tool for managing web workers more efficiently, enhancing code readability and maintainability by allowing developers to track worker status, kill threads when necessary, and update the UI based on worker activity. A practical example demonstrates how to implement web workers in a React component for sorting user data without affecting the UI. Additionally, the guide highlights the benefits of using the useWorker hook, which simplifies the implementation of background tasks and improves user experience by preventing UI interruptions.
Jul 06, 2020
1,325 words in the original blog post.
Applications fundamentally serve as interfaces for databases, with each piece of user-generated content, such as tweets or comments, being a database entry. Front-end developers can benefit from understanding SQL, as it reveals how user interactions map to database queries and CRUD operations (Create, Read, Update, Delete), which are essential for managing data collections. In JavaScript, CRUD operations can be implemented using functional programming principles that ensure data immutability, though handling multiple items or creating entities when absent can complicate matters. The Redux Toolkit's createEntityAdapter API simplifies CRUD operations by providing a set of pre-built functions, enhancing the traditional Redux setup with an approach that aligns with functional programming paradigms. This API facilitates entity management in web applications, allowing developers to focus on application logic rather than repetitive CRUD code. The example application illustrates basic CRUD functionality using Redux Toolkit, focusing on front-end data management, while acknowledging the complexities of syncing with a server-side database. The concept of optimistic updates is introduced to address the user experience during client-server synchronization, highlighting the balance between immediate user feedback and eventual data consistency.
Jul 06, 2020
2,147 words in the original blog post.
GraphQL Playground is a versatile integrated developer environment (IDE) for GraphQL, designed to enhance development workflows by offering features like automatic schema reloading, support for GraphQL subscriptions, and the ability to configure HTTP headers. Created by Prisma, it builds on GraphiQL with additional functionalities such as syntax highlighting, intelligent type-ahead, real-time error reporting, and a documentation explorer. GraphQL Playground can be used as a desktop app, an npm module for projects, or accessed through its web version, making it adaptable for both frontend and backend development. It facilitates sending GraphQL queries and mutations, supports variables, and provides a schema tab for previewing and downloading GraphQL schemas. Developers can embed it in React applications or use it as middleware in Node.js frameworks like Express, allowing for seamless interaction with GraphQL APIs. While it differs from GraphiQL, GraphQL Playground is a valuable tool for improving workflow efficiency in GraphQL API projects, and it can be complemented by tools like LogRocket for monitoring and debugging in production environments.
Jul 06, 2020
1,413 words in the original blog post.
Helm is a package manager for Kubernetes that simplifies the process of finding, sharing, and managing Kubernetes applications through the use of Helm charts, which are easy to create, version, share, and publish. These charts are preconfigured packages in Kubernetes that include configuration files, primarily in YAML, describing the application and its infrastructure needs without directly managing Kubernetes manifests. The Helm client, a command line interface, facilitates chart development, repository management, and interaction with the Kubernetes API server, with Helm3 being the version used in this context. Users can install, upgrade, or delete applications by adding chart repositories and performing operations such as installing a WordPress application using the Bitnami Helm Chart repository. Helm also allows for the creation of custom charts and supports the organization of chart files into a structured format, enhancing deployment and management efficiencies for Kubernetes workflows.
Jul 03, 2020
1,045 words in the original blog post.
Vite is a no-bundle JavaScript development server initially designed for Vue single file components but has since evolved to support various frameworks by using native ES module imports during development. Unlike traditional bundlers, it does not bundle files in development, resulting in faster startup times and hot module replacements without the need for browser refreshes. Vite's features include bare module resolving, on-demand compilation, and extensive configuration options, making it suitable for large projects. It supports .tsx, .jsx, and TypeScript files using esbuild for transpilation, and offers asset URL handling and CSS preprocessor support. Vite allows developers to create new projects quickly using the create-vite-app boilerplate and bundles apps for production using Rollup. The tool aims to enhance development workflow and productivity by providing a fast and efficient development server.
Jul 03, 2020
1,386 words in the original blog post.
Incorporating transitions and animations in web applications can significantly enhance user experience by adding visual appeal and dynamism. This concept is exemplified in Vue.js, where transitions are particularly useful when attaching or removing elements from the DOM due to conditions like routing or dynamic components. The process involves wrapping elements in a `<transition>` tag and using transition classes like `.v-enter-active` and `.v-leave-active` to manage the animation's lifecycle. Dynamic naming of transitions allows for flexibility, enabling developers to switch styles with user interactions, such as dropdown menus. Additionally, using animation properties alongside transitions can create more complex effects, such as simultaneous fading and sliding. Libraries like Animate.css can be integrated to simplify animation implementation, and the `transition-group` tag is introduced for animating lists of elements. This approach not only makes applications more engaging but also improves the clarity and maintainability of the code. Tools like LogRocket can further assist developers by monitoring Vue.js applications, providing insights into user interactions and potential issues, thus enhancing the overall development and debugging process.
Jul 02, 2020
2,279 words in the original blog post.
Netlify has significantly enhanced the process of hosting and deploying sites by introducing a suite of features, including cross-framework support, analytics, and serverless functions. A standout addition is the build plugins, which automate tasks connected to the build process, allowing developers to perform actions such as sending notifications or making cryptocurrency donations each time a project is deployed. The process of creating a Netlify build plugin involves setting up a "skeletal" structure with files like index.js, manifest.yml, and package.json, alongside a netlify.toml file for integration. Developers can create custom plugins, such as one that sends emails upon deployment, by utilizing dependencies like Postmark for email notifications. The tutorial highlights the importance of understanding Netlify's build events, which determine when a plugin is triggered, and emphasizes best practices like error handling and securing sensitive information. As build plugins become more mainstream, they offer exciting opportunities for cross-collaboration, with many examples available for developers to explore.
Jul 02, 2020
1,605 words in the original blog post.
Resource hints are a client-side optimization technique that provides browsers with cues on how users might request resources like fonts, images, and scripts, enabling the browser to prefetch, prerender, or preload these resources to enhance web page performance. The four types of resource hints specified by W3C are dns-prefetch, preconnect, prefetch, and prerender, each serving different purposes and offering varying levels of prediction and resource preloading. Additionally, preload is a directive that mandates the fetching of resources necessary for the current page, differing from resource hints which are merely recommendations. The use of these resource hints can significantly improve page load times but also presents the risk of unnecessary bandwidth usage if incorrect predictions are made about user behavior. Browser support varies for different hints, with preconnect and prefetch generally having better support than prerender, and preload requiring consideration for browsers that do not support it. Managing these hints effectively, especially in dynamic sites, involves using JavaScript to maintain them flexibly and dynamically, ensuring they align with the site’s current structure and content.
Jul 02, 2020
2,426 words in the original blog post.
nanoSQL is a versatile JavaScript library designed to facilitate connectivity to various databases, both in-memory and permanent, without the need for multiple client libraries. It enables developers to use a standardized query language across different database systems, thus streamlining the process of working with multiple databases like MySQL and Redis in complex web applications. By creating a consistent API, nanoSQL simplifies the integration of databases into an application's architecture, whether on the client, server, or mobile device, as long as JavaScript is used. It supports both SQL and NoSQL databases, allowing for seamless transitions between different database types without the need to learn new query languages. The library is particularly beneficial in scenarios where frontend and backend storage systems need to be integrated efficiently, offering the ability to manage databases with a unified approach. Additionally, nanoSQL allows for the creation of custom query functions and supports structured development practices by enabling parallel database operations through unique adapters for each system.
Jul 01, 2020
2,444 words in the original blog post.
An @export directive in GraphQL aims to enhance query performance by allowing the value of a field to be exported into a variable for use elsewhere in the query, thus enabling the combination of two queries into one. This functionality, which has not yet been officially incorporated into the GraphQL specification due to technical challenges, can be implemented in servers like Gato GraphQL that control field resolution order. The directive supports exporting single values, lists, dictionaries, and lists of dictionaries, using a dynamic variable that begins with an underscore to differentiate it from static variables. The implementation involves design decisions such as using a "self" field to manipulate the order of field execution and ensuring dynamic variables are declared with default values. Additionally, @export can make directives like @skip and @include dynamic by conditionally executing based on object properties, although it currently only works for single values, not lists. The article highlights the importance of supporting custom directives in GraphQL servers to improve API performance, despite the absence of an official solution for the @export directive.
Jul 01, 2020
3,635 words in the original blog post.
Building a single page application (SPA) using React can be enhanced by integrating FaunaDB, a database as a service (DBaaS) that allows developers to streamline web application development without the need for a custom API server. This tutorial guides users through setting up a React app with FaunaDB, highlighting its transaction support, scalability, and ease of use, particularly its compatibility with React's modular architecture. The process includes creating a new FaunaDB account, setting up a database instance, generating access keys, and establishing a secure connection with environment variables. The tutorial further demonstrates how to create, display, and delete items from a FaunaDB collection through API queries integrated with React components. It utilizes the Material UI library for a minimalist user interface, applying layout and styling principles for responsive design. The guide concludes with deploying CRUD operations in the app and considering real-time updates with FaunaDB subscriptions to enhance functionality.
Jul 01, 2020
3,197 words in the original blog post.