前端面试题(四)
16. 前端模块化
-
什么是模块化?为什么需要模块化?
- 模块化 是将代码拆分成独立且可复用的模块,每个模块只负责完成一个独立功能。模块化使得代码更加清晰、可维护、可测试,并且有助于减少代码冗余。
-
如何在 JavaScript 中实现模块化?
- ES6 模块化:通过
export
和import
关键字实现模块的导出与导入。例如:// module.js export const greet = () => { console.log("Hello World"); }; // main.js import { greet } from './module.js'; greet(); // 输出 Hello World
- CommonJS 模块化:在 Node.js 中,使用
module.exports
和require
来实现模块化:// module.js module.exports = { greet: function() { console.log("Hello World"); } }; // main.js const { greet } = require('./module'); greet(); // 输出 Hello World
- ES6 模块化:通过
-
什么是 Webpack?它在模块化中的作用是什么?
- Webpack 是一个模块打包工具,它可以将多个模块(包括 JavaScript、CSS、图片等)打包成一个或多个文件。Webpack 支持代码分割、Tree Shaking、懒加载等功能,极大优化了前端项目的加载速度和性能。
17. 跨域问题
-
什么是跨域?为什么会产生跨域问题?
- 跨域 是指浏览器出于安全限制,阻止来自一个域的网页发起到另一个域的请求。产生跨域问题的原因是 同源策略(Same-Origin Policy),即只有协议、域名、端口号都相同的情况下,浏览器才允许读取资源。
-
如何解决跨域问题?
-
CORS(跨域资源共享):服务器通过设置特定的响应头来允许跨域访问。例如,设置
Access-Control-Allow-Origin
头:Access-Control-Allow-Origin: *
或者,指定允许的域名:
Access-Control-Allow-Origin: https://example.com
-
JSONP:通过动态插入
<script>
标签来加载跨域资源,因为<script>
标签不受同源策略的限制。缺点是 JSONP 仅支持GET
请求。 -
代理服务器:使用代理服务器将请求从当前服务器中转到目标服务器。比如在前端开发中,通过 Webpack DevServer 配置代理解决跨域问题:
devServer: { proxy: { '/api': 'http://localhost:3000', }, }
-
18. 前端自动化测试
-
什么是单元测试?为什么要进行单元测试?
- 单元测试 是针对软件中最小的功能单元(如函数或类)进行测试,目的是确保每个单独的功能模块能够按预期工作。单元测试提高代码的稳定性,降低引入新 bug 的风险。
-
如何使用 Jest 进行单元测试?
- Jest 是一个强大的 JavaScript 测试框架,支持断言、模拟以及异步测试等。示例测试代码如下:
运行// sum.js function sum(a, b) { return a + b; } module.exports = sum; // sum.test.js const sum = require('./sum'); test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); });
jest
命令即可执行测试。
- Jest 是一个强大的 JavaScript 测试框架,支持断言、模拟以及异步测试等。示例测试代码如下:
-
什么是端到端测试(E2E testing)?
-
端到端测试 模拟用户操作,对整个应用的工作流程进行测试,确保所有功能从头到尾都按预期工作。常用工具有 Cypress 和 Selenium。
-
使用 Cypress 进行端到端测试的基本示例:
describe('My First Test', () => { it('Visits the app root url', () => { cy.visit('http://localhost:8080'); cy.contains('h1', 'Welcome to Your Vue.js App'); }); });
-
19. Web 性能优化
-
如何优化页面的首屏加载速度?
-
减少 HTTP 请求数:合并 CSS 和 JavaScript 文件,使用 CSS 雪碧图合并图片,减少请求数量。
-
Lazy Loading(懒加载):对于图片和组件,使用懒加载策略,只在用户需要时才加载资源。可以使用 HTML5 的
loading="lazy"
属性对图片实现懒加载:<img src="image.jpg" loading="lazy" alt="Lazy loading example">
-
压缩和优化资源:使用工具如 Terser 和 UglifyJS 压缩 JavaScript 文件,使用工具如 Imagemin 压缩图片资源,减少文件体积。
-
预加载关键资源:使用
<link rel="preload">
标签来预加载关键 CSS、JS 文件,确保这些资源能在页面渲染时尽快加载。<link rel="preload" href="styles.css" as="style"> <link rel="preload" href="script.js" as="script">
-
-
如何使用浏览器缓存来优化性能?
-
缓存控制:通过设置 HTTP 响应头
Cache-Control
,可以指示浏览器缓存某个资源,以及缓存的有效期。例如:Cache-Control: max-age=31536000, public
该指令表示资源可以在客户端缓存 1 年。
-
版本控制:通过在文件名中添加哈希值(如
styles.abc123.css
),可以确保每次文件内容更新时,浏览器能正确地加载最新版本。
-
20. 前端开发中的常见算法问题
-
如何判断字符串是否是回文?
- 回文是指一个字符串正着读和反着读都一样。例如 “racecar” 是回文。可以通过双指针法解决该问题:
function isPalindrome(str) { let left = 0; let right = str.length - 1; while (left < right) { if (str[left] !== str[right]) { return false; } left++; right--; } return true; } console.log(isPalindrome("racecar")); // 输出 true
- 回文是指一个字符串正着读和反着读都一样。例如 “racecar” 是回文。可以通过双指针法解决该问题:
-
如何实现数组去重?
- 可以使用 Set 数据结构轻松实现数组去重:
const array = [1, 2, 2, 3, 4, 4, 5]; const uniqueArray = [...new Set(array)]; console.log(uniqueArray); // 输出 [1, 2, 3, 4, 5]
- 可以使用 Set 数据结构轻松实现数组去重:
-
如何找出数组中的最大值和最小值?
- 可以使用 JavaScript 的
Math.max
和Math.min
方法,结合 spread 语法 快速找到数组中的最大值和最小值:const array = [1, 2, 3, 4, 5]; const max = Math.max(...array); const min = Math.min(...array); console.log(max); // 输出 5 console.log(min); // 输出 1
- 可以使用 JavaScript 的
21. 浏览器的渲染原理与优化
-
浏览器的渲染流程是怎样的?
- 浏览器渲染过程主要包括以下几个步骤:
- 解析 HTML:生成 DOM 树。
- 解析 CSS:生成 CSSOM 树。
- 构建渲染树:结合 DOM 和 CSSOM 构建渲染树。
- 布局:计算每个元素的大小和位置。
- 绘制:将元素绘制到屏幕上。
- 浏览器渲染过程主要包括以下几个步骤:
-
如何避免浏览器的回流(Reflow)和重绘(Repaint)?
-
回流:当页面的布局或几何属性变化时触发,如改变元素的大小、位置、添加或删除 DOM 节点。
-
重绘:当页面的视觉样式变化(如颜色、背景)时触发,不涉及布局变化。
-
优化技巧:
- 避免频繁的 DOM 操作,可以
-
使用文档片段(DocumentFragment
)或批量更新 DOM。
- 使用 CSS 进行动画(如 transform
和 opacity
)而非 JavaScript 动画。
- 使用 will-change
提示浏览器提前优化需要频繁改变的元素。
原文地址:https://blog.csdn.net/qq_62512874/article/details/142480819
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!