【前端面试】挖掘做过的nextJS项目(中)

news2024/9/21 8:02:57

https://blog.csdn.net/weixin_43342290/article/details/141170360?spm=1001.2014.3001.5501文章浏览阅读105次。需求:快速搭建宣传官网1.适应pc、移动端2.基本的路由跳转3.页面渲染优化4.宣传的图片、视频资源的加载优化5.seo优化全栈react web应用、tailwind css原子工具的支持,方便书写响应式uiapp router(React 服务器组件)支持服务器渲染优化、code-spilit优化服务端渲染对seo友好。https://blog.csdn.net/weixin_43342290/article/details/141170360?spm=1001.2014.3001.5501

图片优化

图片占典型网站 页面重量 的很大一部分,并且可以对网站的 LCP 性能 产生相当大的影响。

Next.js 图片组件扩展了 HTML <img> 元素,具有自动图片优化功能:

  • 尺寸优化:使用 WebP 和 AVIF 等现代图片格式自动为每个设备提供正确尺寸的图片。

  • 视觉稳定性:加载图片时自动阻止 布局转变。

  • 更快的页面加载:仅当图片使用原生浏览器延迟加载进入视口时才会加载图片,并带有可选的模糊占位符。

  • 资源灵活性:按需调整图片大小,即使是存储在远程服务器上的图片

🎥 监视:了解有关如何使用 next/image → YouTube(9 分钟) 的更多信息。

import Image from 'next/image'
import profilePic from './me.png'

