La herramienta que menciona el profesor en el minuto 11 se puede encontrar en https://tomekdev.com/posts/throttle-vs-debounce-on-real-examples
Introducción
¿Cuándo optimizar el código?
Throttling y Debouncing
Analizando nuestra página de búsqueda
Nuestro propio hook debouncer: useDebouncer
Throttling y Debouncing con Lodash en React
Cache en memoria
Asincronía, cache y re-validación de recursos HTTP
Hashmaps vs. arrays
Memoización
Identificando re-renders problemáticos
Memoization en React
Scrolling
Patrón Windowing
Conclusiones
Próximos pasos
En el vasto universo del desarrollo web, conceptos como Trolllink y Bowsering no solo son tus aliados, sino que se consideran esenciales para optimizar cualquier aplicación que interactúe con usuarios. Al involucrarte en un curso avanzado de Next.js, estarás en contacto constante con estos términos. Al hablar de su relevancia, es vital entender cómo se integran en tu proyecto web para mejorar la eficiencia y proteger los recursos del servidor.
Comenzar con Next.js implica seguir una serie de pasos estructurados que aseguran una arquitectura robusta para tu aplicación.
Una funcionalidad crítica de cualquier aplicación interactiva es la página de búsqueda. Un buen diseño y configuración de esta página son imprescindibles para ofrecer una experiencia de usuario satisfactoria.
yarn dev
y asegúrate de que está operando en localhost
en el puerto 3000.plan collection
.La eficiencia en el uso de recursos del servidor es crucial para el rendimiento de tu aplicación. Aquí es donde Trolllink y Bowsering aportan soluciones efectivas.
Estos métodos no solo optimizan el uso de recursos, sino que mejoran la experiencia del usuario, asegurando que las búsquedas sean más precisas y sin retrasos.
Elegir implementar estrategias como Trolllink y Bowsering en tu aplicación no es solo una opción, sino una necesidad para cualquier desarrollador serio que busque proteger y optimizar sus recursos.
Estos conceptos son fundamentales para cualquier desarrollador web que busque llevar sus habilidades y proyectos al siguiente nivel. ¿Estás listo para aplicarlos y optimizar tus aplicaciones? ¡Sigue explorando y nunca pares de aprender!
Aportes 7
Preguntas 0
La herramienta que menciona el profesor en el minuto 11 se puede encontrar en https://tomekdev.com/posts/throttle-vs-debounce-on-real-examples
Archivos base de la clase.
pages/search.tsx
import { useState, ChangeEventHandler, useEffect } from 'react'
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
import { useTranslation } from 'next-i18next'
import { GetStaticProps } from 'next'
import {
OutlinedInput,
InputLabel,
InputAdornment,
FormControl,
} from '@ui/FormField'
import { SearchIcon } from '@ui/icon/Search'
import { Typography } from '@ui/Typography'
import { Layout } from '@components/Layout'
import { PlantCollection } from '@components/PlantCollection'
import { searchPlants, QueryStatus } from '@api'
export const getStaticProps: GetStaticProps = async ({ locale }) => ({
props: await serverSideTranslations(locale!),
})
export default function Search() {
const { t } = useTranslation(['page-search'])
const [term, setTerm] = useState('')
const [status, setStatus] = useState<QueryStatus>('idle')
const [results, setResults] = useState<Plant[]>([])
const updateTerm: ChangeEventHandler<HTMLInputElement> = (event) =>
setTerm(event.currentTarget.value)
const emptyResults = status === 'success' && results.length === 0
useEffect(() => {
if (term.trim().length < 3) {
setStatus('idle')
setResults([])
return
}
setStatus('loading')
// Pagination not supported... yet
searchPlants({
term,
limit: 10,
}).then((data) => {
setResults(data)
setStatus('success')
})
}, [term])
return (
<Layout>
<main className="pt-16 text-center">
<div className="max-w-5xl mx-auto mb-6">
<FormControl fullWidth className="" variant="outlined">
<InputLabel htmlFor="search-term-field">{t('term')}</InputLabel>
<OutlinedInput
id="search-term-field"
value={term}
onChange={updateTerm}
startAdornment={
<InputAdornment position="start">
<SearchIcon />
</InputAdornment>
}
labelWidth={100}
/>
</FormControl>
</div>
<div>
{emptyResults ? (
<Typography variant="body1">{t('notFound', { term })}</Typography>
) : null}
</div>
<div>
{!emptyResults ? (
<PlantCollection plants={results} variant="square" />
) : null}
</div>
</main>
</Layout>
)
}
components/Header/Header.tsx
import { PropsWithChildren } from 'react'
import Link, { LinkProps } from 'next/link'
import { useTranslation } from 'next-i18next'
import { NavBar } from '@ui/NavBar'
import { Button } from '@ui/Button'
import { PreviewModeBanner } from './PreviewModeBanner'
import { TopArea } from './TopArea'
export function Header() {
const { t } = useTranslation(['common'])
return (
<>
<PreviewModeBanner />
<div className='px-8 py-3'>
<TopArea />
</div>
<div className="mx-auto" style={{ maxWidth: '98%' }}>
<NavBar title="🌿 Plantpedia">
<div>
<NavLink href="/top-stories">{t('topStories')}</NavLink>
</div>
<NavLink href="/search">{t('search')}</NavLink>
</NavBar>
</div>
</>
)
}
function NavLink({ children, ...linkProps }: PropsWithChildren<LinkProps>) {
return (
<Link {...linkProps} passHref>
<Button color="inherit" variant="text" component="a">
{children}
</Button>
</Link>
)
}
¿Por qué optimizar?
Invocar una función menos veces.
Proteger y optimizar recursos.
Los archivos y el comando mostrados en los recursos no corresponden con lo que el profesor muestra…
Se puede cambiar
labelWidth={100}
Por
label={t('term')}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?