作者:赵雨森
链接:https://www.zhihu.com/question/24558375/answer/139920107
来源:知乎

## 模块化

简单来说,模块化就是将一个大文件拆分成相互依赖的小文件,再进行统一的拼装和加载。只有这样,才有多人协作的可能。

### JS的模块化

在ES6之前,JavaScript一直没有模块系统,这对开发大型复杂的前端工程造成了巨大的障碍。对此社区制定了一些模块加载方案,如CommonJS、AMD和CMD等,某些框架也会有自己模块系统,比如Angular1.x。

现在ES6已经在语言层面上规定了模块系统,完全可以取代现有的CommonJS和AMD规范,而且使用起来相当简洁,并且有静态加载的特性。

规范确定了,然后就是模块的打包和加载问题:
1. 用Webpack+Babel将所有模块打包成一个文件同步加载;
2. 用SystemJS+Babel分模块异步加载;
3. 将两者结合在一起。

### CSS的模块化

虽然SASS、LESS、Stylus等预处理器实现了CSS的文件拆分,但没有解决CSS模块化的一个重要问题:选择器的全局污染问题。

按道理,一个模块化的文件应该要隐藏内部作用域,只暴露少量接口给使用者。而按照目前预处理器的方式,导入一个CSS模块后,已存在的样式有被覆盖的风险。虽然重写样式是CSS的一个优势,但这并不利于多人协作。

为了避免全局选择器的冲突,各厂都制定了自己的CSS命名风格:

  • BEM风格;
  • Bootstrap风格;
  • Semantic UI风格;
  • 我们公司的NEC风格;
  • ...

但这毕竟是弱约束。选择器随着项目的增长变得越多越复杂,然后项目组里再来个新人带入自己的风格,就更加混乱了。

所以我很赞同这句话:

与其费尽心思地告诉别人要遵守某种规则,以规避某种痛苦,倒不如从工具层面就消灭这种痛苦。

从工具层面,社区又创造出Shadow DOM、CSS in JS和CSS Modules三种解决方案。

  • Shadow DOM是WebComponents的标准。它能解决全局污染问题,但目前很多浏览器不兼容,对我们来说还很久远;
  • CSS in JS是彻底抛弃CSS,使用JS或JSON来写样式。这种方法很激进,不能利用现有的CSS技术,而且处理伪类等问题比较困难;
  • CSS Modules仍然使用CSS,只是让JS来管理依赖。它能够最大化地结合CSS生态和JS模块化能力,目前来看是最好的解决方案。Vue的scoped style也属于这一种。

## 组件化

首先,组件化≠模块化。好多人对这两个概念有些混淆。

模块化只是在语言层面上,对代码的拆分;而组件化是基于模块化,在设计层面上,对UI(用户界面)的拆分。

从UI拆分下来的每个包含模板(HTML)+样式(CSS)+逻辑(JS)功能完备的结构单元,我们称之为组件。

其实,组件化更重要的是一种分治思想

Keep Simple. Everything can be a component.

这句话就是说页面上所有的东西都是组件。页面是个大型组件,可以拆成若干个中型组件,然后中型组件还可以再拆,拆成若干个小型组件,小型组件也可以再拆,直到拆成DOM元素为止。DOM元素可以看成是浏览器自身的组件,作为组件的基本单元。

传统前端框架/类库的思想是先组织DOM,然后把某些可复用的逻辑封装成组件来操作DOM,是DOM优先;而组件化框架/类库的思想是先来构思组件,然后用DOM这种基本单元结合相应逻辑来实现组件,是组件优先。这是两者本质的区别。

其次,组件化实际上是一种按照模板(HTML)+样式(CSS)+逻辑(JS)三位一体的形式对面向对象的进一步抽象

所以我们除了封装组件本身,还要合理处理组件之间的关系,比如(逻辑)继承(样式)扩展(模板)嵌套包含等,这些关系都可以归为依赖

其实组件化不是什么新鲜的东西,以前的客户端框架,像WinForm、WPF、Android等,它们从诞生的那天起就是组件化的。而前端领域发展曲折,是从展示页面为主的WebPage模式走过来的,近两年才从客户端框架经验中引入了组件化思想。其实我们很多前端工程化的问题都可以从客户端那里寻求解决方案。

目前市面上的组件化框架很多,主要的有Vue、React、Angular 2、我们公司

@郑海波

的Regular、Avalon等。你感兴趣可以都研究一下,选择一套中意的。其实Vue文档中的对比其他框架一文已经讲得很详细了。

## 规范化

模块化和组件化确定了开发模型,而这些东西的实现就需要规范去落实。
规范化其实是工程化中很重要的一个部分,项目初期规范制定的好坏会直接影响到后期的开发质量。

我能想到的有以下一些内容:

  • 目录结构的制定
  • 编码规范
  • 前后端接口规范
  • 文档规范
  • 组件管理
  • Git分支管理
  • Commit描述规范
  • 定期CodeReview
  • 视觉图标规范
  • ...

其中编码规范最好采取ESLint和StyleLint等强制措施,因为人是靠不住的,比如可以Lint通不过不能提交代码等。
前后端接口管理可以了解一下我们公司出的NEI - 接口管理平台。

## 自动化

作了这么多年程序猿的我,一直秉持的一个理念是:

任何简单机械的重复劳动都应该让机器去完成。

所以我也认为,前端工程化的很多脏活累活都应该交给自动化工具来完成。

