提到前端往往很多人的映像就是入门简单,HTML、CSS加一起一个星期基本上就能大概上手,JS难一点但也能很快写一些简单的小效果,在网上随便一搜索各种特效代码随意用,一个新手前端也能在很短的时间里写出炫酷的页面效果,然而入门简单并不意味着前端这碗饭很好吃,做惯了切图、布局、扣特效的前端新同学在向前发展的路上越来越觉得吃力,而没有任何编程思想和软件开发基础很多人对前端工程化、组件化、模块化、MVC这些“高大上”的词汇云里雾里。
本文用最简单的语言介绍一下我对工程化、组件化、模块化的理解,面向的对象是前端新手,所以我用最好理解的方式去说。
还记得我在最早期写前端代码时,往往一个页面就是一个文件搞定,HTML/CSS/JS全部写在一起,后来知道应该把结构、样式和动作分离,我想这是我接触到最早的前端工程化的思想了,所谓前端工程化我认为就是:
将前端项目当成一项系统工程进行分析、组织和构建从而达到项目结构清晰、分工明确、团队配合默契、开发效率提高的目的
前面我说接触最早的工程化思维就是“结构、样式和动作分离”,在只有若干个页面的小型项目我们只需要用这些简单的做法就能把项目很好的组织起来,但是在一个大型web项目中往往有更加复杂的结构和非常多的页面需要很多人甚至是多个团队配合才能把项目做完,我们需要有更加严谨和复杂的工程化思维去组织结构。从更高层面的项目组织来看我们要做项目的各种规范、技术选型、项目构建优化等等,在代码层面我们还需要用到JS/CSS模块机、UI组件化等开发方式。
前面我们提到在组织代码的时候会用到模块化和组件化,大家应该理解到,前端工程化是一个高层次的思想,而模块化和组件化是为工程化思想下相对较具体的开发方式,因此可以简单的认为模块化和组件化是工程化的表现形式。
那具体什么是模块化呢,还是举简单的例子,我们要写一个实现A功能的JS代码,这个功能在项目其他位置也需要用到,那么我们就可以把这个功能看成一个模块采用一定的方式进行模块化编写,既能实现复用还可以分而治之,同理在写样式的时候,如果我们需要某种特殊的样式,会在很多地方应用,那么我们也可以采用一定的方式进行CSS的模块化,具体说来,JS模块化方案很多有AMD/CommonJS/UMD/ES6 Module等,CSS模块化开发大多是在less、sass、stylus等预处理器的import/mixin特性支持下实现的,具体技术大家自行学习。
总体而言,模块化不难理解,重点是要学习相关的技术并且灵活运用。
前文中我们提到过,组件化也是工程化的表现形式,那么到底什么是前端组件化呢
页面上的每个独立的、可视/可交互区域视为一个组件;
每个组件对应一个工程目录,组件所需的各种资源都在这个目录下就近维护;
由于组件具有独立性,因此组件与组件之间可以 自由组合;
页面只不过是组件的容器,负责组合组件形成功能完整的界面;
当不需要某个组件,或者想要替换组件时,可以整个目录删除/替换。
组件化将页面视为一个容器,页面上各个独立部分例如:头部、导航、焦点图、侧边栏、底部等视为独立组件,不同的页面根据内容的需要,去盛放相关组件即可组成完整的页面。
PS:模块化和组件化一个最直接的好处就是复用,同时我们也应该有一个理念,模块化和组件化除了复用之外还有就是分治,我们能够在不影响其他代码的情况下按需修改某一独立的模块或是组件,因此很多地方我们及时没有很强烈的复用需要也可以根据分治需求进行模块化或组件化开发。
前端工程化是为了让前端可以自成体系,具体可以从四方面去讨论,模块化,组件化,规范化和自动化。
将大的文件拆分成互相依赖的小文件,再进行统一的拼装和加载。
js的模块化: 利用webpack+babel的模式将所有模块系统进行打包,同步加载,也可以搭乘多个chunk异步加载。利用浏览器的script标签,type类型选modules类型即可。
css模块化: 之前的sass less 等预处理器虽然实现了css的拆分,但是并没有解决模块化很重要的一个问题,即选择器的全局污染问题。有三种解决办法,第一种是利用webcomponents的技术实现,这个技术虽然解决了全局污染问题,但是由于兼容性问题,目前用的不多,第二种是css in js 将css的技术全部摒弃,利用js或者json格式去加载css,这种方式简单粗暴,并且不容易处理伪类选择器的问题,被大众所认可的是第三种解决方案,即 css modules ,所有的css文件由js来管理,这种技术最大程度利用了css的生态和模块化的原则,其中vue中的scoped 就是这种技术的提现。
资源的模块化: webpack的成功不仅仅是因为将js系统进行模块化处理,而是它的模块化原理,即任何资源都可以模块化且应该模块化处理,优点有以下三点,1:目录结构清晰化,2:资源处理集成化,3:项目依赖单一化。
是将UI页面拆分成有模板+样式+逻辑组成的功能单元,称为组件,组件化不等于模块化,模块化是在资源和代码方面对文件的拆分,而组件化是在UI层面进行的拆分。
传统前端框架的思想是以dom优先,先操作dom,再写出可复用的逻辑单元来操作dom,而组件化框架是组件优先,将dom和与之一起的逻辑组成一个组件,再进行引用。
我们封装了组件后,还需要对组件间的关系进行判定,例如继承,扩展,嵌套,包含等,这些关系统称为依赖。
规范化是前端工程化很重要的一部分,项目前期规范制定的好坏,直接决定后期的开发质量,分为项目目录规范化,编码规范化,前后端接口规范化,git分支管理,commit描述规范,组件管理等编码规范化分为html css js img
命名规范这几类接口规范,目的是规则先行,以减少联调中不必要的问题和麻烦,划分前端,渲染逻辑和交互逻辑,后台,处理业务逻辑,各种格式的规定,例如 json尽量简洁轻量,日期尽量字符串,等等。
让简单重复的工作交给机器完成,例如自动化测试,自动化部署,自动化构建,持续继承等。
网址: https://www.jianshu.com/p/88ed70476adb