工程化

3/13/2023 其他面试

# 什么是前端工程化

前端工程化是指围绕代码处理的一系列工具链,他们把代码当作字符串处理,并不关心代码的内容,包括编译构建、静态分析、格式化、CI/CD等等。

# 软连接与硬连接

# pnpm 常用命令

# 组件封装

组件封装原则:

一个组件只专注做一件事,且把这件事做好(通用 易用 可组合):

  • 功能上拆分层次
  • 尽量让组件原子化(便于使用者自己组合)
  • 容器组件(只管理数据)&UI组件(只显示视图)

针对于业务,尽量做到组件的原子化,而不是做大而全的组件,考虑后续的扩展性及维护成本以及使用者的心智负担

vue组件三要素:

  1. props参数
  2. slot定制插槽
  3. event自定义事件

组件封装思想:

  • 判断基本类型
    • 哪些写死
    • 哪些传进来
  • 扩展
    • 自定义事件,判断传出参数
    • 插槽扩展
  • 优化
    • 提高适应性(v-if,v-show,component 动态组件)

使用者的学习成本

  • 是否增加额外的心智负担
  • 有无配套的使用文档及示例

# 解释一下CI/CD

持续集成和持续交付/部署

  • 持续集成:开发人员提交代码后,自动化构建,自动化测试和自动化部署。
  • 持续交付/部署:经过持续集成的代码(经测试过,并通过了品质保证的软件代码),自动化的部署至生产环境中

提高开发项目的质量,降低风险和加速交付时间,提高开发效率、质量和团队协作能力。

# 了解 tree shaking 吗,说说他的实现原理

摇树优化(tree shaking)是一种能够将没有用到的代码在编译阶段自动去除的优化技术,主要目的是减小浏览器中加载 javascript 的代码体积,从而提高网站性能。

其实现原理主要是利用了es6模块化规范中的静态引用关系,即在静态分析阶段(不需要真正运行代码)就能知道一个模块是否被导出使用,javascript利用这些信息来剔除没被使用的代码,从而做到减小生成的 bundle 大小。

具体实现过程如下:

  1. 遍历源码中所有模块以及她们的导入关系,生成一张完整的依赖树
  2. 对于应用入口文件的依赖项进行分析,找出其中没有被用到的导出项
  3. 去除没有被用到的导出项

需要注意的是,tree shaking 并不是完美的,它有一些限制。例如,如果一个模块导出的是一个对象或类,而这个对象或类的某些属性或方法被其他模块使用,那么整个对象或类都不会被 tree shaking 删除。因此,为了使 tree shaking 生效,我们需要尽可能地将模块拆分成更小的单元,并将不同的模块之间的依赖关系尽可能明确地声明出来。

# Babel是什么?能说说他的原理实现吗

babel 是一个广泛使用的 Javascript 编译器,可以将 es6及以上的代码转换为向后兼容的代码。

原理实现:

  1. 解析:babel 会先使用插件将源代码解析为 ast
  • 词法分析:将源代码分解为 token(如变量名、运算符等)
  • 语法分析:将词法分析产生的词法单元转化为AST
  1. 转换:遍历得到的 ast,对其进行修改和重构,包括添加、删除、替换、移动节点等操作
  2. 生成:将转换后的 ast 重新生成为代码

# eslint 原理实现

解析js生成token,词法分析,语法分析,再转化为抽象语法树ast,根据配置的rules,将AST与规则进行匹配,检查代码是否符合规范

ESLint 是一款可配置的 JavaScript 代码检测工具,可以帮助开发者保持代码风格的一致性,规避潜在的错误和代码质量问题。它的原理基于以下三个步骤:

  1. 代码解析:ESLint 使用 Esprima 将代码解析成一个抽象语法树(AST),以便进行后续的检测和修复。同时,还可以使用不同的解析器来支持不同的 JavaScript 语法。
  2. 规则匹配:ESLint 根据用户在配置文件中定义的规则,匹配检测代码中存在的问题,并生成一份问题清单。这些规则可以是官方的也可以是自定义的。其中,每个规则都是一个函数,用来检测 AST 中的节点是否符合规定的规则。
  3. 输出结果:ESLint 根据检测结果,生成一份报告,指出代码中的问题。这个报告可以在控制台输出,也可以配置输出到指定的文件中。

在实现规则匹配时,ESLint 提供了一些钩子函数和 API,方便插件和规则的开发。并且还支持通过配置项对插件和规则进行启用和禁用、调整检测顺序等操作,可以更加灵活地适应各种项目的需求和场景。 需要注意的是,ESLint 本身只是一个坚持规范和风格的工具,并不会自动修复代码问题。因此,开发者需要通过配合使用其他工具(如 Prettier、lint-staged 等)来对代码进行格式化和修复,以便提高开发效率和代码质量。

Last Updated: 8/17/2023, 3:04:24 PM