### 图标合并

  • 不要再用PS拼雪碧图了,有Gulp+SpriteSmith;
  • 不要再用Icomoon了,这仍然是半自动的,有FontCustom。

### 持续集成
### 自动化构建
### 自动化部署
### 自动化测试

前端自动化测试能够提高代码质量、减少人肉测试等,这些优点是不言而喻的。
市面上前端测试框架有很多,选择哪个都不会有太大问题,我们用的是:
Karma + Mocha + Chai

### 构建工具

最后就是你的团队可能不只一个项目,如果每个项目都搭一套gulp+webpack+babel+...,维护成本比较高,而且不能保证统一性。

因此基于Gulp实现一套独立于项目的构建工具是最好的解决方案。

可以参考一下网易蜂巢的构建工具rainfore/pursuit-cli,开发者只要会用pursuit dev和pursuit online两句命令就行。

转载于:https://www.cnblogs.com/vidahaha/p/6949992.html

转载--web前端工程化相关推荐

  1. [上海线下活动] Web前端工程化架构实践 -- 沪江技术沙龙

    报名链接:www.huodongxing.com/event/53996- Web前端工程化历经了:2011年的Shell&(YUICompress || Google Closure Com ...

  2. 转载 web前端进阶四阶段

    前端工程的四个阶段 转载自:http://www.cnblogs.com/lanlanlan00/p/7155663.html 写在前面:引用别人的,在我看来说得比较浅显易懂的. 现在的前端开发倒也并 ...

  3. 前端工程化开发之yeoman、bower、grunt

    前端框架来说有React.Vue.Angular等,再配以webpack.gulp.Browserify.fis等构建工具去满足日常的开发工作 http://www.cnblogs.com/luozh ...

  4. 前端工程化-基于Taro的Web端Monorepo架构改造

    前端工程化-Genebox小程序端Monorepo架构改造中介绍了在使用Taro框架下,结合yarn workspace + lerna 来改造Monorepo架构的方式和流程,这篇文章与本篇文章内容 ...

  5. 前端工程化实践总结 | QQ音乐商业化Web团队

    蓝字关注,回复"加群"加入前端技术群 与大家一起成长 | 导语本文主要介绍在前端工程化的一些探索和实践,结合移动端的基础库重构和UI组件库开发这两个项目详细介绍工程化方案 . 随着 ...

  6. 转载《美团点评金融平台Web前端技术体系》

    复制代码 作者:禹霖 原文地址: tech.meituan.com/2018/03/16/- 背景 随着美团点评金融业务的高速发展,前端研发数量从 2015 年的 1 个人,扩张到了现在横跨北上两地 ...

  7. Java、Python、Go 哪个后端编程语言适合web前端工程师学习?

    不知道作为web前端工程师的大家有没有相似的经历:很多时候我们想深入学习node,立志向web全栈方向发展,但是却十分遗憾的发现很多node教程基本都是helloworld级别的.如果真想搞后端开发, ...

  8. 什么叫Web前端?web前端HTML5学习方法分享

    web前端开发主要是通过html,css,js,ajax,DOM等前端技术,实现网站在客服端的正确显示及交互功能.在众多的前端开发技术中,JavaScript击败了Applet.ActionScrip ...

  9. 前端工程化系列好文摘要

    前端工程化遇到的好文在这里简要摘记一下核心要点和主要概念,这里核心是指针对本人而言不代表原文核心阐述,方便快速查阅,详细解释还是要看原文 对于前端工程化我自己还没形成知识体系,先简单罗列知识点,如果哪 ...

最新文章

  1. 一种快速统计SQL Server每个表行数的方法
  2. linux高编线程-------线程的创建,终止
  3. java有没有回调函数_Java中的回调函数 - wangjianme的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. 程序猿修仙之路--数据结构之你是否真的懂数组?
  5. Dirichlet Process和Hierarchical Dirichlet Process的理解(PPT)
  6. 微服务启动顺序_微服务框架Demo.MicroServer运行手册
  7. 基于数据库数据增量同步_基于 Flink SQL CDC 的实时数据同步方案
  8. javascript 请求web service
  9. linux中Python3 引入CV2报错
  10. Unity3D AssetBundle相关
  11. 【操作系统】结合哲学家进餐问题分析如何预防死锁
  12. 高考自主招生招生基本问题,你需要吗?
  13. 最全互联网Linux工作规划!
  14. 新用户域名实名认证教程---金万维
  15. Linux 系统时间 EST 改 CTS
  16. Android高手笔记 - IO优化
  17. 2021域名过期会引发哪些问题?说说常见弊端
  18. C/C++编程学习 - 第16周 ① 含k个3的数
  19. 基于OpenCV制作道路车辆计数应用程序
  20. xp QQ2009无法卸载

热门文章

  1. 删除表格数据后自动刷新_Calliope: 表格数据的自动故事生成系统
  2. java kafka 分区_Kafka 主题和分区
  3. react native 开发笔记(二)
  4. 【一步教学,一步到位】mysql高可用架构
  5. 【深度学习】人脸识别和口罩检测的应用
  6. 【响应式Web前端设计】new Option()函数的作用(三区联动)
  7. adsl服务器客户端配置cisco_基于ISE对Cisco网络设备部署AAA
  8. 若依 v4.6.1 后台 排除log4j
  9. 网络营销外包下不同类型企业网站有着不同的网络营销外包重点
  10. window.print 固定表头不影响_Excel中的表头,你会处理吗