【前端面试】工程化相关
包管理器
Pnpm是怎么解决幽灵依赖的
hard link + symbolic link
如何确定一个项目用的包管理器版本:enigne字段
1 | "engines": { |
如何避免业务项目被发到npm上
在 package.json 中添加 private 字段
在项目的 package.json 文件中添加 private: true 字段,这是最直接的方式。当 private 为 true 时,npm 会拒绝发布该项目。
使用 .npmignore 或 .gitignore 文件
将项目中的所有文件添加到忽略列表,确保没有文件被发布。.npmignore 会覆盖 .gitignore 的规则。
设置预发布钩子
在 package.json 中添加 prepublishOnly 脚本,使其在发布前失败:
使用 .npmrc 文件锁定发布源
在项目根目录创建 .npmrc 文件,设置为私有源或无效源:
【前端面试】React相关
React有哪些hooks
- useState
- useEffect
- useRef
- useMemo
- useCallback
- useContext
- useReducer
- useLayoutEffect
- useTransition
- useId
- useDebugValue
- useDeferredValue
useLayoutEffect和useEffect的区别
useEffect:异步执行,在浏览器完成渲染后(页面已绘制)
useLayoutEffect:同步执行,在 DOM 更新后、浏览器绘制前(用户不可见),适用于需要读取 DOM 布局或强制同步更新的场景(如测量 DOM、修改样式)。
如何借助interSectionObserver实现一个dom可见性的自定义hook
有一个关键点是Ref的更新在useEffect执行前
1 | import { useEffect, useState, useRef } from 'react'; |
useEffect 中如何使用 async/await
- async函数抽离到外部
1
2
3
4
5
6
7
8
9async function fetchMyAPI() {
let response = await fetch("api/data");
response = await res.json();
ådataSet(response);
}
useEffect(() => {
fetchMyAPI();
}, []);
【前端面试】计算机网络
Webpack
Webpack 是什么
webpack 是一种前端资源构建工具,一个静态模块打包器(module bundler)。
在webpack 看来, 前端的所有资源文件(js/json/css/img/less/…)都会作为模块处理。
它将根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)。
Webpack 五个核心概念
Entry
入口(Entry):指示 webpack 以哪个文件为入口起点开始打包,分析构建内部依赖图。
Output
输出(Output):指示 webpack 打包后的资源 bundles 输出到哪里去,以及如何命名。
Loader
Loader:让 webpack 能够去处理那些非 JS 的文件,比如样式文件、图片文件(webpack 自身只理解
JS)
Plugins
插件(Plugins):可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,
一直到重新定义环境中的变量等。
Node中的process.env
Mini-React
项目拆解:
Jsx 和虚拟 DOM
组件和生命周期
Diff
异步的setState
hook支持
具体思路
将jsx经过babel转成React.createElement的形式
例如
1 | class Hem extends React.Component { |
经过babel转义后
1 | _createClass(Hem, [ |
Jira项目
代码自动格式化工具:prettier
配置过程:https://prettier.io/docs/en/precommit.html
yarn add --dev --exact prettier
新建.prettierrc.json,.prettierignore
文件
设置git commit预提交钩子
npx mrm@2 lint-staged
规范git commit工具:commitlint
配置过程:https://github.com/conventional-changelog/commitlint
yarn add --save-dev @commitlint/config-conventional @commitlint/cli
新建 commitlint.config.js文件,引入规则module.exports = {extends: [‘@commitlint/config-conventional’]}