#
当我准备开始写这篇文章的时候,我突然觉得有些迷茫~
通常来讲,我会确定一个主题,然后会让AI给我一个可能的提纲,而我来根据自己的理解,收集,参考一些依据,做一些论证小实验,从而来完成一篇相对负责任的文章,可是这一次我有点犹豫了,因为就这一个主题下,AI给我的提纲和我想说的出入有点大,或者说AI太八股了,而我想说的是一些能够快速解释前端工程化的杂谈。
这是 AI 给我的提纲:
这提纲没什么不好的,全面,但是偏正式,偏八股。
而我想说的可能更适合于从实践的角度快速理解前端工程并非想解释前端工程化,因为我觉得只有你知道前端工程的概念,你才能明白工程化。
以下我会从实际工作中的视角代入前端工程,做一个简单的全览。
here we go!
⚠️ 不过在开始之前也需要了解一些前端工程化的八股概念 (偷个懒直接交给gpt):
前端工程化的定义:
前端工程化是一种思想,它利用软件工程的技术和方法来规范前端的开发流程,提高效率,保证质量,它包括了开发、测试、部署等所有的步骤。前端工程化的重要性:
随着Web技术的发展,前端的复杂性也在不断提高,前端工程化可以帮助我们更好地管理这种复杂性,提高开发效率,减少错误。模块化:
是将复杂的程序分解为互相独立的模块,每个模块只负责一部分功能,模块之间通过接口通信。这样可以提高代码的可维护性和可复用性。组件化:
是在模块化的基础上,将UI分解为可复用的组件,每个组件包含了它的视图和逻辑。这样可以提高UI的一致性和开发效率。工程化:
是将软件工程的方法应用到前端开发中,包括版本管理、测试、构建、部署等。这样可以提高质量和效率,减少错误。自动化:
是使用工具自动执行重复的任务,如构建、测试、部署等。这样可以减少人为错误,提高效率。⚠️ 阅读本文之后,你会有以下收获:
前端工程在项目中是什么
前端工程在前端工作流中是什么
前端工程原来就这~
⚠️ 特别提示:以下内容旨在帮助快速理解相对局部、相对微观的前端工程化,更多的是前端工程的东西,并不会全面且细致的去阐述前端工程化,若需八股,还是得多看看面经~
一般来说我们入职后会先熟悉团队的各种开发规范,工作流,通常最初你大概率会负责一个repo坑,也不排除多个或者monorepo的情况,但总体是一样的,下面我们用一个基础的monorepo举例:
正常来讲你的前端工程都是基于git做版本管理,基于node和npm做工程管理,而webpack,vite,rollup等其实是基于node的上层工程管理框架,当然也有一些基于rust的工程管理库,比如Rspack,当然了,这几个主要是负责前端工程的打包构建等方面。
我是怎么看的,任何一个Application都是一堆代码和资源组成,这些代码和资源分散在各个文件或文件夹里,而前端工程就是它们和管理的总和。
简单来说就是你看到的repo所有都是前端工程,这是一句废话,但是请听我慢慢解释:
husky:(githook工程管理)
基于三方库husky的githook管理功能目录node_modules:(npm包工程管理)
npm包安装目录,及环境变量bin目录packages:(代码及资源目录)
代码和资源scripts:(当前仓库脚本管理)
一些前端工程需要写一些脚本帮助管理,比如build,release时的一些脚本.cz-config.js:(git.commit工程管理)
基于三方库cz-customizable的prompt交互式commit自定义配置文件.eslintrc.cjs:(代码规范管理)
基于三方库eslint的代码规范配置文件.gitignore:(git.tracing管理)
基于git的,git文件跟踪管理配置文件.lintstagedrc.json:(git.worktree工程管理)
基于三方库lintstaged的git工作区的管理配置文件.prettierignore:(代码风格工程管理)
基于三方库prettier的工作区的管理配置文件.prettierrc.js:(代码风格工程管理)
基于三方库prettier的管理配置文件commitlint.config.js:(git.commit风格工程管理)
基于三方库commitlint的管理配置文件,用于规范git提交docker-compose.yml:(docker部署工程管理)
基于docker和docker-compose的部署配置文件nginx.conf:(nginx部署工程管理)
基于nginx的部署配置文件package.json:(npm项目工程管理)
基于node和npm的项目配置文件pnpm-lock.yaml:(pnpm项目依赖版本工程管理)
基于pnpm的依赖版本管理文件pnpm-workspace.yaml:(项目工作区工程管理)
基于pnpm的monorepo管理配置文件prometheus.yml:(普罗米修斯监控工程管理)
基于三方软件Prometheus的监控配置文件README.md:(项目说明)
基于markdown的项目说明文件tsconfig.js:(ts及tsc工程管理)
基于tsc的ts工程管理配置文件或许你会奇怪为什么没有webpack
或者vite
或者其他框架的配置文件,其实是有的,只不过在packages
目录下具体的子项目里,
不过我想要说的是,不论是webpack
还是vite
,这些开发及构建工具都是基于node
的能力开发的上层框架,而你也可以不用这些,
直接用node
提供的能力来开发及构建自己的项目,当然工作中没人会这么做,因为他们提供了强大,便捷,全面的功能。
这就是你拿到的前端项目,这就是前端工程。
试想一下当你进入开发阶段了,你会干嘛?我想大多数情况下是这样的(注意:这里并不会深入的探讨每一个步骤的具体实现,而是粗略介绍):
npm install
npm run dev
cross-env API_ENV=development NODE_ENV=development webpack serve --config webpack/webpack.dev.ts
,这段命令是用cross-env定义了2个node的环境变量,并根据指定webpack目录下的配置文件,来webpack serve启动。编码
保存 -> 更新
跑测试用例
提交代码
如果你项目配置了husky,并成功安装了githook,那么会根据你配置的githook来做相应的操作,比如下图配置了2个钩子,一个是在执行git commit之前触发,一个是在git commit时触发。
分别有以下代码:
pre-commit:
commit-msg:
pre-commit的代码,会在你git commit之前触发这一段bash命令,在git commit之前会执行npx lint-staged,npx是npm的一个包运行器,我们这里用npx来执行lint-staged,会调用三方库lint-staged,它默认会先读取你的执行目录下的.lintstagedrc这种配置文件,会根据配置文件里的代码,在你的git暂存区进行相应的操作,通常来讲你的.lintstagedrc文件里面是如下代码:
{
"*.{js,jsx,ts,tsx,vue}": ["prettier --write", "eslint --fix"]
}
通常被用来做代码规范的检查,以及代码风格的转换,当然你完全可以随意做其他操作~。
commit-msg的代码,会调用三方库commitlint,它默认会根据执行目录下的commitlint.config.js之类的配置文件的具体配置,来对你的commit的message进行检查。
不难看出以上步骤,几乎都是基于node这个runtime来执行,基本上可以说是前端工程离不开node。但现在有一种用rust来构建前端工程体系的趋势,比如Bun,SWC,Rspack,Oxlint等。
Github Action
,或者是Gitlab Hook
这些,有机会再填这个坑吧。😊okk~ 关于局部且微观的前端工程化就水到这里啦~ 未完待续~