写在前面

记得当时刷笔试题的时候有了解过“前端工程化”,无非就是用自动化工具帮助开发人员完成一些小细节,提高工作效率之类的,不过当时可没想到可维护性这么远

构建项目 -> 模块化开发 -> 复用 -> 测试 -> 调试 -> 验证 -> 发布 -> 版本控制,这整个流程的很多环节都可以用自动化工具解放人力,提高项目的可维护性

一.自动化的优缺点

js开发中使用自动构建系统的优缺点如下:

1.优点

  • 自动源码控制能够区分清楚用于调试的代码和将来发布的代码,开发阶段不必估计影响线上产品

  • 静态代码分析能自动完成(JSLint、JSHint)

  • 发布前可以进行多种方式的加工(合并文件、压缩代码)

  • 自动化测试,能很快发现错误

  • 很容易重做一次重复性的工作(比如再次合并文件、压缩代码)

2.缺点

  • 有些开发人员用不习惯,因为改动代码之后要重新构建一次,而不是传统的保存文件,刷新页面

  • 部署到线上的产品代码与开发阶段的代码不同,难以追踪bug

  • 经验不足的开发人员可能不会用这种自动构建系统

二.文件目录结构

一般不同的项目需要不同的目录结构,但下面给出的几条原则是广泛适用的:

  1. 一个对象对应一个文件

    避免多名开发人员修改冲突,文件越少,冲突的概率越大,一个对象对应一个文件能最小化这种风险

  2. 把相关文件用文件夹分组

    这样管理代码更容易根据功能定位对应代码

  3. 分离第三方代码

    最好用CDN引入第三方库,这样就不用对第三方代码进行多余的源码控制了

  4. 分离构建产物

    应该把构建的产物放在另一个文件夹里,不要进行源码控制,避免无意中反复构建带来的时耗

  5. 把测试代码放近点

    要把测试代码放在很容易找到的地方,比如和源码放在一起,或者test/目录下与源码路径相似的位置

三.自动化的步骤

1.使用自动构建工具

  • Ant:基于Java的

  • Buildy:基于NodeJS的

  • Gmake:UNIX粉喜欢的

  • Jammit:基于Ruby的

  • Jasy:基于Pathon的

  • Rake:基于Ruby的

  • Sprockets:基于Rack的

2.使用自动代码检查工具

  • JSLint:道格拉斯做的好工具

  • JSHint:和上面的差不多,但配置选项更多

3.使用自动合并/加工文件的工具

合并文件,插入版本号什么的,用第一步用的自动构建工具就能搞定

4.使用代码瘦身/压缩工具

瘦身和压缩的区别是瘦身是针对代码语法的优化,让源码更短;而压缩就是把纯文本的源码文件变成别的更小的文件,压缩后不能再编辑,除非先解压

瘦身工具比较多,作者推荐了几个:

  • YUI Compressor:Yahoo!的,基于Java,能缩短变量名、去掉空白字符、去掉注释,还能给CSS瘦身

  • Closure Complier:Google的,基于Java,能进行深层次优化(去掉不用的方法,把只用一次的方法扔进闭包),比YUI的瘦身效果更好

  • UglifyJS:基于NodeJS,还能合并var语句

5.使用文档自动生成工具

  • JSDoc:基于java的

  • YUI Doc:用js写的

  • 其它:Docco、Dojo Documentation Tools、JoDoc、Natural Docs、NDoc、PDoc

6.使用自动测试工具

  • YUI Test Selenium Driver:(作者总是喜欢把Yahoo!的东西排前面,好员工哇)YUI的单元测试框架

  • Yeti:利用各个浏览器进行js测试

  • PhantomJS:提供WebKit浏览器环境,可以配合QUnit和Jasmine

  • JsTestDriver:Google的单元测试框架,支持自动浏览器测试

  • Jasmine:行为驱动的js测试框架

  • QUnit:JQuery的单元测试框架

  • Selenium:功能测试框架,支持浏览器测试

7.把所有自动化工具整合起来

应该至少构建3个版本:

  • 开发版

    要求是尽量快,否则影响开发人员火力全开

    具体任务是:清理文件 -> 初始化构建环境 -> 检查代码 -> 合并文件

    注意:不要把自动测试环节放进来,因为费时间,开发版构建要求尽量快

  • 集成版

    用来排查错误,应该每隔一段时间运行一次检查并报告错误

    具体任务是:代码瘦身 -> 测试 -> 文档生成

    注意:文档生成环节是可选的,因为加进来可能会影响错误检查(错误可能来自文档生成环节)

  • 发布版

    要保证0错误,稳定可靠的产品

    具体任务是:加工文件(添上版本、版权信息等等)

    注意:可以考虑把部署等发布任务加进来,也可以选择把集成结果直接加工后部署,但要保证集成结果没问题

8.使用CI系统

CI(Continuous Integration)系统是用来增强对集成版的错误排查的,持续集成可以每隔一段时间自动运行并检查代码报告错误,甚至联系错误相关的具体开发人员