export default function Page() {
  return (
    

<img src="https://next.nodejs.cn/_next/image?url=/docs/light/responsive-image.png&w=3840&q=75"/>



```jsx
import Image from 'next/image'
import mountains from '../public/mountains.jpg'

export default function Responsive() {
  return (
    <div style={{ display: 'flex', flexDirection: 'column' }}>
      

<img src="https://next.nodejs.cn/_next/image?url=/docs/light/fill-container.png&w=3840&q=75"/>



```jsx
import Image from 'next/image'
import mountains from '../public/mountains.jpg'

export default function Fill() {
  return (
    <div
      style={{
        display: 'grid',
        gridGap: '8px',
        gridTemplateColumns: 'repeat(auto-fit, minmax(400px, auto))',
      }}
    >
      <div style={{ position: 'relative', height: '400px' }}>
        

<img src="https://next.nodejs.cn/_next/image?url=/docs/light/background-image.png&w=3840&q=75"/>



```jsx
import Image from 'next/image'
import mountains from '../public/mountains.jpg'

export default function Background() {
  return (
    <Image
      alt="Mountains"
      src={mountains}
      placeholder="blur"
      quality={100}
      fill
      sizes="100vw"
      style={{
        objectFit: 'cover',
      }}
    />
  )
}

window.devicePixelRatio

`window.devicePixelRatio` 是一个 Web API 属性,它返回一个数值,表示屏幕的物理像素和 CSS 像素之间的比例。这个属性对于处理视网膜(Retina)显示屏和其他高 DPI(Dots Per Inch)设备非常有用,因为它可以帮助开发者了解物理像素与 CSS 像素的实际映射关系。

以下是 `window.devicePixelRatio` 的一些关键点:

1. **定义**:`devicePixelRatio` 是 `window` 对象的一个只读属性,返回一个无符号的浮点数。

2. **用途**:主要用于响应式设计和高性能图形渲染,确保在高分辨率屏幕上提供清晰的图像和布局。

3. **默认值**:在标准显示屏上,`devicePixelRatio` 的值通常是 1。这意味着每个 CSS 像素对应一个物理像素。

4. **高分辨率屏幕**:在高分辨率屏幕上,比如苹果的视网膜显示屏,`devicePixelRatio` 的值可能是 2 或更高,这意味着每个 CSS 像素可能对应多个物理像素。

5. **使用示例**:
   ```javascript
   var ratio = window.devicePixelRatio;
   console.log("设备像素比: " + ratio);
   ```

6. **应用场景**:
   - 根据 `devicePixelRatio` 动态调整图像大小,确保在高分辨率屏幕上图像不会模糊。
   - 调整 canvas 元素的大小,以利用额外的像素提高图形的清晰度。
   - 为不同的设备像素比提供不同的 CSS 样式或媒体查询。

7. **兼容性**:大多数现代浏览器都支持 `window.devicePixelRatio` 属性。

8. **注意事项**:虽然 `devicePixelRatio` 提供了设备像素比的信息,但它并不总是等于屏幕的 DPI。有些设备可能有其他方式来表示或处理像素比,因此在使用时需要考虑不同设备的特定行为。

通过使用 `window.devicePixelRatio`,开发者可以创建更加灵活和适应不同设备显示特性的 Web 应用。

    const dpr = window.devicePixelRatio || 1;
    let dprAdjustedWidth: number | undefined = undefined;
    if (width) {
      dprAdjustedWidth = Math.round(width * dpr * 100000) / 100000;
    }
    let dprAdjustedHeight: number | undefined = undefined;
    if (height) {
      dprAdjustedHeight = Math.round(height * dpr * 100000) / 100000;
    }

视频优化

要继续了解有关视频优化和最佳实践的更多信息,请参阅以下资源:

  • 了解视频格式和编解码器:根据你的视频需求选择正确的格式和编解码器,例如用于兼容性的 MP4 或用于网络优化的 WebM。详细信息请参见 Mozilla 的视频编解码器指南。

  • 视频压缩:使用 FFmpeg 等工具有效压缩视频,平衡质量与文件大小。在 FFmpeg 的官方网站 了解压缩技术。

  • 解析和码率调整:根据观看平台调整 解析和比特率,移动设备设置较低。

  • 内容交付网络 (CDN):利用 CDN 提高视频传输速度并管理高流量。使用某些存储解决方案(例如 Vercel Blob)时,系统会自动为你处理 CDN 功能。了解更多 关于 CDN 及其优势。

Next.js + Workbox 集成=》缓存策略

Next.js 允许开发者通过在 public 目录下添加 Service Worker 文件来自定义 Service Worker 逻辑。Workbox 可以在这里使用,以提供更智能的缓存策略。

Next.js 与 Workbox 集成,提供了多种缓存策略,这些策略可以通过 Workbox 易于使用的 API 来实现。以下是一些常见的缓存策略:

在 Next.js 中,你可以通过修改 Service Worker 文件(通常位于 `public` 目录下的 `service-worker.js`)来配置这些缓存策略。例如:

```javascript
import { precacheAndRoute } from 'workbox-precaching';
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';

// Precache static assets
self.addEventListener('install', (event) => {
  event.waitUntil(
    precacheAndRoute(self.__WB_MANIFEST || [])
  );
});

// Runtime caching for other assets
registerRoute(
  // Match any request that ends with .jpg, .png, .svg, .gif
  ({ url }) => url.pathname.match(/\.(jpg|png|svg|gif)$/),
  // Use stale-while-revalidate strategy
  new StaleWhileRevalidate({
    cacheName: 'images',
  })
);
```

使用这些策略,你可以为 Next.js 应用实现高效的缓存机制,提高加载速度和用户体验。
 

Workbox

Workbox 是 Google 提供的一组前端开发工具,旨在简化在 Web 应用中实现 Service Worker 的过程。Workbox 包括多个模块,其中 `workbox-precaching`、`workbox-routing` 和 `workbox-strategies` 是最常用的几个模块。

可以被视为 Service Worker 的一个封装库。它提供了一组简化的 API 和工具,使得开发者能够更容易地在 Web 应用中实现 Service Worker 的功能。Workbox 的主要目标是抽象化 Service Worker 的复杂性,让开发者能够专注于实现应用的缓存策略和离线体验,而不需要深入了解 Service Worker 的内部细节。

1. **workbox-precaching**:
   - 这个模块用于在 Service Worker 中预缓存一组在构建时已知的文件(即静态资源)。预缓存通常是在 Service Worker 安装阶段完成的,可以确保应用的这些关键资源在第一次访问时即可使用,甚至在离线状态下。
   - 使用 `precacheAndRoute()` 方法可以自动将资源添加到缓存中,并在资源请求时返回缓存的副本。

   ```javascript
   import { precacheAndRoute } from 'workbox-precaching';

   precacheAndRoute(self.__WB_MANIFEST || []);
   ```

2. **workbox-routing**:
   - `workbox-routing` 模块提供了路由功能,允许你创建自定义的路由规则来拦截网络请求,并定义如何处理这些请求(例如返回缓存的资源或执行网络请求)。
   - 使用 `registerRoute()` 方法可以注册自定义的路由规则。

   ```javascript
   import { registerRoute } from 'workbox-routing';

   registerRoute(
     ({url}) => url.pathname.startsWith('/images/'),
     // 指定处理请求的策略
     new CacheFirst()
   );
   ```

3. **workbox-strategies**:
   - `workbox-strategies` 模块包含一组预定义的缓存策略,用于定义如何存储和检索请求的响应。这些策略包括 NetworkFirst、CacheFirst、StaleWhileRevalidate、NetworkOnly 和 CacheOnly 等。
   - 这些策略可以作为参数传递给 `registerRoute()` 方法,以处理匹配特定路由规则的请求。

   ```javascript
   import { NetworkFirst } from 'workbox-strategies';

   registerRoute(
     // 匹配 API 请求的路由规则
     ({url}) => url.pathname.startsWith('/api/'),
     new NetworkFirst()
   );
   ```

结合使用这些模块,你可以创建一个功能强大的 Service Worker,它能够处理应用的缓存需求,包括静态资源的预缓存、动态请求的缓存策略,以及自定义路由规则。Workbox 还提供了许多其他模块,如 `workbox-broadcast-update`、`workbox-cacheable-response` 和 `workbox-core` 等,用于进一步扩展 Service Worker 的功能。通过 Workbox,开发者可以更容易地构建快速、可靠的渐进式 Web 应用(PWA)。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划篇--代码随想录算法训练营第三十二天|343. 整数拆分,96.不同的二叉搜索树,01背包理论,01背包优化

343. 整数拆分 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 讲解视频&#xff1a; 动态规划&#xff0c;本题关键在于理解递推公式&#xff01;| LeetCode&#xff1a;343. 整数拆分 题目描述&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k …

c++47 二级指针

二级指针的输入和输出模型 指针的输入&#xff1a;主调函数分配内存 指针输出 &#xff1a;被调用函数分配内存 指针做输入第一种模型 #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h>// 二级指针做输…

《计算机组成原理》(第3版)第8章 CPU的结构和功能 复习笔记

第8章 CPU的结构和功能 一、CPU的结构 &#xff08;一&#xff09;CPU的含义 CPU实质包括运算器和控制器两大部分。 对于冯诺依曼结构的计算机而言&#xff0c;一旦程序进入存储器后&#xff0c;就可由计算机自动完成取指令和执行指令的任务&#xff0c;控制器就是专用于完成…

Python爬虫图片:从入门到精通

在数字化时代&#xff0c;图片作为信息传递的重要媒介之一&#xff0c;其获取和处理变得越来越重要。Python作为一种功能强大且易于学习的编程语言&#xff0c;非常适合用来编写爬虫程序&#xff0c;帮助我们自动化地从互联网上获取图片资源。本文将从基础到高级&#xff0c;详…

CTF密码学小结

感觉没啥好总结的啊 基础的永远是RSA、流密码、哈希、对称密码、古典密码那一套&#xff08;密码学上过课都会&#xff09;&#xff0c;其他的就是数论的一些技巧 似乎格密码也很流行&#xff0c;以及一些奇奇怪怪的性质利用也很多 1、random设置种子后随机的性质&#xff1a…

【LiteX】【开发板】【BoChenK7】使用Python开发FPGA【Hello World、LED点灯、Memory测速、替换BIOS】

目录 开发板介绍下载仓库工程设计工程构建构建流程 工程测试Hello WorldLED点灯Memory测速替换BIOS 开发板信息 开发板介绍 手头目前只有一个购买的BoChenK7开发板&#xff0c;后续会用它来进行LiteX FPGA SoC的构建 测试可能会包括&#xff1a; LED&#xff1a;本篇文章 DDR …

【区块链+乡村振兴】“蜜链盟”乡村振兴基层治理数字化平台 | FISCO BCOS应用案例

在国家战略政策推动和新一代信息化发展应用的合力之下&#xff0c;数字乡村是互联网化、信息化和数字化在农业农村经 济社会发展中的表现。为进一步加强乡村基层治理&#xff0c;根据《中共海南省委农村工作领导小组办公室海南省农业农 村厅关于在我省乡村治理中推广运用积分制…

【Docker】Docker Volume(存储卷)

一、什么是存储卷 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。 在宿主…

xss-靶场

一、环境地址 XSS Game - Learning XSS Made Simple! | Created by PwnFunction 二、案例复现 案列1——Ma Spaghet&#xff01; <!-- Challenge --> <h2 id"spaghet"></h2> <script>spaghet.innerHTML (new URL(location).searchParams…

idea2022新建jsp项目并配置Tomcat服务器

1、创建项目 2、添加jdk 步骤如下&#xff0c;然后点击下边的create 创建项目即可 3、点击file 4、选择模块添加web 5、配置tomcat 6、依次点击 7、新建jsp文件 8、成功显示

Python 全栈系列262 使用sqlalchemy(clickhouse)

说明 再补充一篇。之前连不上的原因也挺搞笑&#xff0c;大概是deepseek把我带偏了&#xff0c; 应该是 pip3 install clickhouse-sqlalchemy -i https://mirrors.aliyun.com/pypi/simple/ 但是它教我 pip3 install sqlalchemy-clickhouse -i https://mirrors.aliyun.com/py…

Keepalived总结笔记

环境准备&#xff1a;两台安装ka的服务器&#xff0c;两台客户机&#xff0c;IP无要求&#xff0c;关闭火墙和selinux 1.在两台主机上安装ka 全局配置文件在/etc/keepalived/keepalived.conf 可以改写邮件地址和发送邮件的地址和主机唯一标识以及组播地址 配置虚拟路由&…

基于单片机的智能晾衣系统设计

摘 要 &#xff1a;在网络信息技术的推动下&#xff0c;智能家居得到了广泛应用&#xff0c;文章根据当前的市场动态&#xff0c;针对基于单片机的智能晾衣系统设计展开论述&#xff0c;具体包括两个方面的内容———硬件设计和软件设计。 关键词 &#xff1a;单片机&#xff…

经方药食两用服务平台

TOC springboot226经方药食两用服务平台 绪论 1.1研究背景与意义 信息化管理模式是将行业中的工作流程由人工服务&#xff0c;逐渐转换为使用计算机技术的信息化管理服务。这种管理模式发展迅速&#xff0c;使用起来非常简单容易&#xff0c;用户甚至不用掌握相关的专业知识…

【经典算法】BFS_最短路问题

1. 最短路问题介绍 最短路径问题是图论中的一类十分重要的问题。本篇文章只介绍边权为1(或边权相同)的最简单的最短路径问题。所谓边权&#xff0c;就是两点之间的距离。 这类问题通俗的说就是告诉你起点和终点&#xff0c;要你找出最短的路径或是最短路径是多少。 解决方法&…

每日OJ_牛客_DP3跳台阶扩展问题

目录 DP3跳台阶扩展问题 题解代码1&#xff08;dp&#xff09; 题解代码2&#xff08;找规律&#xff09; DP3跳台阶扩展问题 跳台阶扩展问题_牛客题霸_牛客网 题解代码1&#xff08;dp&#xff09; 假定第一次跳的是一阶&#xff0c;那么剩下的是n-1个台阶&#xff0c;跳法…

汇编语言:jcxz 指令

‌ 在汇编语言中&#xff0c;jcxz 标号 指令是一个有条件转移指令&#xff0c;用于检测CX寄存器的值&#xff0c;如果CX寄存器的值为0&#xff0c;则跳转到指令中标号所指定的地址处执行&#xff1b;否则&#xff0c;指令将继续顺序执行。‌ 1. jcxz 标号 &#xff0…

超市收银出入库进销存库存管理系统java数据库SpringBoot前端VUE

系统设计是一个把软件需求转换成用软件系统表示的过程[9]。通过对目标系统的分析和研究&#xff0c;做出了对师范学院实习管理系统的总体规划&#xff0c;这是全面开发系统的重要基础。在对实习管理系统全面分析调查的基础上&#xff0c;制定出商品销售系统的总体规划。系统设计…

KEEPALIVED的高可用实现

目录 一.高可用集群 1.1 集群类型 Keepalived 环境准备 1.2Keepalived 相关文件 1.3实验步骤 1.3.1HTTP配置 1.3.2安装KA 1.3.3实现master/slave的 Keepalived 单主架构 1.3.4抢占模式和非抢占模式 非抢占模式 抢占模式 抢占延迟模式 preempt_delay 1.3.5开启KA…

习题2.38-2.39

2.38这个题目特别有意思,能比较深的理解什么是左侧优先右侧优先。先看看实现代码 ;;满足交换律,即操作函数的参数可相互交换,其结果不变 (defn fold-right[op initial sequences](if (empty? sequences)initial(op (first sequences)(accumulate op initial (rest sequence…