├── chapter ├── mock.md ├── technology-stack.md ├── directory.md ├── flow-spec.md └── build.md └── README.md /chapter/mock.md: -------------------------------------------------------------------------------- 1 | # 数据模拟 2 | 3 | > 这一章会在 onface 团队的新版数据模拟服务器开发完成后撰写 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 前端工程指导 2 | 3 | 本书会展示前端工程从0到100的过程,并提供实现指导。各个团队负责人根据自己团队情况进行实现。并让项目开发人员阅读本项目,便于理解并遵守工程规范。 4 | 5 | > 如果你要实现适合自己团队的前端工程,请务必详细阅读每一个章节,和每一个章节中链接到的其他页面。 6 | 7 | ## 章节 8 | 9 | 1. [文件目录](./chapter/directory.md) 10 | 2. [构建系统](./chapter/build.md) 11 | 3. [技术选型](./chapter/technology-stack.md) 12 | 4. ~[数据模拟](./chapter/mock.md)~ 13 | 5. [流程规范](./chapter/flow-spec.md) 14 | 6. ~[通用代码](./chapter/base-code.md)~ 15 | 7. ~[组件生态](./chapter/components.md)~ 16 | -------------------------------------------------------------------------------- /chapter/technology-stack.md: -------------------------------------------------------------------------------- 1 | # 技术选型 2 | 3 | 上一章:[构建系统](./build.md) 4 | 5 | --- 6 | 7 | 既然是技术选型自然要知道有哪些选项 8 | 9 | ## HTML模板引擎 10 | 11 | 你的项目会使用到 React/Vue/Angular 其中一个,则完全不需要HTML模板引擎。否则你可以选择 `ejs` `pug(jade)` `handlebars` 等模板引擎。团队负责人应根据项目情况去选择,而不是个人喜好。*了解主流模板引擎的不同点不会花很多时间,磨刀不误砍柴工。* 12 | 13 | 14 | ## CSS 预处理器 15 | 16 | 主流的有 `less` `sass` `stylus` 17 | 18 | 预处理不像HTML模板引擎那样,不同的模板引擎有很大差异。CSS 预处理器选择最契合团队环境的就可以。*作者推荐less,原因是安装快* 19 | 20 | > 不推荐 CSS in JS解决样式冲突,推荐使用 [CSS modules](http://www.ruanyifeng.com/blog/2016/06/css_modules.html) 21 | 22 | ## CSS框架 23 | 24 | 最为出名的CSS框架就是 Bootstrap,但是**项目中还是尽可能的不使用第三方CSS框架**。而是根据项目情况自主开发,或者沿用团队自主开发的框架。 25 | 26 | 比如 [Alice](http://aliceui.github.io/) 是支付宝的样式解决方案,其实它只适合直接用在支付宝。而不适合直接在自己项目中用。 27 | 28 | 如果一个项目只有[原型](http://www.woshipm.com/pd/144880.html)没有设计稿,就可以选择一个符合原型的CSS框架,减少开发工作量。 29 | 30 | **应该学习一个CSS框架的设计思想和代码分类方式,而不是复制粘贴硬生生的加到项目中** 31 | 32 | ## JS框架 33 | 34 | 这个是重头戏,前端社区不断的有人在讨论JS框架的技术选型。目前主流无非就以下几个选择 35 | 36 | `jQuery` `React` `Vue` `Angular` 37 | 38 | ### 不同框架适合不同业务场景 39 | 40 | 页面交互少,功能简单的用 jQuery 绰绰有余。 41 | 42 | 页面关联操作特别多,功能复杂的,必然要用 React/Vue/Angular。这种情况下**需要团队负责人根据项目业务场景和团队人员对框架的熟悉程度进行评估**,选择一个最可行的方案。 43 | 44 | 比如一个项目非常非常适合使用 React 开发,但是团队成员对 Angular 非常喜爱,也有了足够的积累。对 React 的了解程度只是 *单向数据流、JSX* 并且没有任何 React 方面的积累,构建系统都没搭建过。那么立即要开始的项目还是应该用 Angular 。后续再对团队成员进行引导,慢慢了解和熟悉 React。 45 | 46 | 当然有些团队很强悍,团队成员对主流框架都用的得心应手。完全可以根据项目业务场景选择最适合的框架。但是大部分的团队还是没那么强悍的。 47 | 48 | 框架没有高低之分,只有是否适合。 49 | 50 | 51 | 延伸阅读:[Vue 对比其他框架](https://cn.vuejs.org/v2/guide/comparison.html) 52 | 53 | ## ES6 和 JavaScript 超集 54 | 55 | ES6 指的是 [ECMAScript6](http://es6.ruanyifeng.com/) JavaScript 超集指的是 [CoffeeScript](http://coffee-script.org/) 和 [TypeScript](https://www.tslang.cn/) 56 | 57 | ### ES6 58 | 59 | 构建系统应当支持ES6,团队成员也必须学习ES6。因为它是标准。 60 | 61 | ### JavaScript 超集 62 | 63 | 这个也是**需要团队负责人根据项目业务场景和团队人员对框架的熟悉程度进行评估**。超集会增加团队学习成本、招聘成本和新人的培训成本,如果超集确实能提高开发效率和提高项目稳定性还是应该推行使用的。 64 | 65 | 66 | ## 字体图标平台 67 | 68 | [iconfont](http://iconfont.cn/) [fontawesome](http://fontawesome.io/) 等平台都会提供一些字体图标,建议团队使用 [iconfont](http://iconfont.cn/) 由设计师创建和维护图标项目的内容。由前端维护图标的 class 和尺寸的调整。 69 | 70 | 扩展阅读: [iconfont - Font class 是否可以提供 less 文件](https://github.com/thx/iconfont-plus/issues/390) 71 | 72 | 73 | ## 兼容性 74 | 75 | > 因为兼容性限制了技术选型所以专门提一下 76 | 77 | 技术负责人一定要**在商业需求和开发成本中达到一个平衡,服务好客户让公司赚到钱是第一位。** 78 | 79 | 这个很重要,主要决定权不在技术团队,而是在于需求方。 80 | 81 | 如果要兼容IE8只能使用 jQuery 1.x 和 React 0.14.x ,要兼容 IE6 IE7 就老老实实的用 jQuery 1.x [regularjs](http://regularjs.github.io/guide/zh/index.html) [Avalon](http://avalonjs.coding.me/home.html) 82 | 83 | 因为要兼容低版本浏览器,构建系统也需要做一些兼容处理 [support-ie8](https://github.com/onface/support-ie8) 84 | 85 | > 吐槽:要知道有些单元测试框架都不支持IE8了,写个代码不容易。 86 | -------------------------------------------------------------------------------- /chapter/directory.md: -------------------------------------------------------------------------------- 1 | ## 文件目录 2 | 3 | 项目代码可以分为两类 4 | 5 | 1. 模块代码 module 6 | 2. 视图代码 view 7 | 8 | > 注意是**视图代码**而不是*业务逻辑代码*,因为业务逻辑可以封装成模块。 9 | 10 | 当你刚入行开发一个企业站时,只需要写视图代码。比如 11 | 12 | ```js 13 | $(function () { 14 | $('.js-btn').on('click', function () { 15 | $('.js-text').toggleClass('light') 16 | }) 17 | }) 18 | ``` 19 | 随着技能的提升会将某些可复用的业务代码写成一个函数以便以重复使用。比如 20 | 21 | ```js 22 | function switchClass(element, target, className){ 23 | $(element).on('click', function () { 24 | $(target).toggleClass(className) 25 | }) 26 | } 27 | ``` 28 | 29 | > 实际工作中会对一些复杂的模块进行封装,不像 这里的 `switchClass()` 这么简单。 30 | 31 | 也会对某些CSS进行封装便于复用 32 | 33 | ```html 34 | 35 | 确认 36 | 删除 37 | ``` 38 | 39 | ```css 40 | /* btn.css */ 41 | .m-btn { 42 | border:1px solid #EEE; 43 | background-color: #fafafa; 44 | color:#333; 45 | box-sizing: border-box; 46 | } 47 | .m-btn--danger { 48 | color:pink; 49 | border-color:red; 50 | } 51 | ``` 52 | 53 | 很多项目的代码会根据文件类型的不同存放在不同的文件夹下 54 | 55 | ``` 56 | css/ 57 | - common.css # 将 btn 的样式写在 common.css 中 58 | img/ 59 | - logo.png 60 | js/ 61 | - common.js # 将 switchClass()写在 common.js 中 62 | - news.js 63 | - login.js 64 | - index.js 65 | html/ 66 | - news.html 67 | - login.html 68 | - index.html 69 | ``` 70 | 71 | 这种方式在页面越来越多时会难以维护,有时还需要在多个目录不停的切换。 72 | 73 | 为了便于检索,我们可以将模块代码和视图代码分别放在 `m` 和 `view` 文件夹下。 74 | 75 | **相关资源就近维护** 76 | 77 | ```shell 78 | m/ 79 | btn/ 80 | - loading.png 81 | - index.css 82 | - README.html # 编写 btn 的 html 示例 83 | switchClass/ 84 | - index.js 85 | - README.html # 编写 switchClass 的使用示例 86 | view/ # 调用模块代码和一些不需要封装的逻辑代码 87 | pc/ 88 | - base.js # 底层库(jQuery React Vue 等) 89 | - index.js # 公用界面代码(控制导航栏搜索展开,点击底部客服弹出窗口) — 单页应用则不需要 pc/index.js pc/index.css — 90 | - index.css # 存放 normalize.css 和少量公用样式,(不要使用 CSS Reset) 91 | login/ 92 | - index.js # 调用 m/swtich/index.js 提供的 swtich() 93 | - index.html # 引入 m/btn/index.css 和使用 确认 94 | - logo.png 95 | - index.css 96 | ``` 97 | 98 | 不命名为 `view/common` 而命名为 `view/pc` 是因为随着项目需求的变化,可能会出现 `view/mobile` 。 99 | 100 | 不只是相关资源就近维护了,还增加了 `/m/btn/README.html` 和 `/m/switch/README.html` 文件。 101 | 102 | README.html 的文件内容是: 103 | 104 | ```html 105 | 106 | 107 | 确认 108 | 删除 109 | ``` 110 | 111 | ```html 112 | 113 | 114 | Abcdef 115 | 116 | 117 | 120 | ``` 121 | 122 | 此处的两个 README.html 文件中编写当前模块的使用示例。这样其他同事想要使用这个模块时可以通过文档快速了解用哪些用法,不需要询问开发者。 123 | 124 | 继续维护这个模块时,我们会需要对已有的模块代码进行修改。不知道模块代码会被如何使用的情况下是不敢轻易修改的,但是参照着示例修改就能知道本次修改会不会影响到某一种示例。(复杂的模块最好写单元测试) 125 | 126 | **模块再小都要写示例,磨刀不误砍柴工。** 127 | 128 | ## 小结 129 | 130 | 1. 资源就近维护 131 | 2. 代码分为模块代码和视图代码 132 | 3. 模块一定要编写文档和示例 133 | 4. 使用 `/view/pc` 文件夹替代 `/common`,便于后续增加 `/view/mobile` 134 | 135 | ```shell 136 | m/ 137 | btn/ 138 | switchClass/ 139 | view 140 | pc/ 141 | - base.js 142 | - **.** 143 | login/ 144 | ``` 145 | 146 | --- 147 | 148 | 下一章:[构建](./build.md) 149 | -------------------------------------------------------------------------------- /chapter/flow-spec.md: -------------------------------------------------------------------------------- 1 | # 流程规范 2 | 3 | ## 开发规范 4 | 5 | ### 为什么需要开发规范 6 | 7 | 团队需要开发规范,每个人都按照开发规范编码便于协同开发。每一个人都是不同的个体,对于什么样的代码是优秀的代码都有自己的理解。开发规范能一定程度上**统一代码风格**,**避免写出不易于维护的代码**和提供一些**好的编程技巧**。 8 | 9 | 举个反例: 10 | 11 | 公司有四名前端,对于 class 命名他们的代码分别是 12 | 13 | ```html 14 | 15 |
173 | document.title = "js - basic a 18" 174 |175 | 178 | ``` 179 | 180 | [](https://markrun.github.io/markrun/) 181 | 182 | 利用 markrun 配合构建系统就能在 `/m/**/README.md` 中 编写一份代码,生成的html中出现 `pre` 和 `script/style/html` 183 | 184 | 单独列出 markrun 是因为提高了模块的文档编写速度开发人员就更愿意写文档,能在开发模块的同时完成简单的使用示例编写。 185 | 186 | --- 187 | 188 | 下一章:[技术选型](./technology-stack.md) 189 | --------------------------------------------------------------------------------