参考资料

  • 《Maintainable JavaScript》

后话

到这里整本书就结束了,这本书是淘宝UED博客推荐的,还算不错,也没有特别晦涩难懂的英文句子。

200页的书断断续续看了近3个星期,不算太慢,当然,在这期间还看完了《JavaScript语言精粹》、《The Book of CSS3》,学了SASS入门,写了10篇博文

JS自动化的更多相关文章

  1. css+js自动化开发之第十五天

    一.css上一篇的补充 1.position(页面分层) (1)fiexd将标签固定在页面的某个位置 position属性:top,left,right,bottom (2)relative+abso ...

  2. Node.js自动化技术实现(Java)

    Node.js自动化测试框架(NodeTestFramework):

  3. 从统计局采集最新的省市区镇数据,用js在浏览器中运行 V2

    本文描述的是对国家统计局于2019-01-31发布的<2018年统计用区划代码和城乡划分代码(截止2018年10月31日)>的采集. 相对于用于和采集2016版.2017版的js代码做了比 ...

  4. 15 个有趣的 JS 和 CSS 库

    开发者们,一起来看看有木有你需要的前端库. 1. DisplayJS DisplayJS 是一个帮助你渲染 DOM 的简易框架.使用它,你可以更容易地将 JS 变量遍历到特定的 HTML 元素中,类似 ...

  5. 从零搭建docker+jenkins 自动化部署环境

    从零搭建docker+jenkins+node.js自动化部署环境 本次案例基于CentOS 7系统 适合有一定docker使用经验的人阅读 适合有一定linux命令使用经验的人阅读 1.docker ...

  6. 【nodejs原理&源码赏析(9)】用node-ssh实现轻量级自动化部署

    目录 一. 需求描述 二. 预备知识 IP+端口访问 域名访问 三. Nodejs应用的手动部署 四. 基于nodejs的自动部署 4.1 package.json中的scripts 4.2 自动化发 ...

  7. 【nodejs原理&源码赏析(9)】用node-ssh实现轻量级自动化部署

    [摘要] node脚本实现轻量级自动化部署 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 需求描述 前端工程出包后实现简易的自动化部署. 二. ...

  8. fis-plus 学习笔记

    学习了一些fls-plus前端集成的东西:学的很皮毛,很多都是对官网的解释希望与大家分享,并能得到大家的指正. 参考文档:http://oak.baidu.com/fis-plus/document. ...

  9. [转] 从零构建 vue2 + vue-router + vuex 开发环境到入门,实现基本的登录退出功能

    这是一个创建于 738 天前的主题,其中的信息可能已经有所发展或是发生改变. 前言 vue2 正式版已经发布将近一个月了, 国庆过后就用在了公司的两个正式项目上, 还有一个项目下个月也会采用 vue2 ...

随机推荐

  1. Binder的设计和框架

    转自:http://wangkuiwu.github.io/2014/09/01/Binder-Introduce/ 1. Binder架构解析 1.1 Binder模型 上图中涉及到Binder模型 ...

  2. MySQL_杭州北仓 12.3-12.7需求活动期间累计下单达到3天及以上的客户_20161212

    #C025_02杭州北仓 12.3-12.7需求活动期间累计下单达到3天及以上的客户明细 SELECT d.*,CASE WHEN 下单天次>=3 THEN "下单超过3天" ...

  3. 移动端WEB开发,click,touch,tap事件浅析

    一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap 分 ...

  4. linux C学习笔记05--信号量与共享内存(进程同步)

    花了半天时间把信号量与共享内存整合到了一起,先来看信号量代码,semaphore.c 当中sem_P()和sem_V()函数分别为信号量等待和信号量释放. 两个进程同时访问共享内存,为了避免发生同时读 ...

  5. JS出现illegal character非法字符提示

    引用js文件,js文件内的汉字在页面显示乱码 解决方式: a. 保持js文件编码与jsp页面编码格式一致: b. 在引入js文件时,在script中添加charset=""属性,指 ...

  6. Linux内核分析第六周学习总结:进程的描述和进程的创建

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 ...

  7. HttpClient请求发送的几种用法:

    /// <summary> /// HttpClient实现Post请求 /// </summary> static async void dooPost() { string ...

  8. JDBC学习

    JDBC全称 Java DataBase Connectivity(java数据库连接)可以为多种数据库提供统一的访问: 步骤:1:加载驱动程序: 加载Mysql驱动:Class.forName(&q ...

  9. swift 定制自己的Button样式

    swift的UIButton类中有些公开方法可以重写,所以,如果想写出自己的UIButton,只要继承UIButton类,并重写相应的方法即可. 系统的UIButton可以添加图片,也可以添加标题,但 ...

  10. Java关键字:transient,strictfp和volatile简介

    关键字:transient 使用对象:字段 介绍:transient说明一个属性是临时的,不会被序列化. 当对象进行序列化(Serializable)过程时候,有一些属性的状态是瞬时的,这样的对象是无 ...