模拟面试1-工程化

38 阅读3分钟

整个项目打包后总体过大,排查发现是公共库体积体积过大的解决办法

`1.分包:主要三个目的1.保证第三方库的指纹稳定,因为第三方库没被修改,打包生成的指纹是不变的,可以很好的利用浏览器缓存2.减少重复代码 3.动态加载 import definesynccomponent

  1. 尽量使用具名导入,以便配合tree shaing

3.跨项目公共库 内网可以自建cdn,外网:自建或者使用著名的cdn库 `

webapck vite



1.某个包出现多个版本的情况?

a依赖 依赖loadsh3.1.0 b依赖开始不是,但是升级为3.2.0, 就会出现一个包出现多个版本的情况 由于安装时间不一样, npm,yarn 会出现 两个版本的问题,由于依赖版本lock锁死的导致的 npm dedup npm upgrade 或者 去删除lock文件可以解决 npm upgrade 更新到当前能更新的最新版本

比如^3.1.0 更新范围为ver>3.1.0 4.0.0<ver

~3.1.0 更新范围为:3.2.0 > ver > 3.1.0

2.如何知道 package.json 里的依赖有哪些更新了大版本, 也就是break change。

主要是更新了大版本之后,如果不及时更新依赖的话,拖的太久的话,可能会出现旧的官方文档被新的替换,导致旧版文档无处查阅,导致旧的项目无法维护。

原生的命令没有,但是可以借助第三方的 npm-check-updates 来知道

image.png

3. 什么场景需要更新依赖的最新大版本

  • 新特性

  • break change

  • 降低风险 Audit =》 npm audit 检查包是否被注入风险代码

4.如何发包

5.npm 私有仓库

项目规范

  • 代码

    • eslint

  • 脚手架

    • 项目结构统一
    • 工具包统一
  • husky : 提供一套 拦截 git hook的 工具集 - git hooks : .git > .hooks 下有一套脚本 【但是可以配置 hooks 的默认路径】【修改.hook s的目录改为受git 控制的目录, 然后在该目录下编写pre-commit 脚本。就可以实现不使用husky,来实现拦截git【husky原理就是如此】】 - 自己在cli 窗口敲git 命令的时候,在进入到pre-commit脚本里写入相应的逻辑。

  • lint-stage : 可以对 git add 之后的暂存区做一些命令操作!!!

    • 不借助于 lint-stage ,如何对暂存区做执行一系列? git diff --cached
  • xargs

  • glob

    • 找到所有的.json : **/*.json
    • 找到所有的[a-z].json : {a..z}.json
  • 文档

  • npm lifecircle

  • git commit 项目规范

    • commit-msg
  • 'zx'

  • 组件规范

    • 层级 分层设计
  • npm 分包 发包

    • webapck
      • 入口文件字段: main/module 一般是commonjs,esm
      • types
  • commonjs Esm 区别

  • 工具库

  • rollup webapck 做工具打包遇到的问题:

    • 打包后的目标格式 : umd[] cjs[] esm[output 选项里有个选项]

      • 默认的格式: iife
  • webapck chunk 如何生成: import() | code spliting |

  • peerDependencies 字段(自动安装,项目中存在的话就不会自动安装) | peerDependenciesMeta 字段

  • pnpm : 优势: 省空间【软连接】

【使用 pnpm (项目初衷 | pnpm中文文档 | pnpm中文网)时,依赖会被存储在内容可寻址的存储中,如果你用到了某依赖项的不同版本,只会将不同版本间有差异的文件添加到仓库。

所有文件都会存储在硬盘上的某一位置。 当软件包被被安装时,包里的文件会硬链接到这一位置,而不会占用额外的磁盘空间。 这允许你跨项目地共享同一版本的依赖。

在项目安装依赖时,会进行依赖解析,对已经安装的全局包直接软链接到项目中。 】

  • 幽灵依赖 【就是package.json 中dependency不存在这个包,但是项目中又存在间接依赖,但是又恰好引用了这个包】【.pnpm下才是真正的依赖】【找其他的包的时候,node_modules下对应不存在,就会软连接连接到.pnpm 里了,命名:自己的包名+peerDependencies才是.pnpm 里的包的全名】

  • 如何确定包管理工具

    • lock文件
    • engines
    • packageManager 字段确定版本号
  • corepack

  • docker ci cd